From 63fbcc5fc8163156e745ed58149be252d4a5ce23 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:50:24 +0200 Subject: [PATCH 001/199] WebHost: custom proc title for Generator and MultiHoster (#4310) * WebHost: custom proctitle for Generator and MultiHoster * Update setproctitle to 1.3.5 --- WebHostLib/autolauncher.py | 17 +++++++++++++++-- WebHostLib/customserver.py | 3 +++ WebHostLib/requirements.txt | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/WebHostLib/autolauncher.py b/WebHostLib/autolauncher.py index 8ba093e014..b330146277 100644 --- a/WebHostLib/autolauncher.py +++ b/WebHostLib/autolauncher.py @@ -9,7 +9,7 @@ from threading import Event, Thread from typing import Any from uuid import UUID -from pony.orm import db_session, select, commit +from pony.orm import db_session, select, commit, PrimaryKey from Utils import restricted_loads from .locker import Locker, AlreadyRunningException @@ -36,12 +36,21 @@ def handle_generation_failure(result: BaseException): logging.exception(e) +def _mp_gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, sid=None) -> PrimaryKey | None: + from setproctitle import setproctitle + + setproctitle(f"Generator ({sid})") + res = gen_game(gen_options, meta=meta, owner=owner, sid=sid) + setproctitle(f"Generator (idle)") + return res + + def launch_generator(pool: multiprocessing.pool.Pool, generation: Generation): try: meta = json.loads(generation.meta) options = restricted_loads(generation.options) logging.info(f"Generating {generation.id} for {len(options)} players") - pool.apply_async(gen_game, (options,), + pool.apply_async(_mp_gen_game, (options,), {"meta": meta, "sid": generation.id, "owner": generation.owner}, @@ -55,6 +64,10 @@ def launch_generator(pool: multiprocessing.pool.Pool, generation: Generation): def init_generator(config: dict[str, Any]) -> None: + from setproctitle import setproctitle + + setproctitle("Generator (idle)") + try: import resource except ModuleNotFoundError: diff --git a/WebHostLib/customserver.py b/WebHostLib/customserver.py index 301a386834..2ebb40d673 100644 --- a/WebHostLib/customserver.py +++ b/WebHostLib/customserver.py @@ -227,6 +227,9 @@ def set_up_logging(room_id) -> logging.Logger: def run_server_process(name: str, ponyconfig: dict, static_server_data: dict, cert_file: typing.Optional[str], cert_key_file: typing.Optional[str], host: str, rooms_to_run: multiprocessing.Queue, rooms_shutting_down: multiprocessing.Queue): + from setproctitle import setproctitle + + setproctitle(name) Utils.init_logging(name) try: import resource diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt index 190409d9a2..a9cd33dd6d 100644 --- a/WebHostLib/requirements.txt +++ b/WebHostLib/requirements.txt @@ -9,3 +9,4 @@ bokeh>=3.6.3 markupsafe>=3.0.2 Markdown>=3.7 mdx-breakless-lists>=1.0.1 +setproctitle>=1.3.5 From 8c794995737b17b2ed94f2fc088d4c8c2e36f997 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 6 Apr 2025 17:00:14 +0200 Subject: [PATCH 002/199] SoE: remove use of deprecated Utils.get_options() (#4821) --- worlds/soe/patch.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/soe/patch.py b/worlds/soe/patch.py index a322de2af6..fba71b7bd3 100644 --- a/worlds/soe/patch.py +++ b/worlds/soe/patch.py @@ -4,7 +4,6 @@ from typing import BinaryIO, Optional import Utils from worlds.Files import APDeltaPatch - USHASH = '6e9c94511d04fac6e0a1e582c170be3a' @@ -20,9 +19,9 @@ class SoEDeltaPatch(APDeltaPatch): def get_base_rom_path(file_name: Optional[str] = None) -> str: - options = Utils.get_options() if not file_name: - file_name = options["soe_options"]["rom_file"] + from . import SoEWorld + file_name = SoEWorld.settings.rom_file if not file_name: raise ValueError("Missing soe_options -> rom_file from host.yaml") if not os.path.exists(file_name): From ac26f8be8bf75cab5ff9282c8c7174cdea7b755f Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 6 Apr 2025 13:44:33 -0400 Subject: [PATCH 003/199] Lingo: Mark some items as ProgUseful (#4822) --- worlds/lingo/items.py | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/worlds/lingo/items.py b/worlds/lingo/items.py index 7e75cc76c7..b773caeb4e 100644 --- a/worlds/lingo/items.py +++ b/worlds/lingo/items.py @@ -34,12 +34,34 @@ ITEMS_BY_GROUP: Dict[str, List[str]] = {} TRAP_ITEMS: List[str] = ["Slowness Trap", "Iceland Trap", "Atbash Trap"] +PROGUSEFUL_ITEMS: List[str] = [ + "Crossroads - Roof Access", + "Black", + "Red", + "Blue", + "Yellow", + "Purple", + "Sunwarps", + "Tenacious Entrance Panels", + "The Tenacious - Black Palindromes (Panels)", + "Hub Room - RAT (Panel)", + "Outside The Wanderer - WANDERLUST (Panel)", + "Orange Tower Panels" +] + + +def get_prog_item_classification(item_name: str): + if item_name in PROGUSEFUL_ITEMS: + return ItemClassification.progression | ItemClassification.useful + else: + return ItemClassification.progression + def load_item_data(): global ALL_ITEM_TABLE, ITEMS_BY_GROUP for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]: - ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), ItemClassification.progression, + ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), get_prog_item_classification(color), ItemType.COLOR, False, []) ITEMS_BY_GROUP.setdefault("Colors", []).append(color) @@ -53,16 +75,16 @@ def load_item_data(): door_groups.add(door.door_group) ALL_ITEM_TABLE[door.item_name] = \ - ItemData(get_door_item_id(room_name, door_name), ItemClassification.progression, ItemType.NORMAL, - door.has_doors, door.painting_ids) + ItemData(get_door_item_id(room_name, door_name), get_prog_item_classification(door.item_name), + ItemType.NORMAL, door.has_doors, door.painting_ids) ITEMS_BY_GROUP.setdefault("Doors", []).append(door.item_name) if door.item_group is not None: ITEMS_BY_GROUP.setdefault(door.item_group, []).append(door.item_name) for group in door_groups: - ALL_ITEM_TABLE[group] = ItemData(get_door_group_item_id(group), - ItemClassification.progression, ItemType.NORMAL, True, []) + ALL_ITEM_TABLE[group] = ItemData(get_door_group_item_id(group), get_prog_item_classification(group), + ItemType.NORMAL, True, []) ITEMS_BY_GROUP.setdefault("Doors", []).append(group) panel_groups: Set[str] = set() @@ -72,11 +94,12 @@ def load_item_data(): panel_groups.add(panel_door.panel_group) ALL_ITEM_TABLE[panel_door.item_name] = ItemData(get_panel_door_item_id(room_name, panel_door_name), - ItemClassification.progression, ItemType.NORMAL, False, []) + get_prog_item_classification(panel_door.item_name), + ItemType.NORMAL, False, []) ITEMS_BY_GROUP.setdefault("Panels", []).append(panel_door.item_name) for group in panel_groups: - ALL_ITEM_TABLE[group] = ItemData(get_panel_group_item_id(group), ItemClassification.progression, + ALL_ITEM_TABLE[group] = ItemData(get_panel_group_item_id(group), get_prog_item_classification(group), ItemType.NORMAL, False, []) ITEMS_BY_GROUP.setdefault("Panels", []).append(group) @@ -101,7 +124,7 @@ def load_item_data(): for item_name in PROGRESSIVE_ITEMS: ALL_ITEM_TABLE[item_name] = ItemData(get_progressive_item_id(item_name), - ItemClassification.progression, ItemType.NORMAL, False, []) + get_prog_item_classification(item_name), ItemType.NORMAL, False, []) # Initialize the item data at module scope. From dc4e8bae9839e3ab486b7f0522631a508e876edd Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:11:16 -0500 Subject: [PATCH 004/199] Core: post-KivyMD cleanup (#4815) * Removed now unused imports from Launcher * Moved ImageIcon and ImageButton to use ApAsyncImage for compatibility with apworlds * Adjusted image size in the Launcher from 40x40 to 48x48. This is already larger than the size in previous versions, and a docs update is soon to follow. * Expose `dynamic_scheme_contrast` to user.kv, allowing users to set high contrast. * ScrollBox's default scroll_type was set to only content, so the scrollbar in Launcher was nonfunctional. * Adjusted the spacing of the title of a component when a description is present to be closer to the center. * Launcher now scrolls to the top automatically when changing between filters --- Launcher.py | 13 +++++++------ data/client.kv | 2 ++ data/launcher.kv | 4 ++-- kvui.py | 6 +++--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Launcher.py b/Launcher.py index 609c109470..d636ceab74 100644 --- a/Launcher.py +++ b/Launcher.py @@ -8,9 +8,7 @@ Archipelago Launcher Scroll down to components= to add components to the launcher as well as setup.py """ -import os import argparse -import itertools import logging import multiprocessing import shlex @@ -132,7 +130,7 @@ def handle_uri(path: str, launch_args: Tuple[str, ...]) -> None: from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogContentContainer, MDDialogSupportingText from kivymd.uix.divider import MDDivider - if client_component is None: + if not client_component: run_component(text_client_component, *launch_args) return else: @@ -228,14 +226,13 @@ refresh_components: Optional[Callable[[], None]] = None def run_gui(path: str, args: Any) -> None: - from kvui import (ThemedApp, MDFloatLayout, MDGridLayout, MDButton, MDLabel, MDButtonText, ScrollBox, ApAsyncImage) + from kvui import (ThemedApp, MDFloatLayout, MDGridLayout, ScrollBox) from kivy.properties import ObjectProperty from kivy.core.window import Window from kivy.metrics import dp from kivymd.uix.button import MDIconButton from kivymd.uix.card import MDCard from kivymd.uix.menu import MDDropdownMenu - from kivymd.uix.relativelayout import MDRelativeLayout from kivymd.uix.snackbar import MDSnackbar, MDSnackbarText from kivy.lang.builder import Builder @@ -250,7 +247,6 @@ def run_gui(path: str, args: Any) -> None: self.image = image_path super().__init__(args, kwargs) - class Launcher(ThemedApp): base_title: str = "Archipelago Launcher" top_screen: MDFloatLayout = ObjectProperty(None) @@ -337,6 +333,11 @@ def run_gui(path: str, args: Any) -> None: for card in cards: self.button_layout.layout.add_widget(card) + top = self.button_layout.children[0].y + self.button_layout.children[0].height \ + - self.button_layout.height + scroll_percent = self.button_layout.convert_distance_to_scroll(0, top) + self.button_layout.scroll_y = max(0, min(1, scroll_percent[1])) + def filter_clients(self, caller): self._refresh_components(caller.type) diff --git a/data/client.kv b/data/client.kv index 0974258d6c..ac0a45023c 100644 --- a/data/client.kv +++ b/data/client.kv @@ -18,6 +18,7 @@ theme_style: "Dark" # Light/Dark primary_palette: "Green" # Many options dynamic_scheme_name: "TONAL_SPOT" + dynamic_scheme_contrast: 0.0 : color: self.theme_cls.primaryColor : @@ -184,6 +185,7 @@ bar_width: "12dp" scroll_wheel_distance: 40 do_scroll_x: False + scroll_type: ['bars', 'content'] MDBoxLayout: id: layout diff --git a/data/launcher.kv b/data/launcher.kv index 0e569d7ea9..03e1c3e078 100644 --- a/data/launcher.kv +++ b/data/launcher.kv @@ -9,13 +9,13 @@ MDRelativeLayout: ApAsyncImage: source: main.image - size: (40, 40) + size: (48, 48) size_hint_y: None pos_hint: {"center_x": 0.1, "center_y": 0.5} MDLabel: text: main.component.display_name - pos_hint:{"center_x": 0.5, "center_y": 0.85 if main.component.description else 0.65} + pos_hint:{"center_x": 0.5, "center_y": 0.75 if main.component.description else 0.65} halign: "center" font_style: "Title" role: "medium" diff --git a/kvui.py b/kvui.py index b12cbec716..3837ab08c2 100644 --- a/kvui.py +++ b/kvui.py @@ -93,13 +93,13 @@ class ThemedApp(MDApp): self.theme_cls.theme_style = getattr(text_colors, "theme_style", "Dark") self.theme_cls.primary_palette = getattr(text_colors, "primary_palette", "Green") self.theme_cls.dynamic_scheme_name = getattr(text_colors, "dynamic_scheme_name", "TONAL_SPOT") - self.theme_cls.dynamic_scheme_contrast = 0.0 + self.theme_cls.dynamic_scheme_contrast = getattr(text_colors, "dynamic_scheme_contrast", 0.0) class ImageIcon(MDButtonIcon, AsyncImage): def __init__(self, *args, **kwargs): super().__init__(args, kwargs) - self.image = AsyncImage(**kwargs) + self.image = ApAsyncImage(**kwargs) self.add_widget(self.image) def add_widget(self, widget, index=0, canvas=None): @@ -114,7 +114,7 @@ class ImageButton(MDIconButton): if val != "None": image_args[kwarg.replace("image_", "")] = val super().__init__() - self.image = AsyncImage(**image_args) + self.image = ApAsyncImage(**image_args) def set_center(button, center): self.image.center_x = self.center_x From f03bb61747bb8378f3b8ec68389f4c515dddaae4 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 6 Apr 2025 18:02:34 -0400 Subject: [PATCH 005/199] Lingo: Add "shuffle_postgame" flag to slot data (#4825) This allows the tracker to see whether postgame is shuffled in the player's world, and if it's not, allows it to hide locations/paintings accordingly. --- worlds/lingo/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/lingo/__init__.py b/worlds/lingo/__init__.py index 141fca0743..05509a394b 100644 --- a/worlds/lingo/__init__.py +++ b/worlds/lingo/__init__.py @@ -174,7 +174,7 @@ class LingoWorld(World): "death_link", "victory_condition", "shuffle_colors", "shuffle_doors", "shuffle_paintings", "shuffle_panels", "enable_pilgrimage", "sunwarp_access", "mastery_achievements", "level_2_requirement", "location_checks", "early_color_hallways", "pilgrimage_allows_roof_access", "pilgrimage_allows_paintings", "shuffle_sunwarps", - "group_doors", "speed_boost_mode" + "group_doors", "speed_boost_mode", "shuffle_postgame" ] slot_data = { From f94492b2d35b39573e49dc7134a2167cf01cd4af Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Mon, 7 Apr 2025 00:39:25 +0200 Subject: [PATCH 006/199] CI: ignore F824 (#4790) This is an added check in flake8 that does not really fit the goal of the github action and currently throws a lot of errors. --- .github/workflows/analyze-modified-files.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/analyze-modified-files.yml b/.github/workflows/analyze-modified-files.yml index b59336fafe..6788abd30a 100644 --- a/.github/workflows/analyze-modified-files.yml +++ b/.github/workflows/analyze-modified-files.yml @@ -65,7 +65,7 @@ jobs: continue-on-error: false if: env.diff != '' && matrix.task == 'flake8' run: | - flake8 --count --select=E9,F63,F7,F82 --show-source --statistics ${{ env.diff }} + flake8 --count --select=E9,F63,F7,F82 --ignore F824 --show-source --statistics ${{ env.diff }} - name: "flake8: Lint modified files" continue-on-error: true From 60d6078e1fbe73aa6251a9b89a1b09d4c3148b38 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:17:25 +0200 Subject: [PATCH 007/199] Wind Waker: Don't collect nonprogression #4826 --- worlds/tww/randomizers/Dungeons.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/tww/randomizers/Dungeons.py b/worlds/tww/randomizers/Dungeons.py index 3a009f78f7..f1dc0d6c97 100644 --- a/worlds/tww/randomizers/Dungeons.py +++ b/worlds/tww/randomizers/Dungeons.py @@ -254,7 +254,7 @@ def fill_dungeons_restrictive(multiworld: MultiWorld) -> None: in_dungeon_player_ids = {item.player for item in in_dungeon_items} all_state_base = CollectionState(multiworld) for item in multiworld.itempool: - multiworld.worlds[item.player].collect(all_state_base, item) + all_state_base.collect(item, prevent_sweep=True) pre_fill_items = [] for player in in_dungeon_player_ids: pre_fill_items += multiworld.worlds[player].get_pre_fill_items() @@ -265,7 +265,7 @@ def fill_dungeons_restrictive(multiworld: MultiWorld) -> None: # `pre_fill_items` should be a subset of `in_dungeon_items`, but just in case. pass for item in pre_fill_items: - multiworld.worlds[item.player].collect(all_state_base, item) + all_state_base.collect(item, prevent_sweep=True) all_state_base.sweep_for_advancements() # Remove the completion condition so that minimal-accessibility words place keys correctly. From ab2efc0c5c6e4916dcb60fe4b5857b5eb3bad28e Mon Sep 17 00:00:00 2001 From: Emily <35015090+EmilyV99@users.noreply.github.com> Date: Tue, 8 Apr 2025 12:06:19 -0400 Subject: [PATCH 008/199] kvui: actually fix [u] and [/u] appearing in copied hints (#4842) --- kvui.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kvui.py b/kvui.py index 3837ab08c2..81e3876fe5 100644 --- a/kvui.py +++ b/kvui.py @@ -589,8 +589,7 @@ class HintLabel(RecycleDataViewBehavior, MDBoxLayout): if self.entrance_text != "Vanilla" else "", ". (", self.status_text.lower(), ")")) temp = MarkupLabel(text).markup - text = "".join( - part for part in temp if not part.startswith(("[color", "[/color]", "[ref=", "[/ref]"))) + text = "".join(part for part in temp if not part.startswith("[")) Clipboard.copy(escape_markup(text).replace("&", "&").replace("&bl;", "[").replace("&br;", "]")) return self.parent.select_with_touch(self.index, touch) else: From 286e24629faede058f287c072c34dad709f59d8b Mon Sep 17 00:00:00 2001 From: CookieCat <81494827+CookieCat45@users.noreply.github.com> Date: Tue, 8 Apr 2025 12:26:30 -0400 Subject: [PATCH 009/199] AHIT: Add start_inventory_from_pool and get_filler_item_name (#4798) * Update __init__.py * Update Options.py --- worlds/ahit/Options.py | 4 +++- worlds/ahit/__init__.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/worlds/ahit/Options.py b/worlds/ahit/Options.py index b331ca5242..ab6ba46f19 100644 --- a/worlds/ahit/Options.py +++ b/worlds/ahit/Options.py @@ -2,7 +2,7 @@ from typing import List, TYPE_CHECKING, Dict, Any from schema import Schema, Optional from dataclasses import dataclass from worlds.AutoWorld import PerGameCommonOptions -from Options import Range, Toggle, DeathLink, Choice, OptionDict, DefaultOnToggle, OptionGroup +from Options import Range, Toggle, DeathLink, Choice, OptionDict, DefaultOnToggle, OptionGroup, StartInventoryPool if TYPE_CHECKING: from . import HatInTimeWorld @@ -625,6 +625,8 @@ class ParadeTrapWeight(Range): @dataclass class AHITOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool + EndGoal: EndGoal ActRandomizer: ActRandomizer ActPlando: ActPlando diff --git a/worlds/ahit/__init__.py b/worlds/ahit/__init__.py index c2fe39872f..16b54064c6 100644 --- a/worlds/ahit/__init__.py +++ b/worlds/ahit/__init__.py @@ -1,6 +1,6 @@ from BaseClasses import Item, ItemClassification, Tutorial, Location, MultiWorld from .Items import item_table, create_item, relic_groups, act_contracts, create_itempool, get_shop_trap_name, \ - calculate_yarn_costs, alps_hooks + calculate_yarn_costs, alps_hooks, junk_weights from .Regions import create_regions, randomize_act_entrances, chapter_act_info, create_events, get_shuffled_region from .Locations import location_table, contract_locations, is_location_valid, get_location_names, TASKSANITY_START_ID, \ get_total_locations @@ -78,6 +78,9 @@ class HatInTimeWorld(World): self.nyakuza_thug_items: Dict[str, int] = {} self.badge_seller_count: int = 0 + def get_filler_item_name(self) -> str: + return self.random.choices(list(junk_weights.keys()), weights=junk_weights.values(), k=1)[0] + def generate_early(self): adjust_options(self) From 9ac921380f2e1d79e4595181a2ac14aa7057d3bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Tue, 8 Apr 2025 12:37:45 -0400 Subject: [PATCH 010/199] Stardew Valley: Refactor buildings to use content packs (#4239) * create building data object and rename ItemSource to Source to be more generic # Conflicts: # worlds/stardew_valley/content/game_content.py # Conflicts: # worlds/stardew_valley/data/artisan.py # worlds/stardew_valley/data/game_item.py # worlds/stardew_valley/data/harvest.py # worlds/stardew_valley/data/shop.py * remove compound sources, replace by other requirements which already handle this usecase * add coops to content packs * add building progression in game features * add shippping bin to starting building; remove has_house * replace config check with feature * add other buildings in content packs * not passing * tests passes, unbelievable * use newly create methods more * use new assets to ease readability * self review * fix flake8 maybe * properly split rule for mapping cave systems * fix tractor garage name * self review * add upgrade_from to farm house buldings * don't override building name variable in logic * remove has_group from buildings * mark some items easy in grinding logic so blueprints buildings can be in more early spheres * move stuff around to maybe avoid future conflicts cuz I have like 10 PRs opened right now * remove price_multiplier, turns out it's unused during generation * disable shop source for mapping cave systems * bunch of code review changes * add petbowl and farmhouse to autobuilding * set min easy items to 300 * fix farm type --- worlds/stardew_valley/__init__.py | 15 +- worlds/stardew_valley/content/__init__.py | 30 ++- .../content/feature/__init__.py | 1 + .../content/feature/building_progression.py | 53 +++++ worlds/stardew_valley/content/game_content.py | 24 +- worlds/stardew_valley/content/mods/tractor.py | 18 ++ worlds/stardew_valley/content/unpacking.py | 8 +- .../content/vanilla/pelican_town.py | 213 +++++++++++++++++- worlds/stardew_valley/data/artisan.py | 4 +- worlds/stardew_valley/data/building.py | 16 ++ worlds/stardew_valley/data/game_item.py | 17 +- worlds/stardew_valley/data/harvest.py | 16 +- worlds/stardew_valley/data/items.csv | 1 + worlds/stardew_valley/data/requirement.py | 5 + worlds/stardew_valley/data/shop.py | 12 +- worlds/stardew_valley/early_items.py | 4 +- worlds/stardew_valley/items.py | 34 +-- worlds/stardew_valley/locations.py | 20 +- worlds/stardew_valley/logic/base_logic.py | 1 - worlds/stardew_valley/logic/building_logic.py | 112 +++------ worlds/stardew_valley/logic/cooking_logic.py | 3 +- worlds/stardew_valley/logic/goal_logic.py | 2 +- worlds/stardew_valley/logic/grind_logic.py | 37 ++- worlds/stardew_valley/logic/logic.py | 5 +- worlds/stardew_valley/logic/money_logic.py | 8 +- .../logic/relationship_logic.py | 6 +- .../stardew_valley/logic/requirement_logic.py | 11 +- worlds/stardew_valley/logic/source_logic.py | 14 +- .../mods/logic/buildings_logic.py | 28 --- worlds/stardew_valley/mods/logic/mod_logic.py | 3 +- worlds/stardew_valley/rules.py | 22 +- .../stardew_valley/strings/building_names.py | 2 + worlds/stardew_valley/test/TestBooksanity.py | 16 +- worlds/stardew_valley/test/TestCrops.py | 20 +- worlds/stardew_valley/test/TestFarmType.py | 40 +++- worlds/stardew_valley/test/TestGeneration.py | 59 ++--- worlds/stardew_valley/test/TestLogic.py | 4 +- worlds/stardew_valley/test/TestOptionFlags.py | 18 +- .../stardew_valley/test/TestWalnutsanity.py | 9 +- worlds/stardew_valley/test/__init__.py | 35 ++- .../stardew_valley/test/content/__init__.py | 2 + .../test/long/TestOptionsLong.py | 9 +- worlds/stardew_valley/test/mods/TestMods.py | 31 +-- worlds/stardew_valley/test/options/presets.py | 4 + .../stardew_valley/test/rules/TestArcades.py | 12 +- worlds/stardew_valley/test/rules/TestBooks.py | 13 +- .../test/rules/TestBuildings.py | 32 +-- .../stardew_valley/test/rules/TestBundles.py | 23 +- .../test/rules/TestCookingRecipes.py | 25 +- .../test/rules/TestCraftingRecipes.py | 32 ++- .../test/rules/TestDonations.py | 12 +- .../stardew_valley/test/rules/TestFishing.py | 7 +- .../test/rules/TestFriendship.py | 8 +- .../stardew_valley/test/rules/TestShipping.py | 6 +- .../stardew_valley/test/rules/TestSkills.py | 14 +- worlds/stardew_valley/test/rules/TestTools.py | 41 ++-- 56 files changed, 757 insertions(+), 460 deletions(-) create mode 100644 worlds/stardew_valley/content/feature/building_progression.py create mode 100644 worlds/stardew_valley/data/building.py delete mode 100644 worlds/stardew_valley/mods/logic/buildings_logic.py diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 83a1c11c18..bf900742b9 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -145,7 +145,7 @@ class StardewValleyWorld(World): def create_items(self): self.precollect_starting_season() - self.precollect_farm_type_items() + self.precollect_building_items() items_to_exclude = [excluded_items for excluded_items in self.multiworld.precollected_items[self.player] if not item_table[excluded_items.name].has_any_group(Group.RESOURCE_PACK, @@ -200,9 +200,16 @@ class StardewValleyWorld(World): starting_season = self.create_item(self.random.choice(season_pool)) self.multiworld.push_precollected(starting_season) - def precollect_farm_type_items(self): - if self.options.farm_type == FarmType.option_meadowlands and self.options.building_progression & BuildingProgression.option_progressive: - self.multiworld.push_precollected(self.create_item("Progressive Coop")) + def precollect_building_items(self): + building_progression = self.content.features.building_progression + # Not adding items when building are vanilla because the buildings are already placed in the world. + if not building_progression.is_progressive: + return + + for building in building_progression.starting_buildings: + item, quantity = building_progression.to_progressive_item(building) + for _ in range(quantity): + self.multiworld.push_precollected(self.create_item(item)) def setup_logic_events(self): def register_event(name: str, region: str, rule: StardewRule): diff --git a/worlds/stardew_valley/content/__init__.py b/worlds/stardew_valley/content/__init__.py index 5308506437..33608531d9 100644 --- a/worlds/stardew_valley/content/__init__.py +++ b/worlds/stardew_valley/content/__init__.py @@ -1,8 +1,9 @@ from . import content_packs -from .feature import cropsanity, friendsanity, fishsanity, booksanity, skill_progression, tool_progression +from .feature import cropsanity, friendsanity, fishsanity, booksanity, building_progression, skill_progression, tool_progression from .game_content import ContentPack, StardewContent, StardewFeatures from .unpacking import unpack_content from .. import options +from ..strings.building_names import Building def create_content(player_options: options.StardewValleyOptions) -> StardewContent: @@ -29,6 +30,7 @@ def choose_content_packs(player_options: options.StardewValleyOptions): def choose_features(player_options: options.StardewValleyOptions) -> StardewFeatures: return StardewFeatures( choose_booksanity(player_options.booksanity), + choose_building_progression(player_options.building_progression, player_options.farm_type), choose_cropsanity(player_options.cropsanity), choose_fishsanity(player_options.fishsanity), choose_friendsanity(player_options.friendsanity, player_options.friendsanity_heart_size), @@ -109,6 +111,32 @@ def choose_friendsanity(friendsanity_option: options.Friendsanity, heart_size: o raise ValueError(f"No friendsanity feature mapped to {str(friendsanity_option.value)}") +def choose_building_progression(building_option: options.BuildingProgression, + farm_type_option: options.FarmType) -> building_progression.BuildingProgressionFeature: + starting_buildings = {Building.farm_house, Building.pet_bowl, Building.shipping_bin} + + if farm_type_option == options.FarmType.option_meadowlands: + starting_buildings.add(Building.coop) + + if (building_option == options.BuildingProgression.option_vanilla + or building_option == options.BuildingProgression.option_vanilla_cheap + or building_option == options.BuildingProgression.option_vanilla_very_cheap): + return building_progression.BuildingProgressionVanilla( + starting_buildings=starting_buildings, + ) + + starting_buildings.remove(Building.shipping_bin) + + if (building_option == options.BuildingProgression.option_progressive + or building_option == options.BuildingProgression.option_progressive_cheap + or building_option == options.BuildingProgression.option_progressive_very_cheap): + return building_progression.BuildingProgressionProgressive( + starting_buildings=starting_buildings, + ) + + raise ValueError(f"No building progression feature mapped to {str(building_option.value)}") + + skill_progression_by_option = { options.SkillProgression.option_vanilla: skill_progression.SkillProgressionVanilla(), options.SkillProgression.option_progressive: skill_progression.SkillProgressionProgressive(), diff --git a/worlds/stardew_valley/content/feature/__init__.py b/worlds/stardew_valley/content/feature/__init__.py index eb23f8105b..b2a88286c6 100644 --- a/worlds/stardew_valley/content/feature/__init__.py +++ b/worlds/stardew_valley/content/feature/__init__.py @@ -1,4 +1,5 @@ from . import booksanity +from . import building_progression from . import cropsanity from . import fishsanity from . import friendsanity diff --git a/worlds/stardew_valley/content/feature/building_progression.py b/worlds/stardew_valley/content/feature/building_progression.py new file mode 100644 index 0000000000..0d317aa018 --- /dev/null +++ b/worlds/stardew_valley/content/feature/building_progression.py @@ -0,0 +1,53 @@ +from abc import ABC +from dataclasses import dataclass +from typing import ClassVar, Set, Tuple + +from ...strings.building_names import Building + +progressive_house = "Progressive House" + +# This assumes that the farm house is always available, which might not be true forever... +progressive_house_by_upgrade_name = { + Building.farm_house: 0, + Building.kitchen: 1, + Building.kids_room: 2, + Building.cellar: 3 +} + + +def to_progressive_item(building: str) -> Tuple[str, int]: + """Return the name of the progressive item and its quantity required to unlock the building. + """ + if building in [Building.coop, Building.barn, Building.shed]: + return f"Progressive {building}", 1 + elif building.startswith("Big"): + return f"Progressive {building[building.index(' ') + 1:]}", 2 + elif building.startswith("Deluxe"): + return f"Progressive {building[building.index(' ') + 1:]}", 3 + elif building in progressive_house_by_upgrade_name: + return progressive_house, progressive_house_by_upgrade_name[building] + + return building, 1 + + +def to_location_name(building: str) -> str: + return f"{building} Blueprint" + + +@dataclass(frozen=True) +class BuildingProgressionFeature(ABC): + is_progressive: ClassVar[bool] + starting_buildings: Set[str] + + to_progressive_item = staticmethod(to_progressive_item) + progressive_house = progressive_house + + to_location_name = staticmethod(to_location_name) + + +class BuildingProgressionVanilla(BuildingProgressionFeature): + is_progressive = False + + +class BuildingProgressionProgressive(BuildingProgressionFeature): + is_progressive = True diff --git a/worlds/stardew_valley/content/game_content.py b/worlds/stardew_valley/content/game_content.py index 3aa3350f47..8a72a4811d 100644 --- a/worlds/stardew_valley/content/game_content.py +++ b/worlds/stardew_valley/content/game_content.py @@ -3,9 +3,10 @@ from __future__ import annotations from dataclasses import dataclass, field from typing import Dict, Iterable, Set, Any, Mapping, Type, Tuple, Union -from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression, tool_progression +from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression, building_progression, tool_progression +from ..data.building import Building from ..data.fish_data import FishItem -from ..data.game_item import GameItem, ItemSource, ItemTag +from ..data.game_item import GameItem, Source, ItemTag from ..data.skill import Skill from ..data.villagers_data import Villager @@ -20,16 +21,17 @@ class StardewContent: game_items: Dict[str, GameItem] = field(default_factory=dict) fishes: Dict[str, FishItem] = field(default_factory=dict) villagers: Dict[str, Villager] = field(default_factory=dict) + farm_buildings: Dict[str, Building] = field(default_factory=dict) skills: Dict[str, Skill] = field(default_factory=dict) quests: Dict[str, Any] = field(default_factory=dict) - def find_sources_of_type(self, types: Union[Type[ItemSource], Tuple[Type[ItemSource]]]) -> Iterable[ItemSource]: + def find_sources_of_type(self, types: Union[Type[Source], Tuple[Type[Source]]]) -> Iterable[Source]: for item in self.game_items.values(): for source in item.sources: if isinstance(source, types): yield source - def source_item(self, item_name: str, *sources: ItemSource): + def source_item(self, item_name: str, *sources: Source): item = self.game_items.setdefault(item_name, GameItem(item_name)) item.add_sources(sources) @@ -50,6 +52,7 @@ class StardewContent: @dataclass(frozen=True) class StardewFeatures: booksanity: booksanity.BooksanityFeature + building_progression: building_progression.BuildingProgressionFeature cropsanity: cropsanity.CropsanityFeature fishsanity: fishsanity.FishsanityFeature friendsanity: friendsanity.FriendsanityFeature @@ -70,13 +73,13 @@ class ContentPack: # def item_hook # ... - harvest_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) + harvest_sources: Mapping[str, Iterable[Source]] = field(default_factory=dict) """Harvest sources contains both crops and forageables, but also fruits from trees, the cave farm and stuff harvested from tapping like maple syrup.""" def harvest_source_hook(self, content: StardewContent): ... - shop_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) + shop_sources: Mapping[str, Iterable[Source]] = field(default_factory=dict) def shop_source_hook(self, content: StardewContent): ... @@ -86,12 +89,12 @@ class ContentPack: def fish_hook(self, content: StardewContent): ... - crafting_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) + crafting_sources: Mapping[str, Iterable[Source]] = field(default_factory=dict) def crafting_hook(self, content: StardewContent): ... - artisan_good_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) + artisan_good_sources: Mapping[str, Iterable[Source]] = field(default_factory=dict) def artisan_good_hook(self, content: StardewContent): ... @@ -101,6 +104,11 @@ class ContentPack: def villager_hook(self, content: StardewContent): ... + farm_buildings: Iterable[Building] = () + + def farm_building_hook(self, content: StardewContent): + ... + skills: Iterable[Skill] = () def skill_hook(self, content: StardewContent): diff --git a/worlds/stardew_valley/content/mods/tractor.py b/worlds/stardew_valley/content/mods/tractor.py index 8f14300179..a672bc2bf9 100644 --- a/worlds/stardew_valley/content/mods/tractor.py +++ b/worlds/stardew_valley/content/mods/tractor.py @@ -1,7 +1,25 @@ from ..game_content import ContentPack from ..mod_registry import register_mod_content_pack +from ...data.building import Building +from ...data.shop import ShopSource from ...mods.mod_data import ModNames +from ...strings.artisan_good_names import ArtisanGood +from ...strings.building_names import ModBuilding +from ...strings.metal_names import MetalBar +from ...strings.region_names import Region register_mod_content_pack(ContentPack( ModNames.tractor, + farm_buildings=( + Building( + ModBuilding.tractor_garage, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=150_000, + items_price=((20, MetalBar.iron), (5, MetalBar.iridium), (1, ArtisanGood.battery_pack)), + ), + ), + ), + ), )) diff --git a/worlds/stardew_valley/content/unpacking.py b/worlds/stardew_valley/content/unpacking.py index 3c57f91afe..2d50f7718b 100644 --- a/worlds/stardew_valley/content/unpacking.py +++ b/worlds/stardew_valley/content/unpacking.py @@ -5,7 +5,7 @@ from typing import Iterable, Mapping, Callable from .game_content import StardewContent, ContentPack, StardewFeatures from .vanilla.base import base_game as base_game_content_pack -from ..data.game_item import GameItem, ItemSource +from ..data.game_item import GameItem, Source def unpack_content(features: StardewFeatures, packs: Iterable[ContentPack]) -> StardewContent: @@ -61,6 +61,10 @@ def register_pack(content: StardewContent, pack: ContentPack): content.villagers[villager.name] = villager pack.villager_hook(content) + for building in pack.farm_buildings: + content.farm_buildings[building.name] = building + pack.farm_building_hook(content) + for skill in pack.skills: content.skills[skill.name] = skill pack.skill_hook(content) @@ -73,7 +77,7 @@ def register_pack(content: StardewContent, pack: ContentPack): def register_sources_and_call_hook(content: StardewContent, - sources_by_item_name: Mapping[str, Iterable[ItemSource]], + sources_by_item_name: Mapping[str, Iterable[Source]], hook: Callable[[StardewContent], None]): for item_name, sources in sources_by_item_name.items(): item = content.game_items.setdefault(item_name, GameItem(item_name)) diff --git a/worlds/stardew_valley/content/vanilla/pelican_town.py b/worlds/stardew_valley/content/vanilla/pelican_town.py index 913fe4b8ad..aeae4c1431 100644 --- a/worlds/stardew_valley/content/vanilla/pelican_town.py +++ b/worlds/stardew_valley/content/vanilla/pelican_town.py @@ -1,10 +1,13 @@ from ..game_content import ContentPack from ...data import villagers_data, fish_data -from ...data.game_item import GenericSource, ItemTag, Tag, CustomRuleSource, CompoundSource +from ...data.building import Building +from ...data.game_item import GenericSource, ItemTag, Tag, CustomRuleSource from ...data.harvest import ForagingSource, SeasonalForagingSource, ArtifactSpotSource from ...data.requirement import ToolRequirement, BookRequirement, SkillRequirement from ...data.shop import ShopSource, MysteryBoxSource, ArtifactTroveSource, PrizeMachineSource, FishingTreasureChestSource +from ...strings.artisan_good_names import ArtisanGood from ...strings.book_names import Book +from ...strings.building_names import Building as BuildingNames from ...strings.crop_names import Fruit from ...strings.fish_names import WaterItem from ...strings.food_names import Beverage, Meal @@ -12,6 +15,7 @@ from ...strings.forageable_names import Forageable, Mushroom from ...strings.fruit_tree_names import Sapling from ...strings.generic_names import Generic from ...strings.material_names import Material +from ...strings.metal_names import MetalBar from ...strings.region_names import Region, LogicRegion from ...strings.season_names import Season from ...strings.seed_names import Seed, TreeSeed @@ -229,10 +233,10 @@ pelican_town = ContentPack( ShopSource(money_price=20000, shop_region=LogicRegion.bookseller_3),), Book.mapping_cave_systems: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), - CompoundSource(sources=( - GenericSource(regions=(Region.adventurer_guild_bedroom,)), - ShopSource(money_price=20000, shop_region=LogicRegion.bookseller_3), - ))), + GenericSource(regions=(Region.adventurer_guild_bedroom,)), + # Disabling the shop source for better game design. + # ShopSource(money_price=20000, shop_region=LogicRegion.bookseller_3), + ), Book.monster_compendium: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), CustomRuleSource(create_rule=lambda logic: logic.monster.can_kill_many(Generic.any)), @@ -385,5 +389,204 @@ pelican_town = ContentPack( villagers_data.vincent, villagers_data.willy, villagers_data.wizard, + ), + farm_buildings=( + Building( + BuildingNames.barn, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=6000, + items_price=((350, Material.wood), (150, Material.stone)) + ), + ), + ), + Building( + BuildingNames.big_barn, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=12_000, + items_price=((450, Material.wood), (200, Material.stone)) + ), + ), + upgrade_from=BuildingNames.barn, + ), + Building( + BuildingNames.deluxe_barn, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=25_000, + items_price=((550, Material.wood), (300, Material.stone)) + ), + ), + upgrade_from=BuildingNames.big_barn, + ), + Building( + BuildingNames.coop, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=4000, + items_price=((300, Material.wood), (100, Material.stone)) + ), + ), + ), + Building( + BuildingNames.big_coop, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=10_000, + items_price=((400, Material.wood), (150, Material.stone)) + ), + ), + upgrade_from=BuildingNames.coop, + ), + Building( + BuildingNames.deluxe_coop, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=20_000, + items_price=((500, Material.wood), (200, Material.stone)) + ), + ), + upgrade_from=BuildingNames.big_coop, + ), + Building( + BuildingNames.fish_pond, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=5000, + items_price=((200, Material.stone), (5, WaterItem.seaweed), (5, WaterItem.green_algae)) + ), + ), + ), + Building( + BuildingNames.mill, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=2500, + items_price=((50, Material.stone), (150, Material.wood), (4, ArtisanGood.cloth)) + ), + ), + ), + Building( + BuildingNames.shed, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=15_000, + items_price=((300, Material.wood),) + ), + ), + ), + Building( + BuildingNames.big_shed, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=20_000, + items_price=((550, Material.wood), (300, Material.stone)) + ), + ), + upgrade_from=BuildingNames.shed, + ), + Building( + BuildingNames.silo, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=100, + items_price=((100, Material.stone), (10, Material.clay), (5, MetalBar.copper)) + ), + ), + ), + Building( + BuildingNames.slime_hutch, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=10_000, + items_price=((500, Material.stone), (10, MetalBar.quartz), (1, MetalBar.iridium)) + ), + ), + ), + Building( + BuildingNames.stable, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=10_000, + items_price=((100, Material.hardwood), (5, MetalBar.iron)) + ), + ), + ), + Building( + BuildingNames.well, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=1000, + items_price=((75, Material.stone),) + ), + ), + ), + Building( + BuildingNames.shipping_bin, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=250, + items_price=((150, Material.wood),) + ), + ), + ), + Building( + BuildingNames.pet_bowl, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=5000, + items_price=((25, Material.hardwood),) + ), + ), + ), + Building( + BuildingNames.kitchen, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=10_000, + items_price=((450, Material.wood),) + ), + ), + upgrade_from=BuildingNames.farm_house, + ), + Building( + BuildingNames.kids_room, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=65_000, + items_price=((100, Material.hardwood),) + ), + ), + upgrade_from=BuildingNames.kitchen, + ), + Building( + BuildingNames.cellar, + sources=( + ShopSource( + shop_region=Region.carpenter, + money_price=100_000, + ), + ), + upgrade_from=BuildingNames.kids_room, + ), ) ) diff --git a/worlds/stardew_valley/data/artisan.py b/worlds/stardew_valley/data/artisan.py index 90be5b1684..a4a722c797 100644 --- a/worlds/stardew_valley/data/artisan.py +++ b/worlds/stardew_valley/data/artisan.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from .game_item import ItemSource +from .game_item import Source @dataclass(frozen=True, kw_only=True) -class MachineSource(ItemSource): +class MachineSource(Source): item: str # this should be optional (worm bin) machine: str # seasons diff --git a/worlds/stardew_valley/data/building.py b/worlds/stardew_valley/data/building.py new file mode 100644 index 0000000000..a3adf77c58 --- /dev/null +++ b/worlds/stardew_valley/data/building.py @@ -0,0 +1,16 @@ +from dataclasses import dataclass, field +from functools import cached_property +from typing import Optional, Tuple + +from .game_item import Source + + +@dataclass(frozen=True) +class Building: + name: str + sources: Tuple[Source, ...] = field(kw_only=True) + upgrade_from: Optional[str] = field(default=None, kw_only=True) + + @cached_property + def is_upgrade(self) -> bool: + return self.upgrade_from is not None diff --git a/worlds/stardew_valley/data/game_item.py b/worlds/stardew_valley/data/game_item.py index c6e4717cd1..6c23f59f2b 100644 --- a/worlds/stardew_valley/data/game_item.py +++ b/worlds/stardew_valley/data/game_item.py @@ -27,7 +27,7 @@ class ItemTag(enum.Enum): @dataclass(frozen=True) -class ItemSource(ABC): +class Source(ABC): add_tags: ClassVar[Tuple[ItemTag]] = () other_requirements: Tuple[Requirement, ...] = field(kw_only=True, default_factory=tuple) @@ -38,23 +38,18 @@ class ItemSource(ABC): @dataclass(frozen=True, kw_only=True) -class GenericSource(ItemSource): +class GenericSource(Source): regions: Tuple[str, ...] = () """No region means it's available everywhere.""" @dataclass(frozen=True) -class CustomRuleSource(ItemSource): +class CustomRuleSource(Source): """Hopefully once everything is migrated to sources, we won't need these custom logic anymore.""" create_rule: Callable[[Any], StardewRule] -@dataclass(frozen=True, kw_only=True) -class CompoundSource(ItemSource): - sources: Tuple[ItemSource, ...] = () - - -class Tag(ItemSource): +class Tag(Source): """Not a real source, just a way to add tags to an item. Will be removed from the item sources during unpacking.""" tag: Tuple[ItemTag, ...] @@ -69,10 +64,10 @@ class Tag(ItemSource): @dataclass(frozen=True) class GameItem: name: str - sources: List[ItemSource] = field(default_factory=list) + sources: List[Source] = field(default_factory=list) tags: Set[ItemTag] = field(default_factory=set) - def add_sources(self, sources: Iterable[ItemSource]): + def add_sources(self, sources: Iterable[Source]): self.sources.extend(source for source in sources if type(source) is not Tag) for source in sources: self.add_tags(source.add_tags) diff --git a/worlds/stardew_valley/data/harvest.py b/worlds/stardew_valley/data/harvest.py index 0fdae95495..621288ec4b 100644 --- a/worlds/stardew_valley/data/harvest.py +++ b/worlds/stardew_valley/data/harvest.py @@ -1,18 +1,18 @@ from dataclasses import dataclass from typing import Tuple, Sequence, Mapping -from .game_item import ItemSource, ItemTag +from .game_item import Source, ItemTag from ..strings.season_names import Season @dataclass(frozen=True, kw_only=True) -class ForagingSource(ItemSource): +class ForagingSource(Source): regions: Tuple[str, ...] seasons: Tuple[str, ...] = Season.all @dataclass(frozen=True, kw_only=True) -class SeasonalForagingSource(ItemSource): +class SeasonalForagingSource(Source): season: str days: Sequence[int] regions: Tuple[str, ...] @@ -22,17 +22,17 @@ class SeasonalForagingSource(ItemSource): @dataclass(frozen=True, kw_only=True) -class FruitBatsSource(ItemSource): +class FruitBatsSource(Source): ... @dataclass(frozen=True, kw_only=True) -class MushroomCaveSource(ItemSource): +class MushroomCaveSource(Source): ... @dataclass(frozen=True, kw_only=True) -class HarvestFruitTreeSource(ItemSource): +class HarvestFruitTreeSource(Source): add_tags = (ItemTag.CROPSANITY,) sapling: str @@ -46,7 +46,7 @@ class HarvestFruitTreeSource(ItemSource): @dataclass(frozen=True, kw_only=True) -class HarvestCropSource(ItemSource): +class HarvestCropSource(Source): add_tags = (ItemTag.CROPSANITY,) seed: str @@ -61,5 +61,5 @@ class HarvestCropSource(ItemSource): @dataclass(frozen=True, kw_only=True) -class ArtifactSpotSource(ItemSource): +class ArtifactSpotSource(Source): amount: int diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index 36e048100c..44e16c5d50 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -509,6 +509,7 @@ id,name,classification,groups,mod_name 561,Fishing Bar Size Bonus,filler,PLAYER_BUFF, 562,Quality Bonus,filler,PLAYER_BUFF, 563,Glow Bonus,filler,PLAYER_BUFF, +564,Pet Bowl,progression,BUILDING, 4001,Burnt Trap,trap,TRAP, 4002,Darkness Trap,trap,TRAP, 4003,Frozen Trap,trap,TRAP, diff --git a/worlds/stardew_valley/data/requirement.py b/worlds/stardew_valley/data/requirement.py index b2416d8d0b..d335527a39 100644 --- a/worlds/stardew_valley/data/requirement.py +++ b/worlds/stardew_valley/data/requirement.py @@ -21,6 +21,11 @@ class SkillRequirement(Requirement): level: int +@dataclass(frozen=True) +class RegionRequirement(Requirement): + region: str + + @dataclass(frozen=True) class SeasonRequirement(Requirement): season: str diff --git a/worlds/stardew_valley/data/shop.py b/worlds/stardew_valley/data/shop.py index cc9506023f..3700ee8978 100644 --- a/worlds/stardew_valley/data/shop.py +++ b/worlds/stardew_valley/data/shop.py @@ -1,14 +1,14 @@ from dataclasses import dataclass from typing import Tuple, Optional -from .game_item import ItemSource +from .game_item import Source from ..strings.season_names import Season ItemPrice = Tuple[int, str] @dataclass(frozen=True, kw_only=True) -class ShopSource(ItemSource): +class ShopSource(Source): shop_region: str money_price: Optional[int] = None items_price: Optional[Tuple[ItemPrice, ...]] = None @@ -20,20 +20,20 @@ class ShopSource(ItemSource): @dataclass(frozen=True, kw_only=True) -class MysteryBoxSource(ItemSource): +class MysteryBoxSource(Source): amount: int @dataclass(frozen=True, kw_only=True) -class ArtifactTroveSource(ItemSource): +class ArtifactTroveSource(Source): amount: int @dataclass(frozen=True, kw_only=True) -class PrizeMachineSource(ItemSource): +class PrizeMachineSource(Source): amount: int @dataclass(frozen=True, kw_only=True) -class FishingTreasureChestSource(ItemSource): +class FishingTreasureChestSource(Source): amount: int diff --git a/worlds/stardew_valley/early_items.py b/worlds/stardew_valley/early_items.py index 1457c5c7c5..550a92b445 100644 --- a/worlds/stardew_valley/early_items.py +++ b/worlds/stardew_valley/early_items.py @@ -23,9 +23,9 @@ def setup_early_items(multiworld, options: stardew_options.StardewValleyOptions, add_seasonal_candidates(early_candidates, options) - if options.building_progression & stardew_options.BuildingProgression.option_progressive: + if content.features.building_progression.is_progressive: early_forced.append(Building.shipping_bin) - if options.farm_type != stardew_options.FarmType.option_meadowlands: + if Building.coop not in content.features.building_progression.starting_buildings: early_candidates.append("Progressive Coop") early_candidates.append("Progressive Barn") diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index dcb37a8f41..b4b1175c1d 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -15,7 +15,7 @@ from .data.game_item import ItemTag from .logic.logic_event import all_events from .mods.mod_data import ModNames from .options import StardewValleyOptions, TrapItems, FestivalLocations, ExcludeGingerIsland, SpecialOrderLocations, SeasonRandomization, Museumsanity, \ - BuildingProgression, ElevatorProgression, BackpackProgression, ArcadeMachineLocations, Monstersanity, Goal, \ + ElevatorProgression, BackpackProgression, ArcadeMachineLocations, Monstersanity, Goal, \ Chefsanity, Craftsanity, BundleRandomization, EntranceRandomization, Shipsanity, Walnutsanity, EnabledFillerBuffs from .strings.ap_names.ap_option_names import BuffOptionName, WalnutsanityOptionName from .strings.ap_names.ap_weapon_names import APWeapon @@ -225,7 +225,7 @@ def create_unique_items(item_factory: StardewItemFactory, options: StardewValley create_tools(item_factory, content, items) create_skills(item_factory, content, items) create_wizard_buildings(item_factory, options, items) - create_carpenter_buildings(item_factory, options, items) + create_carpenter_buildings(item_factory, content, items) items.append(item_factory("Railroad Boulder Removed")) items.append(item_factory(CommunityUpgrade.fruit_bats)) items.append(item_factory(CommunityUpgrade.mushroom_boxes)) @@ -353,30 +353,14 @@ def create_wizard_buildings(item_factory: StardewItemFactory, options: StardewVa items.append(item_factory("Woods Obelisk")) -def create_carpenter_buildings(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): - building_option = options.building_progression - if not building_option & BuildingProgression.option_progressive: +def create_carpenter_buildings(item_factory: StardewItemFactory, content: StardewContent, items: List[Item]): + building_progression = content.features.building_progression + if not building_progression.is_progressive: return - items.append(item_factory("Progressive Coop")) - items.append(item_factory("Progressive Coop")) - items.append(item_factory("Progressive Coop")) - items.append(item_factory("Progressive Barn")) - items.append(item_factory("Progressive Barn")) - items.append(item_factory("Progressive Barn")) - items.append(item_factory("Well")) - items.append(item_factory("Silo")) - items.append(item_factory("Mill")) - items.append(item_factory("Progressive Shed")) - items.append(item_factory("Progressive Shed", ItemClassification.useful)) - items.append(item_factory("Fish Pond")) - items.append(item_factory("Stable")) - items.append(item_factory("Slime Hutch")) - items.append(item_factory("Shipping Bin")) - items.append(item_factory("Progressive House")) - items.append(item_factory("Progressive House")) - items.append(item_factory("Progressive House")) - if ModNames.tractor in options.mods: - items.append(item_factory("Tractor Garage")) + + for building in content.farm_buildings.values(): + item_name, _ = building_progression.to_progressive_item(building.name) + items.append(item_factory(item_name)) def create_quest_rewards(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): diff --git a/worlds/stardew_valley/locations.py b/worlds/stardew_valley/locations.py index c7d787e55d..0d621fda49 100644 --- a/worlds/stardew_valley/locations.py +++ b/worlds/stardew_valley/locations.py @@ -11,7 +11,7 @@ from .data.game_item import ItemTag from .data.museum_data import all_museum_items from .mods.mod_data import ModNames from .options import ExcludeGingerIsland, ArcadeMachineLocations, SpecialOrderLocations, Museumsanity, \ - FestivalLocations, BuildingProgression, ElevatorProgression, BackpackProgression, FarmType + FestivalLocations, ElevatorProgression, BackpackProgression, FarmType from .options import StardewValleyOptions, Craftsanity, Chefsanity, Cooksanity, Shipsanity, Monstersanity from .strings.goal_names import Goal from .strings.quest_names import ModQuest, Quest @@ -261,6 +261,19 @@ def extend_baby_locations(randomized_locations: List[LocationData]): randomized_locations.extend(baby_locations) +def extend_building_locations(randomized_locations: List[LocationData], content: StardewContent): + building_progression = content.features.building_progression + if not building_progression.is_progressive: + return + + for building in content.farm_buildings.values(): + if building.name in building_progression.starting_buildings: + continue + + location_name = building_progression.to_location_name(building.name) + randomized_locations.append(location_table[location_name]) + + def extend_festival_locations(randomized_locations: List[LocationData], options: StardewValleyOptions, random: Random): if options.festival_locations == FestivalLocations.option_disabled: return @@ -485,10 +498,7 @@ def create_locations(location_collector: StardewLocationCollector, if skill_progression.is_mastery_randomized(skill): randomized_locations.append(location_table[skill.mastery_name]) - if options.building_progression & BuildingProgression.option_progressive: - for location in locations_by_tag[LocationTags.BUILDING_BLUEPRINT]: - if location.mod_name is None or location.mod_name in options.mods: - randomized_locations.append(location_table[location.name]) + extend_building_locations(randomized_locations, content) if options.arcade_machine_locations != ArcadeMachineLocations.option_disabled: randomized_locations.extend(locations_by_tag[LocationTags.ARCADE_MACHINE_VICTORY]) diff --git a/worlds/stardew_valley/logic/base_logic.py b/worlds/stardew_valley/logic/base_logic.py index 7b377fce1f..761ee54157 100644 --- a/worlds/stardew_valley/logic/base_logic.py +++ b/worlds/stardew_valley/logic/base_logic.py @@ -20,7 +20,6 @@ class LogicRegistry: self.museum_rules: Dict[str, StardewRule] = {} self.festival_rules: Dict[str, StardewRule] = {} self.quest_rules: Dict[str, StardewRule] = {} - self.building_rules: Dict[str, StardewRule] = {} self.special_order_rules: Dict[str, StardewRule] = {} self.sve_location_rules: Dict[str, StardewRule] = {} diff --git a/worlds/stardew_valley/logic/building_logic.py b/worlds/stardew_valley/logic/building_logic.py index b4eff43993..58a375d046 100644 --- a/worlds/stardew_valley/logic/building_logic.py +++ b/worlds/stardew_valley/logic/building_logic.py @@ -1,22 +1,22 @@ +import typing from functools import cached_property -from typing import Dict, Union +from typing import Union from Utils import cache_self1 from .base_logic import BaseLogic, BaseLogicMixin from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin from .received_logic import ReceivedLogicMixin from .region_logic import RegionLogicMixin -from ..options import BuildingProgression -from ..stardew_rule import StardewRule, True_, False_, Has -from ..strings.artisan_good_names import ArtisanGood +from ..stardew_rule import StardewRule, true_ from ..strings.building_names import Building -from ..strings.fish_names import WaterItem -from ..strings.material_names import Material -from ..strings.metal_names import MetalBar from ..strings.region_names import Region -has_group = "building" +if typing.TYPE_CHECKING: + from .source_logic import SourceLogicMixin +else: + SourceLogicMixin = object + +AUTO_BUILDING_BUILDINGS = {Building.shipping_bin, Building.pet_bowl, Building.farm_house} class BuildingLogicMixin(BaseLogicMixin): @@ -25,78 +25,38 @@ class BuildingLogicMixin(BaseLogicMixin): self.building = BuildingLogic(*args, **kwargs) -class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, MoneyLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin]]): - def initialize_rules(self): - self.registry.building_rules.update({ - # @formatter:off - Building.barn: self.logic.money.can_spend(6000) & self.logic.has_all(Material.wood, Material.stone), - Building.big_barn: self.logic.money.can_spend(12000) & self.logic.has_all(Material.wood, Material.stone) & self.logic.building.has_building(Building.barn), - Building.deluxe_barn: self.logic.money.can_spend(25000) & self.logic.has_all(Material.wood, Material.stone) & self.logic.building.has_building(Building.big_barn), - Building.coop: self.logic.money.can_spend(4000) & self.logic.has_all(Material.wood, Material.stone), - Building.big_coop: self.logic.money.can_spend(10000) & self.logic.has_all(Material.wood, Material.stone) & self.logic.building.has_building(Building.coop), - Building.deluxe_coop: self.logic.money.can_spend(20000) & self.logic.has_all(Material.wood, Material.stone) & self.logic.building.has_building(Building.big_coop), - Building.fish_pond: self.logic.money.can_spend(5000) & self.logic.has_all(Material.stone, WaterItem.seaweed, WaterItem.green_algae), - Building.mill: self.logic.money.can_spend(2500) & self.logic.has_all(Material.stone, Material.wood, ArtisanGood.cloth), - Building.shed: self.logic.money.can_spend(15000) & self.logic.has(Material.wood), - Building.big_shed: self.logic.money.can_spend(20000) & self.logic.has_all(Material.wood, Material.stone) & self.logic.building.has_building(Building.shed), - Building.silo: self.logic.money.can_spend(100) & self.logic.has_all(Material.stone, Material.clay, MetalBar.copper), - Building.slime_hutch: self.logic.money.can_spend(10000) & self.logic.has_all(Material.stone, MetalBar.quartz, MetalBar.iridium), - Building.stable: self.logic.money.can_spend(10000) & self.logic.has_all(Material.hardwood, MetalBar.iron), - Building.well: self.logic.money.can_spend(1000) & self.logic.has(Material.stone), - Building.shipping_bin: self.logic.money.can_spend(250) & self.logic.has(Material.wood), - Building.kitchen: self.logic.money.can_spend(10000) & self.logic.has(Material.wood) & self.logic.building.has_house(0), - Building.kids_room: self.logic.money.can_spend(65000) & self.logic.has(Material.hardwood) & self.logic.building.has_house(1), - Building.cellar: self.logic.money.can_spend(100000) & self.logic.building.has_house(2), - # @formatter:on - }) - - def update_rules(self, new_rules: Dict[str, StardewRule]): - self.registry.building_rules.update(new_rules) +class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SourceLogicMixin]]): @cache_self1 - def has_building(self, building: str) -> StardewRule: - # Shipping bin is special. The mod auto-builds it when received, no need to go to Robin. - if building is Building.shipping_bin: - if not self.options.building_progression & BuildingProgression.option_progressive: - return True_() - return self.logic.received(building) + def can_build(self, building_name: str) -> StardewRule: + building = self.content.farm_buildings.get(building_name) + assert building is not None, f"Building {building_name} not found." + + source_rule = self.logic.source.has_access_to_any(building.sources) + if not building.is_upgrade: + return source_rule + + upgrade_rule = self.logic.building.has_building(building.upgrade_from) + return self.logic.and_(upgrade_rule, source_rule) + + @cache_self1 + def has_building(self, building_name: str) -> StardewRule: + building_progression = self.content.features.building_progression + + if building_name in building_progression.starting_buildings: + return true_ + + if not building_progression.is_progressive: + return self.logic.building.can_build(building_name) + + # Those buildings are special. The mod auto-builds them when received, no need to go to Robin. + if building_name in AUTO_BUILDING_BUILDINGS: + return self.logic.received(Building.shipping_bin) carpenter_rule = self.logic.building.can_construct_buildings - if not self.options.building_progression & BuildingProgression.option_progressive: - return Has(building, self.registry.building_rules, has_group) & carpenter_rule - - count = 1 - if building in [Building.coop, Building.barn, Building.shed]: - building = f"Progressive {building}" - elif building.startswith("Big"): - count = 2 - building = " ".join(["Progressive", *building.split(" ")[1:]]) - elif building.startswith("Deluxe"): - count = 3 - building = " ".join(["Progressive", *building.split(" ")[1:]]) - return self.logic.received(building, count) & carpenter_rule + item, count = building_progression.to_progressive_item(building_name) + return self.logic.received(item, count) & carpenter_rule @cached_property def can_construct_buildings(self) -> StardewRule: return self.logic.region.can_reach(Region.carpenter) - - @cache_self1 - def has_house(self, upgrade_level: int) -> StardewRule: - if upgrade_level < 1: - return True_() - - if upgrade_level > 3: - return False_() - - carpenter_rule = self.logic.building.can_construct_buildings - if self.options.building_progression & BuildingProgression.option_progressive: - return carpenter_rule & self.logic.received(f"Progressive House", upgrade_level) - - if upgrade_level == 1: - return carpenter_rule & Has(Building.kitchen, self.registry.building_rules, has_group) - - if upgrade_level == 2: - return carpenter_rule & Has(Building.kids_room, self.registry.building_rules, has_group) - - # if upgrade_level == 3: - return carpenter_rule & Has(Building.cellar, self.registry.building_rules, has_group) diff --git a/worlds/stardew_valley/logic/cooking_logic.py b/worlds/stardew_valley/logic/cooking_logic.py index 8c8f716afb..339b2b9817 100644 --- a/worlds/stardew_valley/logic/cooking_logic.py +++ b/worlds/stardew_valley/logic/cooking_logic.py @@ -17,6 +17,7 @@ from ..data.recipe_data import RecipeSource, StarterSource, ShopSource, SkillSou from ..data.recipe_source import CutsceneSource, ShopTradeSource from ..options import Chefsanity from ..stardew_rule import StardewRule, True_, False_ +from ..strings.building_names import Building from ..strings.region_names import LogicRegion from ..strings.skill_names import Skill from ..strings.tv_channel_names import Channel @@ -32,7 +33,7 @@ class CookingLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogi BuildingLogicMixin, RelationshipLogicMixin, SkillLogicMixin, CookingLogicMixin]]): @cached_property def can_cook_in_kitchen(self) -> StardewRule: - return self.logic.building.has_house(1) | self.logic.skill.has_level(Skill.foraging, 9) + return self.logic.building.has_building(Building.kitchen) | self.logic.skill.has_level(Skill.foraging, 9) # Should be cached def can_cook(self, recipe: CookingRecipe = None) -> StardewRule: diff --git a/worlds/stardew_valley/logic/goal_logic.py b/worlds/stardew_valley/logic/goal_logic.py index 0ad3eb4f37..6ffa4da15a 100644 --- a/worlds/stardew_valley/logic/goal_logic.py +++ b/worlds/stardew_valley/logic/goal_logic.py @@ -44,7 +44,7 @@ class GoalLogic(BaseLogic[StardewLogic]): self.logic.museum.can_complete_museum(), # Catching every fish not expected # Shipping every item not expected - self.logic.relationship.can_get_married() & self.logic.building.has_house(2), + self.logic.relationship.can_get_married() & self.logic.building.has_building(Building.kids_room), self.logic.relationship.has_hearts_with_n(5, 8), # 5 Friends self.logic.relationship.has_hearts_with_n(10, 8), # 10 friends self.logic.pet.has_pet_hearts(5), # Max Pet diff --git a/worlds/stardew_valley/logic/grind_logic.py b/worlds/stardew_valley/logic/grind_logic.py index 997300ae7a..9550a12830 100644 --- a/worlds/stardew_valley/logic/grind_logic.py +++ b/worlds/stardew_valley/logic/grind_logic.py @@ -13,6 +13,7 @@ from ..strings.craftable_names import Consumable from ..strings.currency_names import Currency from ..strings.fish_names import WaterChest from ..strings.geode_names import Geode +from ..strings.material_names import Material from ..strings.region_names import Region from ..strings.tool_names import Tool @@ -21,9 +22,14 @@ if TYPE_CHECKING: else: ToolLogicMixin = object -MIN_ITEMS = 10 -MAX_ITEMS = 999 -PERCENT_REQUIRED_FOR_MAX_ITEM = 24 +MIN_MEDIUM_ITEMS = 10 +MAX_MEDIUM_ITEMS = 999 +PERCENT_REQUIRED_FOR_MAX_MEDIUM_ITEM = 24 + +EASY_ITEMS = {Material.wood, Material.stone, Material.fiber, Material.sap} +MIN_EASY_ITEMS = 300 +MAX_EASY_ITEMS = 2997 +PERCENT_REQUIRED_FOR_MAX_EASY_ITEM = 6 class GrindLogicMixin(BaseLogicMixin): @@ -43,7 +49,7 @@ class GrindLogic(BaseLogic[Union[GrindLogicMixin, HasLogicMixin, ReceivedLogicMi # Assuming one box per day, but halved because we don't know how many months have passed before Mr. Qi's Plane Ride. time_rule = self.logic.time.has_lived_months(quantity // 14) return self.logic.and_(opening_rule, mystery_box_rule, - book_of_mysteries_rule, time_rule,) + book_of_mysteries_rule, time_rule, ) def can_grind_artifact_troves(self, quantity: int) -> StardewRule: opening_rule = self.logic.region.can_reach(Region.blacksmith) @@ -67,11 +73,26 @@ class GrindLogic(BaseLogic[Union[GrindLogicMixin, HasLogicMixin, ReceivedLogicMi # Assuming twelve per month if the player does not grind it. self.logic.time.has_lived_months(quantity // 12)) + def can_grind_item(self, quantity: int, item: str | None = None) -> StardewRule: + if item in EASY_ITEMS: + return self.logic.grind.can_grind_easy_item(quantity) + else: + return self.logic.grind.can_grind_medium_item(quantity) + @cache_self1 - def can_grind_item(self, quantity: int) -> StardewRule: - if quantity <= MIN_ITEMS: + def can_grind_medium_item(self, quantity: int) -> StardewRule: + if quantity <= MIN_MEDIUM_ITEMS: return self.logic.true_ - quantity = min(quantity, MAX_ITEMS) - price = max(1, quantity * PERCENT_REQUIRED_FOR_MAX_ITEM // MAX_ITEMS) + quantity = min(quantity, MAX_MEDIUM_ITEMS) + price = max(1, quantity * PERCENT_REQUIRED_FOR_MAX_MEDIUM_ITEM // MAX_MEDIUM_ITEMS) + return HasProgressionPercent(self.player, price) + + @cache_self1 + def can_grind_easy_item(self, quantity: int) -> StardewRule: + if quantity <= MIN_EASY_ITEMS: + return self.logic.true_ + + quantity = min(quantity, MAX_EASY_ITEMS) + price = max(1, quantity * PERCENT_REQUIRED_FOR_MAX_EASY_ITEM // MAX_EASY_ITEMS) return HasProgressionPercent(self.player, price) diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index dd95165417..aa4cd075d3 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -254,7 +254,7 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin Geode.omni: self.mine.can_mine_in_the_mines_floor_41_80() | self.region.can_reach(Region.desert) | self.tool.has_tool(Tool.pan, ToolMaterial.iron) | self.received(Wallet.rusty_key) | (self.has(Fish.octopus) & self.building.has_building(Building.fish_pond)) | self.region.can_reach(Region.volcano_floor_10), Gift.bouquet: self.relationship.has_hearts_with_any_bachelor(8) & self.money.can_spend_at(Region.pierre_store, 100), Gift.golden_pumpkin: self.season.has(Season.fall) | self.action.can_open_geode(Geode.artifact_trove), - Gift.mermaid_pendant: self.region.can_reach(Region.tide_pools) & self.relationship.has_hearts_with_any_bachelor(10) & self.building.has_house(1) & self.has(Consumable.rain_totem), + Gift.mermaid_pendant: self.region.can_reach(Region.tide_pools) & self.relationship.has_hearts_with_any_bachelor(10) & self.building.has_building(Building.kitchen) & self.has(Consumable.rain_totem), Gift.movie_ticket: self.money.can_spend_at(Region.movie_ticket_stand, 1000), Gift.pearl: (self.has(Fish.blobfish) & self.building.has_building(Building.fish_pond)) | self.action.can_open_geode(Geode.artifact_trove), Gift.tea_set: self.season.has(Season.winter) & self.time.has_lived_max_months, @@ -355,9 +355,6 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin obtention_rule = self.registry.item_rules[recipe] if recipe in self.registry.item_rules else False_() self.registry.item_rules[recipe] = obtention_rule | crafting_rule - self.building.initialize_rules() - self.building.update_rules(self.mod.building.get_modded_building_rules()) - self.quest.initialize_rules() self.quest.update_rules(self.mod.quest.get_modded_quest_rules()) diff --git a/worlds/stardew_valley/logic/money_logic.py b/worlds/stardew_valley/logic/money_logic.py index 85370273c9..e272436fd8 100644 --- a/worlds/stardew_valley/logic/money_logic.py +++ b/worlds/stardew_valley/logic/money_logic.py @@ -17,8 +17,8 @@ from ..strings.region_names import Region, LogicRegion if typing.TYPE_CHECKING: from .shipping_logic import ShippingLogicMixin - - assert ShippingLogicMixin +else: + ShippingLogicMixin = object qi_gem_rewards = ("100 Qi Gems", "50 Qi Gems", "40 Qi Gems", "35 Qi Gems", "25 Qi Gems", "20 Qi Gems", "15 Qi Gems", "10 Qi Gems") @@ -31,7 +31,7 @@ class MoneyLogicMixin(BaseLogicMixin): class MoneyLogic(BaseLogic[Union[RegionLogicMixin, MoneyLogicMixin, TimeLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SeasonLogicMixin, -GrindLogicMixin, 'ShippingLogicMixin']]): +GrindLogicMixin, ShippingLogicMixin]]): @cache_self1 def can_have_earned_total(self, amount: int) -> StardewRule: @@ -80,7 +80,7 @@ GrindLogicMixin, 'ShippingLogicMixin']]): item_rules = [] if source.items_price is not None: for price, item in source.items_price: - item_rules.append(self.logic.has(item) & self.logic.grind.can_grind_item(price)) + item_rules.append(self.logic.has(item) & self.logic.grind.can_grind_item(price, item)) region_rule = self.logic.region.can_reach(source.shop_region) diff --git a/worlds/stardew_valley/logic/relationship_logic.py b/worlds/stardew_valley/logic/relationship_logic.py index b74bdc5645..2de82bf972 100644 --- a/worlds/stardew_valley/logic/relationship_logic.py +++ b/worlds/stardew_valley/logic/relationship_logic.py @@ -15,9 +15,9 @@ from ..content.feature import friendsanity from ..data.villagers_data import Villager from ..stardew_rule import StardewRule, True_, false_, true_ from ..strings.ap_names.mods.mod_items import SVEQuestItem +from ..strings.building_names import Building from ..strings.generic_names import Generic from ..strings.gift_names import Gift -from ..strings.quest_names import ModQuest from ..strings.region_names import Region from ..strings.season_names import Season from ..strings.villager_names import NPC, ModNPC @@ -63,7 +63,7 @@ ReceivedLogicMixin, HasLogicMixin, ModLogicMixin]]): if not self.content.features.friendsanity.is_enabled: return self.logic.relationship.can_reproduce(number_children) - return self.logic.received_n(*possible_kids, count=number_children) & self.logic.building.has_house(2) + return self.logic.received_n(*possible_kids, count=number_children) & self.logic.building.has_building(Building.kids_room) def can_reproduce(self, number_children: int = 1) -> StardewRule: assert number_children >= 0, "Can't have a negative amount of children." @@ -71,7 +71,7 @@ ReceivedLogicMixin, HasLogicMixin, ModLogicMixin]]): return True_() baby_rules = [self.logic.relationship.can_get_married(), - self.logic.building.has_house(2), + self.logic.building.has_building(Building.kids_room), self.logic.relationship.has_hearts_with_any_bachelor(12), self.logic.relationship.has_children(number_children - 1)] diff --git a/worlds/stardew_valley/logic/requirement_logic.py b/worlds/stardew_valley/logic/requirement_logic.py index 6a5adf4890..3e83950d54 100644 --- a/worlds/stardew_valley/logic/requirement_logic.py +++ b/worlds/stardew_valley/logic/requirement_logic.py @@ -8,6 +8,7 @@ from .fishing_logic import FishingLogicMixin from .has_logic import HasLogicMixin from .quest_logic import QuestLogicMixin from .received_logic import ReceivedLogicMixin +from .region_logic import RegionLogicMixin from .relationship_logic import RelationshipLogicMixin from .season_logic import SeasonLogicMixin from .skill_logic import SkillLogicMixin @@ -16,7 +17,7 @@ from .tool_logic import ToolLogicMixin from .walnut_logic import WalnutLogicMixin from ..data.game_item import Requirement from ..data.requirement import ToolRequirement, BookRequirement, SkillRequirement, SeasonRequirement, YearRequirement, CombatRequirement, QuestRequirement, \ - RelationshipRequirement, FishingRequirement, WalnutRequirement + RelationshipRequirement, FishingRequirement, WalnutRequirement, RegionRequirement class RequirementLogicMixin(BaseLogicMixin): @@ -26,7 +27,7 @@ class RequirementLogicMixin(BaseLogicMixin): class RequirementLogic(BaseLogic[Union[RequirementLogicMixin, HasLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, BookLogicMixin, -SeasonLogicMixin, TimeLogicMixin, CombatLogicMixin, QuestLogicMixin, RelationshipLogicMixin, FishingLogicMixin, WalnutLogicMixin]]): +SeasonLogicMixin, TimeLogicMixin, CombatLogicMixin, QuestLogicMixin, RelationshipLogicMixin, FishingLogicMixin, WalnutLogicMixin, RegionLogicMixin]]): def meet_all_requirements(self, requirements: Iterable[Requirement]): if not requirements: @@ -45,6 +46,10 @@ SeasonLogicMixin, TimeLogicMixin, CombatLogicMixin, QuestLogicMixin, Relationshi def _(self, requirement: SkillRequirement): return self.logic.skill.has_level(requirement.skill, requirement.level) + @meet_requirement.register + def _(self, requirement: RegionRequirement): + return self.logic.region.can_reach(requirement.region) + @meet_requirement.register def _(self, requirement: BookRequirement): return self.logic.book.has_book_power(requirement.book) @@ -76,5 +81,3 @@ SeasonLogicMixin, TimeLogicMixin, CombatLogicMixin, QuestLogicMixin, Relationshi @meet_requirement.register def _(self, requirement: FishingRequirement): return self.logic.fishing.can_fish_at(requirement.region) - - diff --git a/worlds/stardew_valley/logic/source_logic.py b/worlds/stardew_valley/logic/source_logic.py index 9ef68a020e..f1c6fe3d7b 100644 --- a/worlds/stardew_valley/logic/source_logic.py +++ b/worlds/stardew_valley/logic/source_logic.py @@ -12,7 +12,7 @@ from .region_logic import RegionLogicMixin from .requirement_logic import RequirementLogicMixin from .tool_logic import ToolLogicMixin from ..data.artisan import MachineSource -from ..data.game_item import GenericSource, ItemSource, GameItem, CustomRuleSource, CompoundSource +from ..data.game_item import GenericSource, Source, GameItem, CustomRuleSource from ..data.harvest import ForagingSource, FruitBatsSource, MushroomCaveSource, SeasonalForagingSource, \ HarvestCropSource, HarvestFruitTreeSource, ArtifactSpotSource from ..data.shop import ShopSource, MysteryBoxSource, ArtifactTroveSource, PrizeMachineSource, FishingTreasureChestSource @@ -25,7 +25,7 @@ class SourceLogicMixin(BaseLogicMixin): class SourceLogic(BaseLogic[Union[SourceLogicMixin, HasLogicMixin, ReceivedLogicMixin, HarvestingLogicMixin, MoneyLogicMixin, RegionLogicMixin, - ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin]]): +ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin]]): def has_access_to_item(self, item: GameItem): rules = [] @@ -36,14 +36,10 @@ class SourceLogic(BaseLogic[Union[SourceLogicMixin, HasLogicMixin, ReceivedLogic rules.append(self.logic.source.has_access_to_any(item.sources)) return self.logic.and_(*rules) - def has_access_to_any(self, sources: Iterable[ItemSource]): + def has_access_to_any(self, sources: Iterable[Source]): return self.logic.or_(*(self.logic.source.has_access_to(source) & self.logic.requirement.meet_all_requirements(source.other_requirements) for source in sources)) - def has_access_to_all(self, sources: Iterable[ItemSource]): - return self.logic.and_(*(self.logic.source.has_access_to(source) & self.logic.requirement.meet_all_requirements(source.other_requirements) - for source in sources)) - @functools.singledispatchmethod def has_access_to(self, source: Any): raise ValueError(f"Sources of type{type(source)} have no rule registered.") @@ -56,10 +52,6 @@ class SourceLogic(BaseLogic[Union[SourceLogicMixin, HasLogicMixin, ReceivedLogic def _(self, source: CustomRuleSource): return source.create_rule(self.logic) - @has_access_to.register - def _(self, source: CompoundSource): - return self.logic.source.has_access_to_all(source.sources) - @has_access_to.register def _(self, source: ForagingSource): return self.logic.harvesting.can_forage_from(source) diff --git a/worlds/stardew_valley/mods/logic/buildings_logic.py b/worlds/stardew_valley/mods/logic/buildings_logic.py deleted file mode 100644 index 388204a476..0000000000 --- a/worlds/stardew_valley/mods/logic/buildings_logic.py +++ /dev/null @@ -1,28 +0,0 @@ -from typing import Dict, Union - -from ..mod_data import ModNames -from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.has_logic import HasLogicMixin -from ...logic.money_logic import MoneyLogicMixin -from ...stardew_rule import StardewRule -from ...strings.artisan_good_names import ArtisanGood -from ...strings.building_names import ModBuilding -from ...strings.metal_names import MetalBar -from ...strings.region_names import Region - - -class ModBuildingLogicMixin(BaseLogicMixin): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.building = ModBuildingLogic(*args, **kwargs) - - -class ModBuildingLogic(BaseLogic[Union[MoneyLogicMixin, HasLogicMixin]]): - - def get_modded_building_rules(self) -> Dict[str, StardewRule]: - buildings = dict() - if ModNames.tractor in self.options.mods: - tractor_rule = (self.logic.money.can_spend_at(Region.carpenter, 150000) & - self.logic.has_all(MetalBar.iron, MetalBar.iridium, ArtisanGood.battery_pack)) - buildings.update({ModBuilding.tractor_garage: tractor_rule}) - return buildings diff --git a/worlds/stardew_valley/mods/logic/mod_logic.py b/worlds/stardew_valley/mods/logic/mod_logic.py index 37c17183db..ff28108b7d 100644 --- a/worlds/stardew_valley/mods/logic/mod_logic.py +++ b/worlds/stardew_valley/mods/logic/mod_logic.py @@ -1,4 +1,3 @@ -from .buildings_logic import ModBuildingLogicMixin from .deepwoods_logic import DeepWoodsLogicMixin from .elevator_logic import ModElevatorLogicMixin from .item_logic import ModItemLogicMixin @@ -16,6 +15,6 @@ class ModLogicMixin(BaseLogicMixin): self.mod = ModLogic(*args, **kwargs) -class ModLogic(ModElevatorLogicMixin, MagicLogicMixin, ModSkillLogicMixin, ModItemLogicMixin, ModQuestLogicMixin, ModBuildingLogicMixin, +class ModLogic(ModElevatorLogicMixin, MagicLogicMixin, ModSkillLogicMixin, ModItemLogicMixin, ModQuestLogicMixin, ModSpecialOrderLogicMixin, DeepWoodsLogicMixin, SVELogicMixin): pass diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index dc63018697..bdfbc20488 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -19,7 +19,7 @@ from .logic.logic import StardewLogic from .logic.time_logic import MAX_MONTHS from .logic.tool_logic import tool_upgrade_prices from .mods.mod_data import ModNames -from .options import BuildingProgression, ExcludeGingerIsland, SpecialOrderLocations, Museumsanity, BackpackProgression, Shipsanity, \ +from .options import ExcludeGingerIsland, SpecialOrderLocations, Museumsanity, BackpackProgression, Shipsanity, \ Monstersanity, Chefsanity, Craftsanity, ArcadeMachineLocations, Cooksanity, StardewValleyOptions, Walnutsanity from .stardew_rule import And, StardewRule, true_ from .stardew_rule.indirect_connection import look_for_indirect_connection @@ -71,7 +71,7 @@ def set_rules(world): set_tool_rules(logic, multiworld, player, world_content) set_skills_rules(logic, multiworld, player, world_content) set_bundle_rules(bundle_rooms, logic, multiworld, player, world_options) - set_building_rules(logic, multiworld, player, world_options) + set_building_rules(logic, multiworld, player, world_content) set_cropsanity_rules(logic, multiworld, player, world_content) set_story_quests_rules(all_location_names, logic, multiworld, player, world_options) set_special_order_rules(all_location_names, logic, multiworld, player, world_options) @@ -130,15 +130,19 @@ def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewCont MultiWorldRules.set_rule(tool_upgrade_location, logic.tool.has_tool(tool, previous)) -def set_building_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): - if not world_options.building_progression & BuildingProgression.option_progressive: +def set_building_rules(logic: StardewLogic, multiworld, player, content: StardewContent): + building_progression = content.features.building_progression + if not building_progression.is_progressive: return - for building in locations.locations_by_tag[LocationTags.BUILDING_BLUEPRINT]: - if building.mod_name is not None and building.mod_name not in world_options.mods: + for building in content.farm_buildings.values(): + if building.name in building_progression.starting_buildings: continue - MultiWorldRules.set_rule(multiworld.get_location(building.name, player), - logic.registry.building_rules[building.name.replace(" Blueprint", "")]) + + location_name = building_progression.to_location_name(building.name) + + MultiWorldRules.set_rule(multiworld.get_location(location_name, player), + logic.building.can_build(building.name)) def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -241,7 +245,7 @@ def set_dangerous_mine_rules(logic, multiworld, player, world_options: StardewVa def set_farm_buildings_entrance_rules(logic, multiworld, player): - set_entrance_rule(multiworld, player, Entrance.downstairs_to_cellar, logic.building.has_house(3)) + set_entrance_rule(multiworld, player, Entrance.downstairs_to_cellar, logic.building.has_building(Building.cellar)) set_entrance_rule(multiworld, player, Entrance.use_desert_obelisk, logic.can_use_obelisk(Transportation.desert_obelisk)) set_entrance_rule(multiworld, player, Entrance.enter_greenhouse, logic.received("Greenhouse")) set_entrance_rule(multiworld, player, Entrance.enter_coop, logic.building.has_building(Building.coop)) diff --git a/worlds/stardew_valley/strings/building_names.py b/worlds/stardew_valley/strings/building_names.py index b67808febc..50c84b67ca 100644 --- a/worlds/stardew_valley/strings/building_names.py +++ b/worlds/stardew_valley/strings/building_names.py @@ -14,9 +14,11 @@ class Building: stable = "Stable" well = "Well" shipping_bin = "Shipping Bin" + farm_house = "Farm House" kitchen = "Kitchen" kids_room = "Kids Room" cellar = "Cellar" + pet_bowl = "Pet Bowl" class ModBuilding: diff --git a/worlds/stardew_valley/test/TestBooksanity.py b/worlds/stardew_valley/test/TestBooksanity.py index 3c737e502c..c25924aa3b 100644 --- a/worlds/stardew_valley/test/TestBooksanity.py +++ b/worlds/stardew_valley/test/TestBooksanity.py @@ -61,11 +61,13 @@ class TestBooksanityNone(SVTestBase): for location in self.multiworld.get_locations(): if not location.name.startswith(shipsanity_prefix): continue + item_to_ship = location.name[len(shipsanity_prefix):] if item_to_ship not in power_books and item_to_ship not in skill_books: continue + with self.subTest(location.name): - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(location) class TestBooksanityPowers(SVTestBase): @@ -107,11 +109,13 @@ class TestBooksanityPowers(SVTestBase): for location in self.multiworld.get_locations(): if not location.name.startswith(shipsanity_prefix): continue + item_to_ship = location.name[len(shipsanity_prefix):] if item_to_ship not in power_books and item_to_ship not in skill_books: continue + with self.subTest(location.name): - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(location) class TestBooksanityPowersAndSkills(SVTestBase): @@ -153,11 +157,13 @@ class TestBooksanityPowersAndSkills(SVTestBase): for location in self.multiworld.get_locations(): if not location.name.startswith(shipsanity_prefix): continue + item_to_ship = location.name[len(shipsanity_prefix):] if item_to_ship not in power_books and item_to_ship not in skill_books: continue + with self.subTest(location.name): - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(location) class TestBooksanityAll(SVTestBase): @@ -199,8 +205,10 @@ class TestBooksanityAll(SVTestBase): for location in self.multiworld.get_locations(): if not location.name.startswith(shipsanity_prefix): continue + item_to_ship = location.name[len(shipsanity_prefix):] if item_to_ship not in power_books and item_to_ship not in skill_books: continue + with self.subTest(location.name): - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(location) diff --git a/worlds/stardew_valley/test/TestCrops.py b/worlds/stardew_valley/test/TestCrops.py index 4fa836a97d..53048259ab 100644 --- a/worlds/stardew_valley/test/TestCrops.py +++ b/worlds/stardew_valley/test/TestCrops.py @@ -1,5 +1,9 @@ from . import SVTestBase from .. import options +from ..strings.ap_names.transport_names import Transportation +from ..strings.building_names import Building +from ..strings.region_names import Region +from ..strings.seed_names import Seed class TestCropsanityRules(SVTestBase): @@ -8,13 +12,13 @@ class TestCropsanityRules(SVTestBase): } def test_need_greenhouse_for_cactus(self): - harvest_cactus = self.world.logic.region.can_reach_location("Harvest Cactus Fruit") - self.assert_rule_false(harvest_cactus, self.multiworld.state) + harvest_cactus_fruit = "Harvest Cactus Fruit" + self.assert_cannot_reach_location(harvest_cactus_fruit) - self.multiworld.state.collect(self.create_item("Cactus Seeds")) - self.multiworld.state.collect(self.create_item("Shipping Bin")) - self.multiworld.state.collect(self.create_item("Desert Obelisk")) - self.assert_rule_false(harvest_cactus, self.multiworld.state) + self.multiworld.state.collect(self.create_item(Seed.cactus)) + self.multiworld.state.collect(self.create_item(Building.shipping_bin)) + self.multiworld.state.collect(self.create_item(Transportation.desert_obelisk)) + self.assert_cannot_reach_location(harvest_cactus_fruit) - self.multiworld.state.collect(self.create_item("Greenhouse")) - self.assert_rule_true(harvest_cactus, self.multiworld.state) + self.multiworld.state.collect(self.create_item(Region.greenhouse)) + self.assert_can_reach_location(harvest_cactus_fruit) diff --git a/worlds/stardew_valley/test/TestFarmType.py b/worlds/stardew_valley/test/TestFarmType.py index f78edc3eec..1bb4404ae6 100644 --- a/worlds/stardew_valley/test/TestFarmType.py +++ b/worlds/stardew_valley/test/TestFarmType.py @@ -1,3 +1,5 @@ +from collections import Counter + from . import SVTestBase from .assertion import WorldAssertMixin from .. import options @@ -5,27 +7,49 @@ from .. import options class TestStartInventoryStandardFarm(WorldAssertMixin, SVTestBase): options = { - options.FarmType.internal_name: options.FarmType.option_standard, + options.FarmType: options.FarmType.option_standard, } def test_start_inventory_progressive_coops(self): - start_items = dict(map(lambda x: (x.name, self.multiworld.precollected_items[self.player].count(x)), self.multiworld.precollected_items[self.player])) - items = dict(map(lambda x: (x.name, self.multiworld.itempool.count(x)), self.multiworld.itempool)) + start_items = Counter((i.name for i in self.multiworld.precollected_items[self.player])) + items = Counter((i.name for i in self.multiworld.itempool)) + self.assertIn("Progressive Coop", items) self.assertEqual(items["Progressive Coop"], 3) self.assertNotIn("Progressive Coop", start_items) + def test_coop_is_not_logically_available(self): + self.assert_rule_false(self.world.logic.building.has_building("Coop")) -class TestStartInventoryMeadowLands(WorldAssertMixin, SVTestBase): + +class TestStartInventoryMeadowLandsProgressiveBuilding(WorldAssertMixin, SVTestBase): options = { - options.FarmType.internal_name: options.FarmType.option_meadowlands, - options.BuildingProgression.internal_name: options.BuildingProgression.option_progressive, + options.FarmType: options.FarmType.option_meadowlands, + options.BuildingProgression: options.BuildingProgression.option_progressive, } def test_start_inventory_progressive_coops(self): - start_items = dict(map(lambda x: (x.name, self.multiworld.precollected_items[self.player].count(x)), self.multiworld.precollected_items[self.player])) - items = dict(map(lambda x: (x.name, self.multiworld.itempool.count(x)), self.multiworld.itempool)) + start_items = Counter((i.name for i in self.multiworld.precollected_items[self.player])) + items = Counter((i.name for i in self.multiworld.itempool)) + self.assertIn("Progressive Coop", items) self.assertEqual(items["Progressive Coop"], 2) self.assertIn("Progressive Coop", start_items) self.assertEqual(start_items["Progressive Coop"], 1) + + def test_coop_is_logically_available(self): + self.assert_rule_true(self.world.logic.building.has_building("Coop")) + + +class TestStartInventoryMeadowLandsVanillaBuildings(WorldAssertMixin, SVTestBase): + options = { + options.FarmType: options.FarmType.option_meadowlands, + options.BuildingProgression: options.BuildingProgression.option_vanilla, + } + + def test_start_inventory_has_no_coop(self): + start_items = Counter((i.name for i in self.multiworld.precollected_items[self.player])) + self.assertNotIn("Progressive Coop", start_items) + + def test_coop_is_logically_available(self): + self.assert_rule_true(self.world.logic.building.has_building("Coop")) diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 38882136ce..35cd2007eb 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -3,13 +3,30 @@ from typing import List from BaseClasses import ItemClassification, Item from . import SVTestBase from .. import items, location_table, options -from ..items import Group +from ..items import Group, ItemData from ..locations import LocationTags from ..options import Friendsanity, SpecialOrderLocations, Shipsanity, Chefsanity, SeasonRandomization, Craftsanity, ExcludeGingerIsland, SkillProgression, \ Booksanity, Walnutsanity from ..strings.region_names import Region +def get_all_permanent_progression_items() -> List[ItemData]: + """Ignore all the stuff that the algorithm chooses one of, instead of all, to fulfill logical progression. + """ + return [ + item + for item in items.all_items + if ItemClassification.progression in item.classification + if item.mod_name is None + if item.name not in {event.name for event in items.events} + if item.name not in {deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]} + if item.name not in {season.name for season in items.items_by_group[Group.SEASON]} + if item.name not in {weapon.name for weapon in items.items_by_group[Group.WEAPON]} + if item.name not in {baby.name for baby in items.items_by_group[Group.BABY]} + if item.name != "The Gateway Gazette" + ] + + class TestBaseItemGeneration(SVTestBase): options = { SeasonRandomization.internal_name: SeasonRandomization.option_progressive, @@ -25,17 +42,8 @@ class TestBaseItemGeneration(SVTestBase): } def test_all_progression_items_are_added_to_the_pool(self): - all_created_items = [item.name for item in self.multiworld.itempool] - # Ignore all the stuff that the algorithm chooses one of, instead of all, to fulfill logical progression - items_to_ignore = [event.name for event in items.events] - items_to_ignore.extend(item.name for item in items.all_items if item.mod_name is not None) - items_to_ignore.extend(deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]) - items_to_ignore.extend(season.name for season in items.items_by_group[Group.SEASON]) - items_to_ignore.extend(weapon.name for weapon in items.items_by_group[Group.WEAPON]) - items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) - items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) - items_to_ignore.append("The Gateway Gazette") - progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression and item.name not in items_to_ignore] + all_created_items = set(self.get_all_created_items()) + progression_items = get_all_permanent_progression_items() for progression_item in progression_items: with self.subTest(f"{progression_item.name}"): self.assertIn(progression_item.name, all_created_items) @@ -45,19 +53,19 @@ class TestBaseItemGeneration(SVTestBase): self.assertEqual(len(non_event_locations), len(self.multiworld.itempool)) def test_does_not_create_deprecated_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + all_created_items = set(self.get_all_created_items()) for deprecated_item in items.items_by_group[items.Group.DEPRECATED]: with self.subTest(f"{deprecated_item.name}"): self.assertNotIn(deprecated_item.name, all_created_items) def test_does_not_create_more_than_one_maximum_one_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + all_created_items = self.get_all_created_items() for maximum_one_item in items.items_by_group[items.Group.MAXIMUM_ONE]: with self.subTest(f"{maximum_one_item.name}"): self.assertLessEqual(all_created_items.count(maximum_one_item.name), 1) - def test_does_not_create_exactly_two_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + def test_does_not_create_or_create_two_of_exactly_two_items(self): + all_created_items = self.get_all_created_items() for exactly_two_item in items.items_by_group[items.Group.EXACTLY_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) @@ -77,17 +85,10 @@ class TestNoGingerIslandItemGeneration(SVTestBase): } def test_all_progression_items_except_island_are_added_to_the_pool(self): - all_created_items = [item.name for item in self.multiworld.itempool] - # Ignore all the stuff that the algorithm chooses one of, instead of all, to fulfill logical progression - items_to_ignore = [event.name for event in items.events] - items_to_ignore.extend(item.name for item in items.all_items if item.mod_name is not None) - items_to_ignore.extend(deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]) - items_to_ignore.extend(season.name for season in items.items_by_group[Group.SEASON]) - items_to_ignore.extend(season.name for season in items.items_by_group[Group.WEAPON]) - items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) - items_to_ignore.append("The Gateway Gazette") - progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression and item.name not in items_to_ignore] + all_created_items = set(self.get_all_created_items()) + progression_items = get_all_permanent_progression_items() for progression_item in progression_items: + with self.subTest(f"{progression_item.name}"): if Group.GINGER_ISLAND in progression_item.groups: self.assertNotIn(progression_item.name, all_created_items) @@ -100,19 +101,19 @@ class TestNoGingerIslandItemGeneration(SVTestBase): self.assertEqual(len(non_event_locations), len(self.multiworld.itempool)) def test_does_not_create_deprecated_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + all_created_items = self.get_all_created_items() for deprecated_item in items.items_by_group[items.Group.DEPRECATED]: with self.subTest(f"Deprecated item: {deprecated_item.name}"): self.assertNotIn(deprecated_item.name, all_created_items) def test_does_not_create_more_than_one_maximum_one_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + all_created_items = self.get_all_created_items() for maximum_one_item in items.items_by_group[items.Group.MAXIMUM_ONE]: with self.subTest(f"{maximum_one_item.name}"): self.assertLessEqual(all_created_items.count(maximum_one_item.name), 1) def test_does_not_create_exactly_two_items(self): - all_created_items = [item.name for item in self.multiworld.itempool] + all_created_items = self.get_all_created_items() for exactly_two_item in items.items_by_group[items.Group.EXACTLY_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) diff --git a/worlds/stardew_valley/test/TestLogic.py b/worlds/stardew_valley/test/TestLogic.py index 85279ad238..7a6b81ea74 100644 --- a/worlds/stardew_valley/test/TestLogic.py +++ b/worlds/stardew_valley/test/TestLogic.py @@ -49,9 +49,9 @@ class LogicTestBase(RuleAssertMixin, TestCase): self.assert_rule_can_be_resolved(rule, self.multiworld.state) def test_given_building_rule_then_can_be_resolved(self): - for building in self.logic.registry.building_rules.keys(): + for building in self.world.content.farm_buildings: with self.subTest(msg=building): - rule = self.logic.registry.building_rules[building] + rule = self.logic.building.can_build(building) self.assert_rule_can_be_resolved(rule, self.multiworld.state) def test_given_quest_rule_then_can_be_resolved(self): diff --git a/worlds/stardew_valley/test/TestOptionFlags.py b/worlds/stardew_valley/test/TestOptionFlags.py index 88f2257cab..2833649e35 100644 --- a/worlds/stardew_valley/test/TestOptionFlags.py +++ b/worlds/stardew_valley/test/TestOptionFlags.py @@ -8,9 +8,8 @@ class TestBitFlagsVanilla(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_vanilla} def test_options_are_not_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -25,9 +24,8 @@ class TestBitFlagsVanillaCheap(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_vanilla_cheap} def test_options_are_not_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -42,9 +40,8 @@ class TestBitFlagsVanillaVeryCheap(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_vanilla_very_cheap} def test_options_are_not_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -59,9 +56,8 @@ class TestBitFlagsProgressive(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_progressive} def test_options_are_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) @@ -76,9 +72,8 @@ class TestBitFlagsProgressiveCheap(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_progressive_cheap} def test_options_are_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) @@ -93,9 +88,8 @@ class TestBitFlagsProgressiveVeryCheap(SVTestBase): BuildingProgression.internal_name: BuildingProgression.option_progressive_very_cheap} def test_options_are_detected_as_progressive(self): - world_options = self.world.options tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = world_options.building_progression & BuildingProgression.option_progressive + building_progressive = self.world.content.features.building_progression.is_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index e3f06bf133..5cc2f79e91 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -70,7 +70,6 @@ class TestWalnutsanityPuzzles(SVTestBase): def test_field_office_locations_require_professor_snail(self): location_names = ["Complete Large Animal Collection", "Complete Snake Collection", "Complete Mummified Frog Collection", "Complete Mummified Bat Collection", "Purple Flowers Island Survey", "Purple Starfish Island Survey", ] - locations = [location for location in self.multiworld.get_locations() if location.name in location_names] self.collect("Island Obelisk") self.collect("Island North Turtle") self.collect("Island West Turtle") @@ -84,11 +83,11 @@ class TestWalnutsanityPuzzles(SVTestBase): self.collect("Progressive Sword", 5) self.collect("Combat Level", 10) self.collect("Mining Level", 10) - for location in locations: - self.assert_cannot_reach_location(location, self.multiworld.state) + for location in location_names: + self.assert_cannot_reach_location(location) self.collect("Open Professor Snail Cave") - for location in locations: - self.assert_can_reach_location(location, self.multiworld.state) + for location in location_names: + self.assert_can_reach_location(location) class TestWalnutsanityBushes(SVTestBase): diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index f06e7d0768..800b210576 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -1,3 +1,4 @@ +import itertools import logging import os import threading @@ -11,7 +12,8 @@ from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_mul from worlds.AutoWorld import call_all from .assertion import RuleAssertMixin from .options.utils import fill_namespace_with_default, parse_class_option_keys, fill_dataclass_with_default -from .. import StardewValleyWorld, StardewItem +from .. import StardewValleyWorld, StardewItem, StardewRule +from ..logic.time_logic import MONTH_COEFFICIENT from ..options import StardewValleyOption logger = logging.getLogger(__name__) @@ -96,6 +98,12 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): return False return super().run_default_tests + def collect_months(self, months: int) -> None: + real_total_prog_items = self.world.total_progression_items + percent = months * MONTH_COEFFICIENT + self.collect("Stardrop", real_total_prog_items * 100 // percent) + self.world.total_progression_items = real_total_prog_items + def collect_lots_of_money(self, percent: float = 0.25): self.collect("Shipping Bin") real_total_prog_items = self.world.total_progression_items @@ -145,12 +153,35 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): def create_item(self, item: str) -> StardewItem: return self.world.create_item(item) + def get_all_created_items(self) -> list[str]: + return [item.name for item in itertools.chain(self.multiworld.get_items(), self.multiworld.precollected_items[self.player])] + def remove_one_by_name(self, item: str) -> None: self.remove(self.create_item(item)) - def reset_collection_state(self): + def reset_collection_state(self) -> None: self.multiworld.state = self.original_state.copy() + def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_rule_true(rule, state) + + def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_rule_false(rule, state) + + def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_can_reach_location(location, state) + + def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_cannot_reach_location(location, state) + pre_generated_worlds = {} diff --git a/worlds/stardew_valley/test/content/__init__.py b/worlds/stardew_valley/test/content/__init__.py index 0832c2e3c3..626277ca72 100644 --- a/worlds/stardew_valley/test/content/__init__.py +++ b/worlds/stardew_valley/test/content/__init__.py @@ -2,9 +2,11 @@ import unittest from typing import ClassVar, Tuple from ...content import content_packs, ContentPack, StardewContent, unpack_content, StardewFeatures, feature +from ...strings.building_names import Building default_features = StardewFeatures( feature.booksanity.BooksanityDisabled(), + feature.building_progression.BuildingProgressionVanilla(starting_buildings={Building.farm_house}), feature.cropsanity.CropsanityDisabled(), feature.fishsanity.FishsanityNone(), feature.friendsanity.FriendsanityNone(), diff --git a/worlds/stardew_valley/test/long/TestOptionsLong.py b/worlds/stardew_valley/test/long/TestOptionsLong.py index 0c8cfcb1e1..81bb4d1f30 100644 --- a/worlds/stardew_valley/test/long/TestOptionsLong.py +++ b/worlds/stardew_valley/test/long/TestOptionsLong.py @@ -6,7 +6,6 @@ from .option_names import all_option_choices from .. import SVTestCase, solo_multiworld from ..assertion.world_assert import WorldAssertMixin from ... import options -from ...mods.mod_data import ModNames class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): @@ -34,13 +33,11 @@ class TestDynamicOptionDebug(WorldAssertMixin, SVTestCase): def test_option_pair_debug(self): option_dict = { - options.Goal.internal_name: options.Goal.option_master_angler, - options.QuestLocations.internal_name: -1, - options.Fishsanity.internal_name: options.Fishsanity.option_all, - options.Mods.internal_name: frozenset({ModNames.sve}), + options.Goal.internal_name: options.Goal.option_cryptic_note, + options.EntranceRandomization.internal_name: options.EntranceRandomization.option_buildings, } for i in range(1): - seed = get_seed() + seed = get_seed(76312028554502615508) with self.subTest(f"Seed: {seed}"): print(f"Seed: {seed}") with solo_multiworld(option_dict, seed=seed) as (multiworld, _): diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index b4d10f2e99..932c76c680 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,11 +1,12 @@ import random -from BaseClasses import get_seed, ItemClassification +from BaseClasses import get_seed from .. import SVTestBase, SVTestCase +from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin from ..options.presets import allsanity_mods_6_x_x from ..options.utils import fill_dataclass_with_default -from ... import options, items, Group, create_content +from ... import options, Group, create_content from ...mods.mod_data import ModNames from ...options import SkillProgression, Walnutsanity from ...options.options import all_mods @@ -109,17 +110,8 @@ class TestBaseItemGeneration(SVTestBase): } def test_all_progression_items_are_added_to_the_pool(self): - all_created_items = [item.name for item in self.multiworld.itempool] - # Ignore all the stuff that the algorithm chooses one of, instead of all, to fulfill logical progression - items_to_ignore = [event.name for event in items.events] - items_to_ignore.extend(deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]) - items_to_ignore.extend(season.name for season in items.items_by_group[Group.SEASON]) - items_to_ignore.extend(weapon.name for weapon in items.items_by_group[Group.WEAPON]) - items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) - items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) - items_to_ignore.append("The Gateway Gazette") - progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression - and item.name not in items_to_ignore] + all_created_items = self.get_all_created_items() + progression_items = get_all_permanent_progression_items() for progression_item in progression_items: with self.subTest(f"{progression_item.name}"): self.assertIn(progression_item.name, all_created_items) @@ -139,17 +131,8 @@ class TestNoGingerIslandModItemGeneration(SVTestBase): } def test_all_progression_items_except_island_are_added_to_the_pool(self): - all_created_items = [item.name for item in self.multiworld.itempool] - # Ignore all the stuff that the algorithm chooses one of, instead of all, to fulfill logical progression - items_to_ignore = [event.name for event in items.events] - items_to_ignore.extend(deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]) - items_to_ignore.extend(season.name for season in items.items_by_group[Group.SEASON]) - items_to_ignore.extend(weapon.name for weapon in items.items_by_group[Group.WEAPON]) - items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) - items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) - items_to_ignore.append("The Gateway Gazette") - progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression - and item.name not in items_to_ignore] + all_created_items = self.get_all_created_items() + progression_items = get_all_permanent_progression_items() for progression_item in progression_items: with self.subTest(f"{progression_item.name}"): if Group.GINGER_ISLAND in progression_item.groups: diff --git a/worlds/stardew_valley/test/options/presets.py b/worlds/stardew_valley/test/options/presets.py index aecdeadd9f..57f8b0beb9 100644 --- a/worlds/stardew_valley/test/options/presets.py +++ b/worlds/stardew_valley/test/options/presets.py @@ -16,6 +16,7 @@ def default_6_x_x(): options.ElevatorProgression.internal_name: options.ElevatorProgression.default, options.EntranceRandomization.internal_name: options.EntranceRandomization.default, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.default, + options.FarmType.internal_name: options.FarmType.default, options.FestivalLocations.internal_name: options.FestivalLocations.default, options.Fishsanity.internal_name: options.Fishsanity.default, options.Friendsanity.internal_name: options.Friendsanity.default, @@ -52,6 +53,7 @@ def allsanity_no_mods_6_x_x(): options.ElevatorProgression.internal_name: options.ElevatorProgression.option_progressive, options.EntranceRandomization.internal_name: options.EntranceRandomization.option_disabled, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, + options.FarmType.internal_name: options.FarmType.option_standard, options.FestivalLocations.internal_name: options.FestivalLocations.option_hard, options.Fishsanity.internal_name: options.Fishsanity.option_all, options.Friendsanity.internal_name: options.Friendsanity.option_all_with_marriage, @@ -100,6 +102,7 @@ def get_minsanity_options(): options.ElevatorProgression.internal_name: options.ElevatorProgression.option_vanilla, options.EntranceRandomization.internal_name: options.EntranceRandomization.option_disabled, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.FarmType.internal_name: options.FarmType.option_meadowlands, options.FestivalLocations.internal_name: options.FestivalLocations.option_disabled, options.Fishsanity.internal_name: options.Fishsanity.option_none, options.Friendsanity.internal_name: options.Friendsanity.option_none, @@ -136,6 +139,7 @@ def minimal_locations_maximal_items(): options.ElevatorProgression.internal_name: options.ElevatorProgression.option_vanilla, options.EntranceRandomization.internal_name: options.EntranceRandomization.option_disabled, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.FarmType.internal_name: options.FarmType.option_meadowlands, options.FestivalLocations.internal_name: options.FestivalLocations.option_disabled, options.Fishsanity.internal_name: options.Fishsanity.option_none, options.Friendsanity.internal_name: options.Friendsanity.option_none, diff --git a/worlds/stardew_valley/test/rules/TestArcades.py b/worlds/stardew_valley/test/rules/TestArcades.py index 69e5b22cc0..5fdf7df13d 100644 --- a/worlds/stardew_valley/test/rules/TestArcades.py +++ b/worlds/stardew_valley/test/rules/TestArcades.py @@ -11,7 +11,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertFalse(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_cannot_reach_location("Journey of the Prairie King Victory") boots = self.create_item("JotPK: Progressive Boots") gun = self.create_item("JotPK: Progressive Gun") @@ -24,7 +24,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) @@ -33,7 +33,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) @@ -44,7 +44,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) self.remove(ammo) @@ -60,7 +60,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) self.remove(gun) @@ -83,7 +83,7 @@ class TestArcadeMachinesLogic(SVTestBase): self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach_location("Journey of the Prairie King Victory")(self.multiworld.state)) + self.assert_can_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) self.remove(gun) diff --git a/worlds/stardew_valley/test/rules/TestBooks.py b/worlds/stardew_valley/test/rules/TestBooks.py index af0055d228..4cd84a77a2 100644 --- a/worlds/stardew_valley/test/rules/TestBooks.py +++ b/worlds/stardew_valley/test/rules/TestBooks.py @@ -7,18 +7,15 @@ class TestBooksLogic(SVTestBase): options.Booksanity.internal_name: options.Booksanity.option_all, } - def test_need_weapon_for_mapping_cave_systems(self): - self.collect_lots_of_money(0.5) - - location = self.multiworld.get_location("Read Mapping Cave Systems", self.player) - - self.assert_cannot_reach_location(location, self.multiworld.state) + def test_can_get_mapping_cave_systems_with_weapon_and_time(self): + self.collect_months(12) + self.assert_cannot_reach_location("Read Mapping Cave Systems") self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location("Read Mapping Cave Systems") self.collect("Progressive Weapon") - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location("Read Mapping Cave Systems") diff --git a/worlds/stardew_valley/test/rules/TestBuildings.py b/worlds/stardew_valley/test/rules/TestBuildings.py index d1f60b20e0..8eeb9d295a 100644 --- a/worlds/stardew_valley/test/rules/TestBuildings.py +++ b/worlds/stardew_valley/test/rules/TestBuildings.py @@ -9,45 +9,37 @@ class TestBuildingLogic(SVTestBase): } def test_coop_blueprint(self): - self.assertFalse(self.world.logic.region.can_reach_location("Coop Blueprint")(self.multiworld.state)) + self.assert_cannot_reach_location("Coop Blueprint") self.collect_lots_of_money() - self.assertTrue(self.world.logic.region.can_reach_location("Coop Blueprint")(self.multiworld.state)) + self.assert_can_reach_location("Coop Blueprint") def test_big_coop_blueprint(self): - big_coop_blueprint_rule = self.world.logic.region.can_reach_location("Big Coop Blueprint") - self.assertFalse(big_coop_blueprint_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}") + self.assert_cannot_reach_location("Big Coop Blueprint") self.collect_lots_of_money() - self.assertFalse(big_coop_blueprint_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}") + self.assert_cannot_reach_location("Big Coop Blueprint") self.multiworld.state.collect(self.create_item("Progressive Coop")) - self.assertTrue(big_coop_blueprint_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}") + self.assert_can_reach_location("Big Coop Blueprint") def test_deluxe_coop_blueprint(self): - self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) + self.assert_cannot_reach_location("Deluxe Coop Blueprint") self.collect_lots_of_money() - self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) + self.assert_cannot_reach_location("Deluxe Coop Blueprint") self.multiworld.state.collect(self.create_item("Progressive Coop")) - self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) + self.assert_cannot_reach_location("Deluxe Coop Blueprint") self.multiworld.state.collect(self.create_item("Progressive Coop")) - self.assertTrue(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) + self.assert_can_reach_location("Deluxe Coop Blueprint") def test_big_shed_blueprint(self): - big_shed_rule = self.world.logic.region.can_reach_location("Big Shed Blueprint") - self.assertFalse(big_shed_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}") + self.assert_cannot_reach_location("Big Shed Blueprint") self.collect_lots_of_money() - self.assertFalse(big_shed_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}") + self.assert_cannot_reach_location("Big Shed Blueprint") self.multiworld.state.collect(self.create_item("Progressive Shed")) - self.assertTrue(big_shed_rule(self.multiworld.state), - f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}") + self.assert_can_reach_location("Big Shed Blueprint") diff --git a/worlds/stardew_valley/test/rules/TestBundles.py b/worlds/stardew_valley/test/rules/TestBundles.py index 0bc7f9bfdf..918cb8aba6 100644 --- a/worlds/stardew_valley/test/rules/TestBundles.py +++ b/worlds/stardew_valley/test/rules/TestBundles.py @@ -11,10 +11,10 @@ class TestBundlesLogic(SVTestBase): } def test_vault_2500g_bundle(self): - self.assertFalse(self.world.logic.region.can_reach_location("2,500g Bundle")(self.multiworld.state)) + self.assert_cannot_reach_location("2,500g Bundle") self.collect_lots_of_money() - self.assertTrue(self.world.logic.region.can_reach_location("2,500g Bundle")(self.multiworld.state)) + self.assert_can_reach_location("2,500g Bundle") class TestRemixedBundlesLogic(SVTestBase): @@ -25,10 +25,10 @@ class TestRemixedBundlesLogic(SVTestBase): } def test_sticky_bundle_has_grind_rules(self): - self.assertFalse(self.world.logic.region.can_reach_location("Sticky Bundle")(self.multiworld.state)) + self.assert_cannot_reach_location("Sticky Bundle") self.collect_all_the_money() - self.assertTrue(self.world.logic.region.can_reach_location("Sticky Bundle")(self.multiworld.state)) + self.assert_can_reach_location("Sticky Bundle") class TestRaccoonBundlesLogic(SVTestBase): @@ -40,11 +40,6 @@ class TestRaccoonBundlesLogic(SVTestBase): seed = 2 # Magic seed that does what I want. Might need to get changed if we change the randomness behavior of raccoon bundles def test_raccoon_bundles_rely_on_previous_ones(self): - # The first raccoon bundle is a fishing one - raccoon_rule_1 = self.world.logic.region.can_reach_location("Raccoon Request 1") - - # The 3th raccoon bundle is a foraging one - raccoon_rule_3 = self.world.logic.region.can_reach_location("Raccoon Request 3") self.collect("Progressive Raccoon", 6) self.collect("Progressive Mine Elevator", 24) self.collect("Mining Level", 12) @@ -58,10 +53,12 @@ class TestRaccoonBundlesLogic(SVTestBase): self.collect("Fishing Level", 10) self.collect("Furnace Recipe") - self.assertFalse(raccoon_rule_1(self.multiworld.state)) - self.assertFalse(raccoon_rule_3(self.multiworld.state)) + # The first raccoon bundle is a fishing one + self.assert_cannot_reach_location("Raccoon Request 1") + # The third raccoon bundle is a foraging one + self.assert_cannot_reach_location("Raccoon Request 3") self.collect("Fish Smoker Recipe") - self.assertTrue(raccoon_rule_1(self.multiworld.state)) - self.assertTrue(raccoon_rule_3(self.multiworld.state)) + self.assert_can_reach_location("Raccoon Request 1") + self.assert_can_reach_location("Raccoon Request 3") diff --git a/worlds/stardew_valley/test/rules/TestCookingRecipes.py b/worlds/stardew_valley/test/rules/TestCookingRecipes.py index d5f9da73c9..b3aafdb690 100644 --- a/worlds/stardew_valley/test/rules/TestCookingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCookingRecipes.py @@ -14,18 +14,17 @@ class TestRecipeLearnLogic(SVTestBase): def test_can_learn_qos_recipe(self): location = "Cook Radish Salad" - rule = self.world.logic.region.can_reach_location(location) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.collect(self.create_item("Progressive House")) self.multiworld.state.collect(self.create_item("Radish Seeds")) self.multiworld.state.collect(self.create_item("Spring")) self.multiworld.state.collect(self.create_item("Summer")) self.collect_lots_of_money() - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.collect(self.create_item("The Queen of Sauce")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location(location) class TestRecipeReceiveLogic(SVTestBase): @@ -39,34 +38,32 @@ class TestRecipeReceiveLogic(SVTestBase): def test_can_learn_qos_recipe(self): location = "Cook Radish Salad" - rule = self.world.logic.region.can_reach_location(location) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.collect(self.create_item("Progressive House")) self.multiworld.state.collect(self.create_item("Radish Seeds")) self.multiworld.state.collect(self.create_item("Summer")) self.collect_lots_of_money() - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) spring = self.create_item("Spring") qos = self.create_item("The Queen of Sauce") self.multiworld.state.collect(spring) self.multiworld.state.collect(qos) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.remove(spring) self.multiworld.state.remove(qos) self.multiworld.state.collect(self.create_item("Radish Salad Recipe")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location(location) def test_get_chefsanity_check_recipe(self): location = "Radish Salad Recipe" - rule = self.world.logic.region.can_reach_location(location) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.collect(self.create_item("Spring")) self.collect_lots_of_money() - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) seeds = self.create_item("Radish Seeds") summer = self.create_item("Summer") @@ -74,10 +71,10 @@ class TestRecipeReceiveLogic(SVTestBase): self.multiworld.state.collect(seeds) self.multiworld.state.collect(summer) self.multiworld.state.collect(house) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location(location) self.multiworld.state.remove(seeds) self.multiworld.state.remove(summer) self.multiworld.state.remove(house) self.multiworld.state.collect(self.create_item("The Queen of Sauce")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location(location) diff --git a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py index 46a1b73d0b..94d6bc145a 100644 --- a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py @@ -13,8 +13,6 @@ class TestCraftsanityLogic(SVTestBase): } def test_can_craft_recipe(self): - location = "Craft Marble Brazier" - rule = self.world.logic.region.can_reach_location(location) self.collect([self.create_item("Progressive Pickaxe")] * 4) self.collect([self.create_item("Progressive Fishing Rod")] * 4) self.collect([self.create_item("Progressive Sword")] * 4) @@ -23,18 +21,16 @@ class TestCraftsanityLogic(SVTestBase): self.collect([self.create_item("Combat Level")] * 10) self.collect([self.create_item("Fishing Level")] * 10) self.collect_all_the_money() - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Craft Marble Brazier") self.multiworld.state.collect(self.create_item("Marble Brazier Recipe")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location("Craft Marble Brazier") def test_can_learn_crafting_recipe(self): - location = "Marble Brazier Recipe" - rule = self.world.logic.region.can_reach_location(location) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Marble Brazier Recipe") self.collect_lots_of_money() - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location("Marble Brazier Recipe") def test_can_craft_festival_recipe(self): recipe = all_crafting_recipes_by_name["Jack-O-Lantern"] @@ -42,13 +38,13 @@ class TestCraftsanityLogic(SVTestBase): self.multiworld.state.collect(self.create_item("Torch Recipe")) self.collect_lots_of_money() rule = self.world.logic.crafting.can_craft(recipe) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_rule_false(rule) self.multiworld.state.collect(self.create_item("Fall")) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_rule_false(rule) self.multiworld.state.collect(self.create_item("Jack-O-Lantern Recipe")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_rule_true(rule) def test_require_furnace_recipe_for_smelting_checks(self): locations = ["Craft Furnace", "Smelting", "Copper Pickaxe Upgrade", "Gold Trash Can Upgrade"] @@ -83,13 +79,13 @@ class TestCraftsanityWithFestivalsLogic(SVTestBase): self.multiworld.state.collect(self.create_item("Fall")) self.collect_lots_of_money() rule = self.world.logic.crafting.can_craft(recipe) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_rule_false(rule) self.multiworld.state.collect(self.create_item("Jack-O-Lantern Recipe")) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_rule_false(rule) self.multiworld.state.collect(self.create_item("Torch Recipe")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_rule_true(rule) class TestNoCraftsanityLogic(SVTestBase): @@ -105,7 +101,7 @@ class TestNoCraftsanityLogic(SVTestBase): def test_can_craft_recipe(self): recipe = all_crafting_recipes_by_name["Wood Floor"] rule = self.world.logic.crafting.can_craft(recipe) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_rule_true(rule) def test_can_craft_festival_recipe(self): recipe = all_crafting_recipes_by_name["Jack-O-Lantern"] @@ -116,7 +112,7 @@ class TestNoCraftsanityLogic(SVTestBase): self.assertFalse(result) self.collect([self.create_item("Progressive Season")] * 2) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_rule_true(rule) def test_requires_mining_levels_for_smelting_checks(self): locations = ["Smelting", "Copper Pickaxe Upgrade", "Gold Trash Can Upgrade"] @@ -151,7 +147,7 @@ class TestNoCraftsanityWithFestivalsLogic(SVTestBase): self.multiworld.state.collect(self.create_item("Fall")) self.collect_lots_of_money() rule = self.world.logic.crafting.can_craft(recipe) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_rule_false(rule) self.multiworld.state.collect(self.create_item("Jack-O-Lantern Recipe")) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_rule_true(rule) diff --git a/worlds/stardew_valley/test/rules/TestDonations.py b/worlds/stardew_valley/test/rules/TestDonations.py index 3927bd09a4..d50f87d3e9 100644 --- a/worlds/stardew_valley/test/rules/TestDonations.py +++ b/worlds/stardew_valley/test/rules/TestDonations.py @@ -16,12 +16,12 @@ class TestDonationLogicAll(SVTestBase): self.collect_all_except(railroad_item) for donation in locations_by_tag[LocationTags.MUSEUM_DONATIONS]: - self.assertFalse(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_cannot_reach_location(donation.name) self.multiworld.state.collect(self.create_item(railroad_item)) for donation in locations_by_tag[LocationTags.MUSEUM_DONATIONS]: - self.assertTrue(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_can_reach_location(donation.name) class TestDonationLogicRandomized(SVTestBase): @@ -37,12 +37,12 @@ class TestDonationLogicRandomized(SVTestBase): LocationTags.MUSEUM_DONATIONS in location_table[location.name].tags] for donation in donation_locations: - self.assertFalse(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_cannot_reach_location(donation.name) self.multiworld.state.collect(self.create_item(railroad_item)) for donation in donation_locations: - self.assertTrue(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_can_reach_location(donation.name) class TestDonationLogicMilestones(SVTestBase): @@ -56,12 +56,12 @@ class TestDonationLogicMilestones(SVTestBase): self.collect_all_except(railroad_item) for donation in locations_by_tag[LocationTags.MUSEUM_MILESTONES]: - self.assertFalse(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_cannot_reach_location(donation.name) self.multiworld.state.collect(self.create_item(railroad_item)) for donation in locations_by_tag[LocationTags.MUSEUM_MILESTONES]: - self.assertTrue(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state)) + self.assert_can_reach_location(donation.name) def swap_museum_and_bathhouse(multiworld, player): diff --git a/worlds/stardew_valley/test/rules/TestFishing.py b/worlds/stardew_valley/test/rules/TestFishing.py index 74a33f3668..6a6a4bb315 100644 --- a/worlds/stardew_valley/test/rules/TestFishing.py +++ b/worlds/stardew_valley/test/rules/TestFishing.py @@ -42,19 +42,18 @@ class TestNeedRegionToCatchFish(SVTestBase): with self.subTest(f"Region rules for {fish}"): self.collect_all_the_money() item_names = fish_and_items[fish] - location = self.multiworld.get_location(f"Fishsanity: {fish}", self.player) - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location(f"Fishsanity: {fish}") items = [] for item_name in item_names: items.append(self.collect(item_name)) with self.subTest(f"{fish} can be reached with {item_names}"): - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(f"Fishsanity: {fish}") for item_required in items: self.multiworld.state = self.original_state.copy() with self.subTest(f"{fish} requires {item_required.name}"): for item_to_collect in items: if item_to_collect.name != item_required.name: self.collect(item_to_collect) - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location(f"Fishsanity: {fish}") self.multiworld.state = self.original_state.copy() diff --git a/worlds/stardew_valley/test/rules/TestFriendship.py b/worlds/stardew_valley/test/rules/TestFriendship.py index 3e9109ed50..9cd3127aa3 100644 --- a/worlds/stardew_valley/test/rules/TestFriendship.py +++ b/worlds/stardew_valley/test/rules/TestFriendship.py @@ -47,12 +47,8 @@ class TestFriendsanityDatingRules(SVTestBase): for i in range(1, max_reachable + 1): if i % step != 0 and i != 14: continue - location = f"{prefix}{npc} {i}{suffix}" - can_reach = self.world.logic.region.can_reach_location(location)(self.multiworld.state) - self.assertTrue(can_reach, f"Should be able to earn relationship up to {i} hearts") + self.assert_can_reach_location(f"{prefix}{npc} {i}{suffix}") for i in range(max_reachable + 1, 14 + 1): if i % step != 0 and i != 14: continue - location = f"{prefix}{npc} {i}{suffix}" - can_reach = self.world.logic.region.can_reach_location(location)(self.multiworld.state) - self.assertFalse(can_reach, f"Should not be able to earn relationship up to {i} hearts") + self.assert_cannot_reach_location(f"{prefix}{npc} {i}{suffix}") diff --git a/worlds/stardew_valley/test/rules/TestShipping.py b/worlds/stardew_valley/test/rules/TestShipping.py index 125b7f31d0..fc61ae8e2a 100644 --- a/worlds/stardew_valley/test/rules/TestShipping.py +++ b/worlds/stardew_valley/test/rules/TestShipping.py @@ -76,10 +76,8 @@ class TestShipsanityEverything(SVTestBase): for location in shipsanity_locations: with self.subTest(location.name): - self.assertFalse(self.world.logic.region.can_reach_location(location.name)(self.multiworld.state)) + self.assert_cannot_reach_location(location.name) self.collect(bin_item) - shipsanity_rule = self.world.logic.region.can_reach_location(location.name) - self.assert_rule_true(shipsanity_rule, self.multiworld.state) - + self.assert_can_reach_location(location.name) self.remove(bin_item) diff --git a/worlds/stardew_valley/test/rules/TestSkills.py b/worlds/stardew_valley/test/rules/TestSkills.py index ee605bfaa1..a5957488a1 100644 --- a/worlds/stardew_valley/test/rules/TestSkills.py +++ b/worlds/stardew_valley/test/rules/TestSkills.py @@ -35,14 +35,13 @@ class TestSkillProgressionProgressive(SVTestBase): for level in range(1, 11): location_name = f"Level {level} {skill}" - location = self.multiworld.get_location(location_name, self.player) with self.subTest(location_name): if level > 1: - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location(location_name) self.collect(f"{skill} Level") - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(location_name) self.reset_collection_state() @@ -87,8 +86,7 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): for skill in all_vanilla_skills: with self.subTest(skill): - location = self.multiworld.get_location(f"{skill} Mastery", self.player) - self.assert_can_reach_location(location, self.multiworld.state) + self.assert_can_reach_location(f"{skill} Mastery") self.reset_collection_state() @@ -98,8 +96,7 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): self.collect_everything() self.remove_one_by_name(f"{skill} Level") - location = self.multiworld.get_location(f"{skill} Mastery", self.player) - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location(f"{skill} Mastery") self.reset_collection_state() @@ -107,7 +104,6 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): self.collect_everything() self.remove_one_by_name(f"Progressive Pickaxe") - location = self.multiworld.get_location("Mining Mastery", self.player) - self.assert_cannot_reach_location(location, self.multiworld.state) + self.assert_cannot_reach_location("Mining Mastery") self.reset_collection_state() diff --git a/worlds/stardew_valley/test/rules/TestTools.py b/worlds/stardew_valley/test/rules/TestTools.py index 31dd581916..bda29e3d74 100644 --- a/worlds/stardew_valley/test/rules/TestTools.py +++ b/worlds/stardew_valley/test/rules/TestTools.py @@ -18,37 +18,37 @@ class TestProgressiveToolsLogic(SVTestBase): self.multiworld.state.prog_items = {1: Counter()} sturgeon_rule = self.world.logic.has("Sturgeon") - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) summer = self.create_item("Summer") self.multiworld.state.collect(summer) - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) fishing_rod = self.create_item("Progressive Fishing Rod") self.multiworld.state.collect(fishing_rod) self.multiworld.state.collect(fishing_rod) - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) fishing_level = self.create_item("Fishing Level") self.multiworld.state.collect(fishing_level) - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) self.multiworld.state.collect(fishing_level) self.multiworld.state.collect(fishing_level) self.multiworld.state.collect(fishing_level) self.multiworld.state.collect(fishing_level) self.multiworld.state.collect(fishing_level) - self.assert_rule_true(sturgeon_rule, self.multiworld.state) + self.assert_rule_true(sturgeon_rule) self.remove(summer) - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) winter = self.create_item("Winter") self.multiworld.state.collect(winter) - self.assert_rule_true(sturgeon_rule, self.multiworld.state) + self.assert_rule_true(sturgeon_rule) self.remove(fishing_rod) - self.assert_rule_false(sturgeon_rule, self.multiworld.state) + self.assert_rule_false(sturgeon_rule) def test_old_master_cannoli(self): self.multiworld.state.prog_items = {1: Counter()} @@ -58,35 +58,34 @@ class TestProgressiveToolsLogic(SVTestBase): self.multiworld.state.collect(self.create_item("Summer")) self.collect_lots_of_money() - rule = self.world.logic.region.can_reach_location("Old Master Cannoli") - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") fall = self.create_item("Fall") self.multiworld.state.collect(fall) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") tuesday = self.create_item("Traveling Merchant: Tuesday") self.multiworld.state.collect(tuesday) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") rare_seed = self.create_item("Rare Seed") self.multiworld.state.collect(rare_seed) - self.assert_rule_true(rule, self.multiworld.state) + self.assert_can_reach_location("Old Master Cannoli") self.remove(fall) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") self.remove(tuesday) green_house = self.create_item("Greenhouse") self.multiworld.state.collect(green_house) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") friday = self.create_item("Traveling Merchant: Friday") self.multiworld.state.collect(friday) - self.assertTrue(self.multiworld.get_location("Old Master Cannoli", 1).access_rule(self.multiworld.state)) + self.assert_can_reach_location("Old Master Cannoli") self.remove(green_house) - self.assert_rule_false(rule, self.multiworld.state) + self.assert_cannot_reach_location("Old Master Cannoli") self.remove(friday) @@ -106,13 +105,13 @@ class TestToolVanillaRequiresBlacksmith(SVTestBase): for tool in [Tool.pickaxe, Tool.axe, Tool.hoe, Tool.trash_can, Tool.watering_can]: for material in [ToolMaterial.copper, ToolMaterial.iron, ToolMaterial.gold, ToolMaterial.iridium]: - self.assert_rule_false(self.world.logic.tool.has_tool(tool, material), self.multiworld.state) + self.assert_rule_false(self.world.logic.tool.has_tool(tool, material)) self.multiworld.state.collect(self.create_item(railroad_item)) for tool in [Tool.pickaxe, Tool.axe, Tool.hoe, Tool.trash_can, Tool.watering_can]: for material in [ToolMaterial.copper, ToolMaterial.iron, ToolMaterial.gold, ToolMaterial.iridium]: - self.assert_rule_true(self.world.logic.tool.has_tool(tool, material), self.multiworld.state) + self.assert_rule_true(self.world.logic.tool.has_tool(tool, material)) def test_cannot_get_fishing_rod_without_willy_access(self): railroad_item = "Railroad Boulder Removed" @@ -120,12 +119,12 @@ class TestToolVanillaRequiresBlacksmith(SVTestBase): self.collect_all_except(railroad_item) for fishing_rod_level in [3, 4]: - self.assert_rule_false(self.world.logic.tool.has_fishing_rod(fishing_rod_level), self.multiworld.state) + self.assert_rule_false(self.world.logic.tool.has_fishing_rod(fishing_rod_level)) self.multiworld.state.collect(self.create_item(railroad_item)) for fishing_rod_level in [3, 4]: - self.assert_rule_true(self.world.logic.tool.has_fishing_rod(fishing_rod_level), self.multiworld.state) + self.assert_rule_true(self.world.logic.tool.has_fishing_rod(fishing_rod_level)) def place_region_at_entrance(multiworld, player, region, entrance): From 4149db1a015c6d0a87d1f2b52883d946d6c7ee11 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Tue, 8 Apr 2025 17:54:50 -0400 Subject: [PATCH 011/199] LADX: Stop using Utils.get_options (#4818) * init * use get * Update LinksAwakeningClient.py Co-authored-by: Fabian Dill * Update LinksAwakeningClient.py Co-authored-by: Aaron Wagener --------- Co-authored-by: Fabian Dill Co-authored-by: Aaron Wagener --- LinksAwakeningClient.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index bdfaa74625..69f50938d2 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -26,6 +26,7 @@ import typing from CommonClient import (CommonContext, get_base_parser, gui_enabled, logger, server_loop) from NetUtils import ClientStatus +from worlds.ladx import LinksAwakeningWorld from worlds.ladx.Common import BASE_ID as LABaseID from worlds.ladx.GpsTracker import GpsTracker from worlds.ladx.TrackerConsts import storage_key @@ -741,8 +742,8 @@ class LinksAwakeningContext(CommonContext): await asyncio.sleep(1.0) def run_game(romfile: str) -> None: - auto_start = typing.cast(typing.Union[bool, str], - Utils.get_options()["ladx_options"].get("rom_start", True)) + auto_start = LinksAwakeningWorld.settings.rom_start + if auto_start is True: import webbrowser webbrowser.open(romfile) From 98477e27aae99f6c4663a0fb11cb76d9581a51fc Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Tue, 8 Apr 2025 22:57:31 +0100 Subject: [PATCH 012/199] Core: Speed up fill_restrictive item_pool pop loop (#4536) * Core: Speed up fill_restrictive item_pool pop loop Items from `reachable_items` are placed in last-in-first-out order, so items being placed will be towards the end of `item_pool`, but the iteration to find the item was iterating from the start of `item_pool`. Now also uses `del` instead of `.pop()` for an additional, tiny, performance increase. It is unlikely for there to be a noticeable difference in most cases. Only generating with many worlds with a high percentage of progression items and fast access rules is likely to see a difference with this change. --skip_output generation of 400 template A Hat in Time yamls with progression balancing disabled goes from 76s to 43s (43% reduction) for me with this patch. This placed 43200 progression items out of 89974 items total (48% progression items). * Fix comment typo "be" was missing. --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- Fill.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Fill.py b/Fill.py index fe39b74fbe..cce7aec209 100644 --- a/Fill.py +++ b/Fill.py @@ -75,9 +75,11 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati items_to_place.append(reachable_items[next_player].pop()) for item in items_to_place: - for p, pool_item in enumerate(item_pool): + # The items added into `reachable_items` are placed starting from the end of each deque in + # `reachable_items`, so the items being placed are more likely to be found towards the end of `item_pool`. + for p, pool_item in enumerate(reversed(item_pool), start=1): if pool_item is item: - item_pool.pop(p) + del item_pool[-p] break maximum_exploration_state = sweep_from_pool( From f2cb16a5bef78639b340e23d1bdde0660a24f70e Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 9 Apr 2025 01:38:46 +0200 Subject: [PATCH 013/199] CI: update action ubuntu build runners to 22.04 (#4847) --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2b450fe46e..7529f693bd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -99,8 +99,8 @@ jobs: if-no-files-found: error retention-days: 7 # keep for 7 days, should be enough - build-ubuntu2004: - runs-on: ubuntu-20.04 + build-ubuntu2204: + runs-on: ubuntu-22.04 steps: # - copy code below to release.yml - - uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f12e8fb80c..20d4d2fe32 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,8 +29,8 @@ jobs: # build-release-windows: # this is done by hand because of signing # build-release-macos: # LF volunteer - build-release-ubuntu2004: - runs-on: ubuntu-20.04 + build-release-ubuntu2204: + runs-on: ubuntu-22.04 steps: - name: Set env run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV From 0f7deb1d2a11c9f820d193c123052d1742d912f7 Mon Sep 17 00:00:00 2001 From: Zach 'Phar' Parks Date: Tue, 8 Apr 2025 23:46:46 -0500 Subject: [PATCH 014/199] WebHost: Remove styleController.js and replace functionality with HTML/CSS. (#4852) * ensure footer stays at bottom of page without JS * Remove some other usages. --- WebHostLib/static/assets/gameInfo.js | 1 - WebHostLib/static/assets/hostGame.js | 2 - WebHostLib/static/assets/styleController.js | 47 --------------------- WebHostLib/static/assets/tutorial.js | 1 - WebHostLib/static/styles/globalStyles.css | 7 +++ WebHostLib/templates/404.html | 2 +- WebHostLib/templates/hostGame.html | 3 +- WebHostLib/templates/landing.html | 2 +- WebHostLib/templates/pageWrapper.html | 29 +++++++------ WebHostLib/templates/seedError.html | 2 +- WebHostLib/templates/startPlaying.html | 3 +- WebHostLib/templates/viewSeed.html | 2 +- WebHostLib/templates/waitSeed.html | 2 +- 13 files changed, 30 insertions(+), 73 deletions(-) delete mode 100644 WebHostLib/static/assets/styleController.js diff --git a/WebHostLib/static/assets/gameInfo.js b/WebHostLib/static/assets/gameInfo.js index 1d6d136135..797c9f6448 100644 --- a/WebHostLib/static/assets/gameInfo.js +++ b/WebHostLib/static/assets/gameInfo.js @@ -23,7 +23,6 @@ window.addEventListener('load', () => { showdown.setOption('strikethrough', true); showdown.setOption('literalMidWordUnderscores', true); gameInfo.innerHTML += (new showdown.Converter()).makeHtml(results); - adjustHeaderWidth(); // Reset the id of all header divs to something nicer for (const header of document.querySelectorAll('h1, h2, h3, h4, h5, h6')) { diff --git a/WebHostLib/static/assets/hostGame.js b/WebHostLib/static/assets/hostGame.js index db1ab1ddde..01a8da06e5 100644 --- a/WebHostLib/static/assets/hostGame.js +++ b/WebHostLib/static/assets/hostGame.js @@ -6,6 +6,4 @@ window.addEventListener('load', () => { document.getElementById('file-input').addEventListener('change', () => { document.getElementById('host-game-form').submit(); }); - - adjustFooterHeight(); }); diff --git a/WebHostLib/static/assets/styleController.js b/WebHostLib/static/assets/styleController.js deleted file mode 100644 index 924e86ee26..0000000000 --- a/WebHostLib/static/assets/styleController.js +++ /dev/null @@ -1,47 +0,0 @@ -const adjustFooterHeight = () => { - // If there is no footer on this page, do nothing - const footer = document.getElementById('island-footer'); - if (!footer) { return; } - - // If the body is taller than the window, also do nothing - if (document.body.offsetHeight > window.innerHeight) { - footer.style.marginTop = '0'; - return; - } - - // Add a margin-top to the footer to position it at the bottom of the screen - const sibling = footer.previousElementSibling; - const margin = (window.innerHeight - sibling.offsetTop - sibling.offsetHeight - footer.offsetHeight); - if (margin < 1) { - footer.style.marginTop = '0'; - return; - } - footer.style.marginTop = `${margin}px`; -}; - -const adjustHeaderWidth = () => { - // If there is no header, do nothing - const header = document.getElementById('base-header'); - if (!header) { return; } - - const tempDiv = document.createElement('div'); - tempDiv.style.width = '100px'; - tempDiv.style.height = '100px'; - tempDiv.style.overflow = 'scroll'; - tempDiv.style.position = 'absolute'; - tempDiv.style.top = '-500px'; - document.body.appendChild(tempDiv); - const scrollbarWidth = tempDiv.offsetWidth - tempDiv.clientWidth; - document.body.removeChild(tempDiv); - - const documentRoot = document.compatMode === 'BackCompat' ? document.body : document.documentElement; - const margin = (documentRoot.scrollHeight > documentRoot.clientHeight) ? 0-scrollbarWidth : 0; - document.getElementById('base-header-right').style.marginRight = `${margin}px`; -}; - -window.addEventListener('load', () => { - window.addEventListener('resize', adjustFooterHeight); - window.addEventListener('resize', adjustHeaderWidth); - adjustFooterHeight(); - adjustHeaderWidth(); -}); diff --git a/WebHostLib/static/assets/tutorial.js b/WebHostLib/static/assets/tutorial.js index d527966005..c9022719fb 100644 --- a/WebHostLib/static/assets/tutorial.js +++ b/WebHostLib/static/assets/tutorial.js @@ -25,7 +25,6 @@ window.addEventListener('load', () => { showdown.setOption('literalMidWordUnderscores', true); showdown.setOption('disableForced4SpacesIndentedSublists', true); tutorialWrapper.innerHTML += (new showdown.Converter()).makeHtml(results); - adjustHeaderWidth(); const title = document.querySelector('h1') if (title) { diff --git a/WebHostLib/static/styles/globalStyles.css b/WebHostLib/static/styles/globalStyles.css index 1a0144830e..adcee6581b 100644 --- a/WebHostLib/static/styles/globalStyles.css +++ b/WebHostLib/static/styles/globalStyles.css @@ -36,6 +36,13 @@ html{ body{ margin: 0; + display: flex; + flex-direction: column; + min-height: calc(100vh - 110px); +} + +main { + flex-grow: 1; } a{ diff --git a/WebHostLib/templates/404.html b/WebHostLib/templates/404.html index 9d567510ee..6c91fed4ac 100644 --- a/WebHostLib/templates/404.html +++ b/WebHostLib/templates/404.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} Page Not Found (404) @@ -13,5 +14,4 @@ The page you're looking for doesn't exist.
Click here to return to safety. - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/hostGame.html b/WebHostLib/templates/hostGame.html index 2bcb993af5..d7d0a96331 100644 --- a/WebHostLib/templates/hostGame.html +++ b/WebHostLib/templates/hostGame.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Upload Multidata @@ -27,6 +28,4 @@ - - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/landing.html b/WebHostLib/templates/landing.html index b489ef18ac..e7d0569e6c 100644 --- a/WebHostLib/templates/landing.html +++ b/WebHostLib/templates/landing.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Archipelago @@ -57,5 +58,4 @@ - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/pageWrapper.html b/WebHostLib/templates/pageWrapper.html index c7dda523ef..4347b4add3 100644 --- a/WebHostLib/templates/pageWrapper.html +++ b/WebHostLib/templates/pageWrapper.html @@ -5,26 +5,29 @@ - {% block head %} Archipelago {% endblock %} +
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
+ {% for message in messages | unique %} +
{{ message }}
+ {% endfor %} +
+ {% endif %} + {% endwith %} -{% with messages = get_flashed_messages() %} - {% if messages %} -
- {% for message in messages | unique %} -
{{ message }}
- {% endfor %} -
+ {% block body %} + {% endblock %} +
+ + {% if show_footer %} + {% include "islandFooter.html" %} {% endif %} -{% endwith %} - -{% block body %} -{% endblock %} - diff --git a/WebHostLib/templates/seedError.html b/WebHostLib/templates/seedError.html index 0f5850da1b..a5eec1a4cc 100644 --- a/WebHostLib/templates/seedError.html +++ b/WebHostLib/templates/seedError.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} Generation failed, please retry. @@ -15,5 +16,4 @@ {{ seed_error }} - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/startPlaying.html b/WebHostLib/templates/startPlaying.html index ab2f021d61..9e09474bd0 100644 --- a/WebHostLib/templates/startPlaying.html +++ b/WebHostLib/templates/startPlaying.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Start Playing @@ -26,6 +27,4 @@

- - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/viewSeed.html b/WebHostLib/templates/viewSeed.html index a8478c95c3..70ffe23b7b 100644 --- a/WebHostLib/templates/viewSeed.html +++ b/WebHostLib/templates/viewSeed.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} View Seed {{ seed.id|suuid }} @@ -50,5 +51,4 @@ - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/waitSeed.html b/WebHostLib/templates/waitSeed.html index 9041b901b5..235c2f1665 100644 --- a/WebHostLib/templates/waitSeed.html +++ b/WebHostLib/templates/waitSeed.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} Generation in Progress @@ -15,5 +16,4 @@ Waiting for game to generate, this page auto-refreshes to check. - {% include 'islandFooter.html' %} {% endblock %} From e211dfa1c2f6da28c17353749e319ec8a4ec7a4f Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 9 Apr 2025 07:43:28 +0200 Subject: [PATCH 015/199] WebHost: use JS to refresh waitSeed if scripting is enabled (#4843) --- WebHostLib/templates/waitSeed.html | 34 +++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/WebHostLib/templates/waitSeed.html b/WebHostLib/templates/waitSeed.html index 235c2f1665..f2729353a6 100644 --- a/WebHostLib/templates/waitSeed.html +++ b/WebHostLib/templates/waitSeed.html @@ -4,7 +4,9 @@ {% block head %} Generation in Progress - + {% endblock %} @@ -16,4 +18,34 @@ Waiting for game to generate, this page auto-refreshes to check. + {% endblock %} From f93734f9e3b7b805bff4edacc204fbf31559e345 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:20:56 -0400 Subject: [PATCH 016/199] Pokemon Red and Blue: PC Item Fix (#4835) * Pokemon Red and Blue PC Item fix * Respect non_local_items for PC Item * prefer exclude if also in priority locations --------- Co-authored-by: alchav --- worlds/pokemon_rb/regions.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index a7c0b6d533..84c9b25735 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -1580,16 +1580,22 @@ def create_regions(world): world.random.shuffle(world.item_pool) if not world.options.key_items_only: - if "Player's House 2F - Player's PC" in world.options.exclude_locations: - acceptable_item = lambda item: item.excludable - elif "Player's House 2F - Player's PC" in world.options.priority_locations: - acceptable_item = lambda item: item.advancement - else: - acceptable_item = lambda item: True + def acceptable_item(item): + return ("Badge" not in item.name and "Trap" not in item.name and item.name != "Pokedex" + and "Coins" not in item.name and "Progressive" not in item.name + and ("Player's House 2F - Player's PC" not in world.options.exclude_locations or item.excludable) + and ("Player's House 2F - Player's PC" in world.options.exclude_locations or + "Player's House 2F - Player's PC" not in world.options.priority_locations or item.advancement)) for i, item in enumerate(world.item_pool): - if acceptable_item(item): + if acceptable_item(item) and (item.name not in world.options.non_local_items.value): world.pc_item = world.item_pool.pop(i) break + else: + for i, item in enumerate(world.item_pool): + if acceptable_item(item): + world.pc_item = world.item_pool.pop(i) + break + advancement_items = [item.name for item in world.item_pool if item.advancement] \ + [item.name for item in world.multiworld.precollected_items[world.player] if From 1ee749b3522735bdd7f250a69d7b3a2a1b19d4a4 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Wed, 9 Apr 2025 22:21:16 +0200 Subject: [PATCH 017/199] SC2 Client: Fix missing mission tooltip after KivyMD switch (#4827) --- worlds/sc2/ClientGui.py | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/worlds/sc2/ClientGui.py b/worlds/sc2/ClientGui.py index 27857715a8..d16acad83d 100644 --- a/worlds/sc2/ClientGui.py +++ b/worlds/sc2/ClientGui.py @@ -5,12 +5,11 @@ from NetUtils import JSONMessagePart from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser from kivy.app import App from kivy.clock import Clock -from kivymd.uix.tab import MDTabsItem, MDTabsItemText from kivy.uix.gridlayout import GridLayout from kivy.lang import Builder from kivy.uix.label import Label from kivy.uix.button import Button -from kivy.uix.floatlayout import FloatLayout +from kivymd.uix.tooltip import MDTooltip from kivy.uix.scrollview import ScrollView from kivy.properties import StringProperty @@ -26,30 +25,22 @@ class HoverableButton(HoverBehavior, Button): pass -class MissionButton(HoverableButton): +class MissionButton(HoverableButton, MDTooltip): tooltip_text = StringProperty("Test") def __init__(self, *args, **kwargs): - super(HoverableButton, self).__init__(*args, **kwargs) - self.layout = FloatLayout() - self.popuplabel = ServerToolTip(text=self.text, markup=True) - self.popuplabel.padding = [5, 2, 5, 2] - self.layout.add_widget(self.popuplabel) + super(HoverableButton, self).__init__(**kwargs) + self._tooltip = ServerToolTip(text=self.text, markup=True) + self._tooltip.padding = [5, 2, 5, 2] def on_enter(self): - self.popuplabel.text = self.tooltip_text + self._tooltip.text = self.tooltip_text - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - if self.tooltip_text == "": - self.ctx.current_tooltip = None - else: - App.get_running_app().root.add_widget(self.layout) - self.ctx.current_tooltip = self.layout + if self.tooltip_text != "": + self.display_tooltip() def on_leave(self): - self.ctx.ui.clear_tooltip() + self.remove_tooltip() @property def ctx(self) -> SC2Context: From b7263edfd0512949c0dbfef86e1e48bd43c13890 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 9 Apr 2025 19:41:07 -0400 Subject: [PATCH 018/199] Lingo: Removed unnecessary "global" keywords (#4854) --- worlds/lingo/items.py | 2 -- worlds/lingo/locations.py | 2 -- worlds/lingo/utils/pickle_static_data.py | 21 ++------------------- 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/worlds/lingo/items.py b/worlds/lingo/items.py index b773caeb4e..338ddffa5d 100644 --- a/worlds/lingo/items.py +++ b/worlds/lingo/items.py @@ -58,8 +58,6 @@ def get_prog_item_classification(item_name: str): def load_item_data(): - global ALL_ITEM_TABLE, ITEMS_BY_GROUP - for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]: ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), get_prog_item_classification(color), ItemType.COLOR, False, []) diff --git a/worlds/lingo/locations.py b/worlds/lingo/locations.py index c527e522fb..bcd14fc5a7 100644 --- a/worlds/lingo/locations.py +++ b/worlds/lingo/locations.py @@ -35,8 +35,6 @@ LOCATIONS_BY_GROUP: Dict[str, List[str]] = {} def load_location_data(): - global ALL_LOCATION_TABLE, LOCATIONS_BY_GROUP - for room_name, panels in PANELS_BY_ROOM.items(): for panel_name, panel in panels.items(): location_name = f"{room_name} - {panel_name}" if panel.location_name is None else panel.location_name diff --git a/worlds/lingo/utils/pickle_static_data.py b/worlds/lingo/utils/pickle_static_data.py index df82a12861..740e129bcb 100644 --- a/worlds/lingo/utils/pickle_static_data.py +++ b/worlds/lingo/utils/pickle_static_data.py @@ -58,8 +58,7 @@ def hash_file(path): def load_static_data(ll1_path, ids_path): - global PAINTING_EXITS, SPECIAL_ITEM_IDS, PANEL_LOCATION_IDS, DOOR_LOCATION_IDS, DOOR_ITEM_IDS, \ - DOOR_GROUP_ITEM_IDS, PROGRESSIVE_ITEM_IDS, PANEL_DOOR_ITEM_IDS, PANEL_GROUP_ITEM_IDS + global PAINTING_EXITS # Load in all item and location IDs. These are broken up into groups based on the type of item/location. with open(ids_path, "r") as file: @@ -128,7 +127,7 @@ def load_static_data(ll1_path, ids_path): def process_single_entrance(source_room: str, room_name: str, door_obj) -> RoomEntrance: - global PAINTING_ENTRANCES, PAINTING_EXIT_ROOMS + global PAINTING_ENTRANCES entrance_type = EntranceType.NORMAL if "painting" in door_obj and door_obj["painting"]: @@ -175,8 +174,6 @@ def process_entrance(source_room, doors, room_obj): def process_panel_door(room_name, panel_door_name, panel_door_data): - global PANEL_DOORS_BY_ROOM, PANEL_DOOR_BY_PANEL_BY_ROOM - panels: List[RoomAndPanel] = list() for panel in panel_door_data["panels"]: if isinstance(panel, dict): @@ -215,8 +212,6 @@ def process_panel_door(room_name, panel_door_name, panel_door_data): def process_panel(room_name, panel_name, panel_data): - global PANELS_BY_ROOM - # required_room can either be a single room or a list of rooms. if "required_room" in panel_data: if isinstance(panel_data["required_room"], list): @@ -310,8 +305,6 @@ def process_panel(room_name, panel_name, panel_data): def process_door(room_name, door_name, door_data): - global DOORS_BY_ROOM - # The item name associated with a door can be explicitly specified in the configuration. If it is not, it is # generated from the room and door name. if "item_name" in door_data: @@ -409,8 +402,6 @@ def process_door(room_name, door_name, door_data): def process_painting(room_name, painting_data): - global PAINTINGS, REQUIRED_PAINTING_ROOMS, REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS - # Read in information about this painting and store it in an object. painting_id = painting_data["id"] @@ -468,8 +459,6 @@ def process_painting(room_name, painting_data): def process_sunwarp(room_name, sunwarp_data): - global SUNWARP_ENTRANCES, SUNWARP_EXITS - if sunwarp_data["direction"] == "enter": SUNWARP_ENTRANCES[sunwarp_data["dots"] - 1] = room_name else: @@ -477,8 +466,6 @@ def process_sunwarp(room_name, sunwarp_data): def process_progressive_door(room_name, progression_name, progression_doors): - global PROGRESSIVE_ITEMS, PROGRESSIVE_DOORS_BY_ROOM - # Progressive items are configured as a list of doors. PROGRESSIVE_ITEMS.add(progression_name) @@ -497,8 +484,6 @@ def process_progressive_door(room_name, progression_name, progression_doors): def process_progressive_panel(room_name, progression_name, progression_panel_doors): - global PROGRESSIVE_ITEMS, PROGRESSIVE_PANELS_BY_ROOM - # Progressive items are configured as a list of panel doors. PROGRESSIVE_ITEMS.add(progression_name) @@ -517,8 +502,6 @@ def process_progressive_panel(room_name, progression_name, progression_panel_doo def process_room(room_name, room_data): - global ALL_ROOMS - room_obj = Room(room_name, []) if "entrances" in room_data: From e3b8a60584524e5dbb24cfc1542a3acb92da9360 Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 9 Apr 2025 20:29:11 -0500 Subject: [PATCH 019/199] Webhost: Fix Sphere Tracker crashing on item links (#4855) --- BaseClasses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4db3917985..4074108b4b 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -616,7 +616,7 @@ class MultiWorld(): locations: Set[Location] = set() events: Set[Location] = set() for location in self.get_filled_locations(): - if type(location.item.code) is int: + if type(location.item.code) is int and type(location.address) is int: locations.add(location) else: events.add(location) From 78c93d7e3905d932d284c72c525911fe1f731fe8 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 10 Apr 2025 12:00:48 -0500 Subject: [PATCH 020/199] Docs: Add FAQ section for corrupted metadata debugging (#4705) Co-authored-by: Scipio Wright --- docs/apworld_dev_faq.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 769a2fb3a0..6d7d23b488 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -66,3 +66,22 @@ The reason entrance access rules using `location.can_reach` and `entrance.can_re We recognize it can feel like a trap since it will not alert you when you are missing an indirect condition, and that some games have very complex access rules. As of [PR #3682 (Core: Region handling customization)](https://github.com/ArchipelagoMW/Archipelago/pull/3682) being merged, it is possible for a world to opt out of indirect conditions entirely, instead using the system of checking each entrance whenever a region has been reached, although this does come with a performance cost. Opting out of using indirect conditions should only be used by games that *really* need it. For most games, it should be reasonable to know all entrance → region dependencies, making indirect conditions preferred because they are much faster. + +--- + +### I uploaded the generated output of my world to the webhost and webhost is erroring on corrupted multidata + +The error `Could not load multidata. File may be corrupted or incompatible.` occurs when uploading a locally generated +file where there is an issue with the multidata contained within it. It may come with a description like +`(No module named 'worlds.myworld')` or `(global 'worlds.myworld.names.ItemNames' is forbidden)` + +Pickling is a way to compress python objects such that they can be decompressed and be used to rebuild the +python objects. This means that if one of your custom class instances ends up in the multidata, the server would not +be able to load that custom class to decompress the data, which can fail either because the custom class is unknown +(because it cannot load your world module) or the class it's attempting to import to decompress is deemed unsafe. + +Common situations where this can happen include: +* Using Option instances directly in slot_data. Ex: using `options.option_name` instead of `options.option_name.value`. + Also, consider using the `options.as_dict("option_name", "option_two")` helper. +* Using enums as Location/Item names in the datapackage. When building out `location_name_to_id` and `item_name_to_id`, + make sure that you are not using your enum class for either the names or ids in these mappings. From 399958c8814112ed266eef5734999544a9337da3 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 10 Apr 2025 12:03:05 -0500 Subject: [PATCH 021/199] The Messenger: Add an FAQ (#4718) --- worlds/messenger/docs/en_The Messenger.md | 20 ++++++++++++++++++-- worlds/messenger/options.py | 4 +++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/worlds/messenger/docs/en_The Messenger.md b/worlds/messenger/docs/en_The Messenger.md index a68ee5ba4c..1886162fc9 100644 --- a/worlds/messenger/docs/en_The Messenger.md +++ b/worlds/messenger/docs/en_The Messenger.md @@ -1,6 +1,7 @@ # The Messenger ## Quick Links + - [Setup](/tutorial/The%20Messenger/setup/en) - [Options Page](/games/The%20Messenger/player-options) - [Courier Github](https://github.com/Brokemia/Courier) @@ -26,6 +27,7 @@ obtained. You'll be forced to do sections of the game in different ways with you ## Where can I find items? You can find items wherever items can be picked up in the original game. This includes: + * Shopkeeper dialog where the player originally gains movement items * Quest Item pickups * Music Box notes @@ -42,6 +44,7 @@ group of items. Hinting for a group will choose a random item from the group tha for it. The groups you can use for The Messenger are: + * Notes - This covers the music notes * Keys - An alternative name for the music notes * Crest - The Sun and Moon Crests @@ -64,16 +67,29 @@ The groups you can use for The Messenger are: be entered in game. ## Known issues + * Ruxxtin Coffin cutscene will sometimes not play correctly, but will still reward the item * If you receive the Magic Firefly while in Quillshroom Marsh, The De-curse Queen cutscene will not play. You can exit to Searing Crags and re-enter to get it to play correctly. * Teleporting back to HQ, then returning to the same level you just left through a Portal can cause Ninja to run left and enter a different portal than the one entered by the player or lead to other incorrect inputs, causing a soft lock * Text entry menus don't accept controller input -* In power seal hunt mode, the chest must be opened by entering the shop from a level. Teleporting to HQ and opening the - chest will not work. ## What do I do if I have a problem? If you believe something happened that isn't intended, please get the `log.txt` from the folder of your game installation and send a bug report either on GitHub or the [Archipelago Discord Server](http://archipelago.gg/discord) + +## FAQ + +* The tracker says I can get some checks in Howling Grotto, but I can't defeat the Emerald Golem. How do I get there? + * Due to the way the vanilla game handles bosses and level transitions, if you die to him, the room will be unlocked, + and you can leave. +* I have the money wrench. Why won't the shopkeeper let me enter the sink? + * The money wrench is both an item you must find or receive from another player and a location check, which you must + purchase from the Artificer, as in vanilla. +* How do I unfreeze Manfred? Where is the monk? + * The monk will only appear near Manfred after you cleanse the Queen of Quills with the fairy (magic firefly). +* I have all the power seals I need to win, but nothing is happening when I open the chest. + * Due to how the level loading code works, I am currently unable to teleport you out of HQ at will; you must enter the + shop from within a level. diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index c7a0f543ba..aaf152fbf8 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -147,7 +147,9 @@ class MusicBox(DefaultOnToggle): class NotesNeeded(Range): - """How many notes are needed to access the Music Box.""" + """ + How many notes need to be found in order to access the Music Box. 6 are always needed to enter, so this places the others in your start inventory. + """ display_name = "Notes Needed" range_start = 1 range_end = 6 From 50fd42d0c2ade7fdd071c158cc172c42a416176e Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 10 Apr 2025 12:13:38 -0500 Subject: [PATCH 022/199] The Messenger: Add a plando guide (#4719) --- worlds/messenger/__init__.py | 10 ++- worlds/messenger/docs/plando_en.md | 101 +++++++++++++++++++++++++++++ worlds/messenger/options.py | 22 +------ 3 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 worlds/messenger/docs/plando_en.md diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 8bde3bbc7a..2382a46c31 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -46,8 +46,16 @@ class MessengerWeb(WebWorld): "setup/en", ["alwaysintreble"], ) + plando_en = Tutorial( + "The Messenger Plando Guide", + "A guide detailing The Messenger's various supported plando options.", + "English", + "plando_en.md", + "plando/en", + ["alwaysintreble"], + ) - tutorials = [tut_en] + tutorials = [tut_en, plando_en] class MessengerWorld(World): diff --git a/worlds/messenger/docs/plando_en.md b/worlds/messenger/docs/plando_en.md new file mode 100644 index 0000000000..920cf029d8 --- /dev/null +++ b/worlds/messenger/docs/plando_en.md @@ -0,0 +1,101 @@ +# The Messenger Plando Guide + +This guide details the usage of the game-specific plando options that The Messenger has. The Messenger also supports the +generic item plando. For more information on what plando is and for information covering item plando, refer to the +[generic Archipelago plando guide](/tutorial/Archipelago/plando/en). The Messenger also uses the generic connection +plando system, but with specific behaviors that will be covered in this guide along with the other options. + +## Shop Price Plando + +This option allows you to specify prices for items in both shops. This also supports weighting, allowing you to choose +from multiple different prices for any given item. + +### Example + +```yaml +The Messenger: + shop_price_plan: + Karuta Plates: 50 + Devil's Due: 1 + Barmath'azel Figurine: + # left side is price, right side is weight + 500: 10 + 700: 5 + 1000: 20 +``` + +This block will make the item at the `Karuta Plates` node cost 50 shards, `Devil's Due` will cost 1 shard, and +`Barmath'azel Figurine` will cost either 500, 700, or 1000, with 1000 being the most likely with a 20/35 chance. + +## Portal Plando + +This option allows you to specify certain outputs for the portals. This option will only be checked if portal shuffle +and the `connections` plando host setting are enabled. + +A portal connection is plandoed by specifying an `entrance` and an `exit`. This option also supports `percentage`, which +is the percent chance that that connection occurs. The `entrance` is which portal is going to be entered, whereas the +`exit` is where the portal will lead and can include a shop location, a checkpoint, or any portal. However, the +portal exit must also be in the available pool for the selected portal shuffle option. For example, if portal shuffle is +set to `shops`, then the valid exits will only be portals and shops; any exit that is a checkpoint will not be valid. If +portal shuffle is set to `checkpoints`, you may not have multiple portals lead to the same area, e.g. `Seashell` and +`Spike Wave` may not both be used since they are both in Quillshroom Marsh. If the option is set to `anywhere`, then all +exits are valid. + +All valid connections for portal shuffle can be found by scrolling through the [portals module](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/portals.py#L12). +The entrance and exit should be written exactly as they appear within that file, except for when the **exit** point is a +portal. In that case, it should have "Portal" included. + +### Example + +```yaml +The Messenger: + portal_plando: + - entrance: Riviere Turquoise + exit: Wingsuit + - entrance: Sunken Shrine + exit: Sunny Day + - entrance: Searing Crags + exit: Glacial Peak Portal +``` + +This block will make it so that the Riviere Turquoise Portal will exit to the Wingsuit Shop, the Sunken Shrine Portal +will exit to the Sunny Day checkpoint, and the Searing Crags Portal will exit to the Glacial Peak Portal. + +## Transition Plando + +This option allows you to specify certain connections when using transition shuffle. This will only work if +transition shuffle and the `connections` plando host setting are enabled. + +Each transition connection is plandoed by specifying its attributes: + +* `entrance` is where you will enter this transition from. +* `exit` is where the transition will lead. +* `percentage` is the chance this connection will happen at all. +* `direction` is used to specify whether this connection will also go in reverse. This entry will be ignored if the + transition shuffle is set to `coupled` or if the specified connection can only occur in one direction, such as exiting + to Riviere Turquoise. The default direction is "both", which will make it so that returning through the exit + transition will return you to where you entered it from. "entrance" and "exit" are treated the same, with them both + making this transition only one-way. + +Valid connections can be found in the [`RANDOMIZED_CONNECTIONS` dictionary](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/connections.py#L640). +The keys (left) are entrances, and values (right) are exits. Whether you want the connection to go both ways or not, +both sides must either be two-way or one-way; E.g. connecting Artificer (Corrupted Future Portal) to one of the +Quillshroom Marsh entrances is not a valid pairing. A pairing can be determined to be two-way if both the entrance and +exit of that pair are an exit and entrance of another pairing, respectively. + +### Example + +```yaml +The Messenger: + plando_connections: + - entrance: Searing Crags - Top + exit: Dark Cave - Right + - entrance: Glacial Peak - Left + exit: Corrupted Future +``` + +This block will create the following connections: +1. Leaving Searing Crags towards Glacial Peak will take you to the beginning of Dark Cave, and leaving the Dark Cave + door will return you to the top of Searing Crags. +2. Taking Manfred to leave Glacial Peak, will take you to Corrupted Future. There is no reverse connection here so it + will always be one-way. diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index aaf152fbf8..6b04118893 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -16,17 +16,8 @@ class MessengerAccessibility(ItemsAccessibility): class PortalPlando(PlandoConnections): """ - Plando connections to be used with portal shuffle. Direction is ignored. - List of valid connections can be found here: https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/portals.py#L12. - The entering Portal should *not* have "Portal" appended. - For the exits, those in checkpoints and shops should just be the name of the spot, while portals should have " Portal" at the end. - Example: - - entrance: Riviere Turquoise - exit: Wingsuit - - entrance: Sunken Shrine - exit: Sunny Day - - entrance: Searing Crags - exit: Glacial Peak Portal + Plando connections to be used with portal shuffle. + Documentation on using this can be found in The Messenger plando guide. """ display_name = "Portal Plando Connections" portals = [f"{portal} Portal" for portal in PORTALS] @@ -40,14 +31,7 @@ class PortalPlando(PlandoConnections): class TransitionPlando(PlandoConnections): """ Plando connections to be used with transition shuffle. - List of valid connections can be found at https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/connections.py#L641. - Dictionary keys (left) are entrances and values (right) are exits. If transition shuffle is on coupled all plando - connections will be coupled. If on decoupled, "entrance" and "exit" will be treated the same, simply making the - plando connection one-way from entrance to exit. - Example: - - entrance: Searing Crags - Top - exit: Dark Cave - Right - direction: both + Documentation on using this can be found in The Messenger plando guide. """ display_name = "Transition Plando Connections" entrances = frozenset(RANDOMIZED_CONNECTIONS.keys()) From 1fd8e4435ec46c8c03140804ba5a7a323e1850e4 Mon Sep 17 00:00:00 2001 From: Carter Hesterman Date: Thu, 10 Apr 2025 11:19:03 -0600 Subject: [PATCH 023/199] Civ 6: Update setup documentation to account for common pitfalls (#4797) --- worlds/civ_6/docs/en_Civilization VI.md | 2 +- worlds/civ_6/docs/setup_en.md | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/worlds/civ_6/docs/en_Civilization VI.md b/worlds/civ_6/docs/en_Civilization VI.md index 3b1fbbdb05..215da00aa4 100644 --- a/worlds/civ_6/docs/en_Civilization VI.md +++ b/worlds/civ_6/docs/en_Civilization VI.md @@ -51,7 +51,7 @@ Boosts have logic associated with them in order to verify you can always reach t - I need to kill a unit with a slinger/archer/musketman or some other obsolete unit I can't build anymore, how can I do this? - Don't forget you can go into the Tech Tree and click on a Vanilla tech you've received in order to toggle it on/off. This is necessary in order to pursue some of the boosts if you receive techs in certain orders. - Something happened, and I'm not able to unlock the boost due to game rules! - - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/boosts.json). + - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/boosts.py). - I'm worried that my `PROGRESSIVE_ERA` item is going to be stuck in a boost I won't have time to complete before my maximum unlocked era ends! - The unpredictable timing of boosts and unlocking them can occasionally lead to scenarios where you'll have to first encounter a locked era defeat and then load a previous save. To help reduce the frequency of this, local `PROGRESSIVE_ERA` items will never be located at a boost check. - There's too many boosts, how will I know which one's I should focus on?! diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md index 09f6ff55c5..9cf4744b65 100644 --- a/worlds/civ_6/docs/setup_en.md +++ b/worlds/civ_6/docs/setup_en.md @@ -14,22 +14,17 @@ The following are required in order to play Civ VI in Archipelago: ## Enabling the tuner -Depending on how you installed Civ 6 you will have to navigate to one of the following: - -- `YOUR_USER/Documents/My Games/Sid Meier's Civilization VI/AppOptions.txt` -- `YOUR_USER/AppData/Local/Firaxis Games/Sid Meier's Civilization VI/AppOptions.txt` - -Once you have located your `AppOptions.txt`, do a search for `Enable FireTuner`. Set `EnableTuner` to `1` instead of `0`. **NOTE**: While this is active, achievements will be disabled. +In the main menu, navigate to the "Game Options" page. On the "Game" menu, make sure that "Tuner (disables achievements)" is enabled. ## Mod Installation 1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). -2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. +2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. If you use OneDrive, check if the folder is instead located in your OneDrive file structure. 3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. Associate the file with the Archipelago Launcher and double click it. -4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. +4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. If double clicking the `.apcivvi` file doesn't generate a folder, you can just rename it to a file ending with `.zip` and extract its contents to a new folder. To do this, right click the `.apcivvi` file and click "Rename", make sure it ends in `.zip`, then right click it again and select "Extract All". 5. Your finished mod folder should look something like this: From 934b09238ea5f0ce7b699c902cd95123e5a9a152 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:21:33 -0400 Subject: [PATCH 024/199] Docs: Update to adding games.md (#4816) --- docs/adding games.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/adding games.md b/docs/adding games.md index fbbd798859..2decb667b7 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -60,7 +60,7 @@ These are "nice to have" features for a client, but they are not strictly requir if possible. * If your client appears in the Archipelago Launcher, you may define an icon for it that differentiates it from - other clients. The icon size is 38x38 pixels, but it will accept larger images with downscaling. + other clients. The icon size is 48x48 pixels, but smaller or larger images will scale to that size. ## World @@ -109,6 +109,10 @@ subclass for webhost documentation and behaviors * A non-zero number of locations, added to your regions * A non-zero number of items **equal** to the number of locations, added to the multiworld itempool * In rare cases, there may be 0-location-0-item games, but this is extremely atypical. +* A set + [completion condition](https://github.com/ArchipelagoMW/Archipelago/blob/main/BaseClasses.py#L77) (aka "goal") for + the player. + * Use your player as the index (`multiworld.completion_condition[player]`) for your world's completion goal. ### Encouraged Features @@ -145,8 +149,8 @@ workarounds or preferred methods which should be used instead: * It is discouraged to use `yaml.load` directly due to security concerns. * When possible, use `Utils.yaml_load` instead, as this defaults to the safe loader. * When submitting regions or items to the multiworld (`multiworld.regions` and `multiworld.itempool` respectively), - Do **not** use `=` as this will overwrite all elements for all games in the seed. - * Instead, use `append`, `extend`, or `+=`. + do **not** use `=` as this will overwrite all elements for all games in the seed. + * Instead, use `append`, `extend`, or `+=`. ### Notable Caveats From 879d7c23b796ce281354add5be4211bd27852796 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 10 Apr 2025 13:18:43 -0500 Subject: [PATCH 025/199] HK: Workaround for NamedRange webhost bug (#4819) --- worlds/hk/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index e76e7eba9d..fbfdbfa871 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -450,7 +450,7 @@ class GrubHuntGoal(NamedRange): display_name = "Grub Hunt Goal" range_start = 1 range_end = 46 - special_range_names = {"all": -1} + special_range_names = {"all": -1, "forty_six": 46} default = 46 From ee471a48bd443b3663100efa6044dce88bfc3679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 10 Apr 2025 14:34:21 -0400 Subject: [PATCH 026/199] Stardew Valley: Fix some determinism issues with entrance rando when playing with mods (#4812) --- worlds/stardew_valley/content/__init__.py | 2 +- worlds/stardew_valley/region_classes.py | 2 +- worlds/stardew_valley/regions.py | 5 ++--- .../stardew_valley/test/stability/StabilityOutputScript.py | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/worlds/stardew_valley/content/__init__.py b/worlds/stardew_valley/content/__init__.py index 33608531d9..5f7d4a5fc5 100644 --- a/worlds/stardew_valley/content/__init__.py +++ b/worlds/stardew_valley/content/__init__.py @@ -21,7 +21,7 @@ def choose_content_packs(player_options: options.StardewValleyOptions): if player_options.special_order_locations & options.SpecialOrderLocations.value_qi: active_packs.append(content_packs.qi_board_content_pack) - for mod in player_options.mods.value: + for mod in sorted(player_options.mods.value): active_packs.append(content_packs.by_mod[mod]) return active_packs diff --git a/worlds/stardew_valley/region_classes.py b/worlds/stardew_valley/region_classes.py index bd64518ea1..d3d16e3878 100644 --- a/worlds/stardew_valley/region_classes.py +++ b/worlds/stardew_valley/region_classes.py @@ -34,7 +34,7 @@ class RegionData: merged_exits.extend(self.exits) if exits is not None: merged_exits.extend(exits) - merged_exits = list(set(merged_exits)) + merged_exits = sorted(set(merged_exits)) return RegionData(self.name, merged_exits, is_ginger_island=self.is_ginger_island) def get_without_exits(self, exits_to_remove: Set[str]): diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index 7a680d5faa..d5be53ba86 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -521,7 +521,7 @@ def create_final_regions(world_options) -> List[RegionData]: final_regions.extend(vanilla_regions) if world_options.mods is None: return final_regions - for mod in world_options.mods.value: + for mod in sorted(world_options.mods.value): if mod not in ModDataList: continue for mod_region in ModDataList[mod].regions: @@ -747,8 +747,7 @@ def swap_one_random_connection(regions_by_name, connections_by_name, randomized_ randomized_connections_already_shuffled = {connection: randomized_connections[connection] for connection in randomized_connections if connection != randomized_connections[connection]} - unreachable_regions_names_leading_somewhere = tuple([region for region in unreachable_regions - if len(regions_by_name[region].exits) > 0]) + unreachable_regions_names_leading_somewhere = [region for region in sorted(unreachable_regions) if len(regions_by_name[region].exits) > 0] unreachable_regions_leading_somewhere = [regions_by_name[region_name] for region_name in unreachable_regions_names_leading_somewhere] unreachable_regions_exits_names = [exit_name for region in unreachable_regions_leading_somewhere for exit_name in region.exits] unreachable_connections = [connections_by_name[exit_name] for exit_name in unreachable_regions_exits_names] diff --git a/worlds/stardew_valley/test/stability/StabilityOutputScript.py b/worlds/stardew_valley/test/stability/StabilityOutputScript.py index a5385362b7..9b4b608d4e 100644 --- a/worlds/stardew_valley/test/stability/StabilityOutputScript.py +++ b/worlds/stardew_valley/test/stability/StabilityOutputScript.py @@ -2,7 +2,7 @@ import argparse import json from .. import setup_solo_multiworld -from ..options.presets import allsanity_mods_6_x_x +from ..options.presets import allsanity_mods_6_x_x_exclude_disabled from ...options import FarmType, EntranceRandomization if __name__ == "__main__": @@ -12,7 +12,7 @@ if __name__ == "__main__": args = parser.parse_args() seed = args.seed - options = allsanity_mods_6_x_x() + options = allsanity_mods_6_x_x_exclude_disabled() options[FarmType.internal_name] = FarmType.option_standard options[EntranceRandomization.internal_name] = EntranceRandomization.option_buildings multi_world = setup_solo_multiworld(options, seed=seed) From 6a9299018c7829f5ac922ed0805ccc9e1bb521e2 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Fri, 11 Apr 2025 02:17:28 +0100 Subject: [PATCH 027/199] MLSS: Fix generation error with emblem hunt and no digspots (#4859) --- worlds/mlss/Rules.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 6592a805d5..848f00cb63 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -148,12 +148,13 @@ def set_rules(world: "MLSSWorld", excluded): and StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player) ) - add_rule( - world.get_location(LocationName.BowsersCastleWendyLarryHallwayDigspot), - lambda state: StateLogic.ultra(state, world.player) - and StateLogic.fire(state, world.player) - and StateLogic.canCrash(state, world.player) - ) + if world.options.chuckle_beans != 0: + add_rule( + world.get_location(LocationName.BowsersCastleWendyLarryHallwayDigspot), + lambda state: StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canCrash(state, world.player) + ) add_rule( world.get_location(LocationName.BowsersCastleBeforeFawfulFightBlock1), lambda state: StateLogic.canDig(state, world.player) From f263a0bc912755b40024a45bd971a290afe6cbc4 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Thu, 10 Apr 2025 18:18:49 -0700 Subject: [PATCH 028/199] DS3: Mark a lizard location that was previously not annotated (#4860) --- worlds/dark_souls_3/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index cc202c76e8..c5cdbba85d 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -930,7 +930,7 @@ location_tables: Dict[str, List[DS3LocationData]] = { "Great Swamp Ring", miniboss=True), # Giant Crab drop DS3LocationData("RS: Blue Sentinels - Horace", "Blue Sentinels", missable=True, npc=True), # Horace quest - DS3LocationData("RS: Crystal Gem - stronghold, lizard", "Crystal Gem"), + DS3LocationData("RS: Crystal Gem - stronghold, lizard", "Crystal Gem", lizard=True), DS3LocationData("RS: Fading Soul - woods by Crucifixion Woods bonfire", "Fading Soul", static='03,0:53300210::'), From a324c9781541563bde9885c4d7715b89b5e96f63 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 11 Apr 2025 20:52:20 +0200 Subject: [PATCH 029/199] Factorio: fix FloatRanges writing effectively nil into the mod (#4846) --- worlds/factorio/Options.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index 481ed00987..12fc90c1fd 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -8,17 +8,20 @@ from schema import Schema, Optional, And, Or, SchemaError from Options import Choice, OptionDict, OptionSet, DefaultOnToggle, Range, DeathLink, Toggle, \ StartInventoryPool, PerGameCommonOptions, OptionGroup + # schema helpers class FloatRange: def __init__(self, low, high): self._low = low self._high = high - def validate(self, value): + def validate(self, value) -> float: if not isinstance(value, (float, int)): raise SchemaError(f"should be instance of float or int, but was {value!r}") if not self._low <= value <= self._high: raise SchemaError(f"{value} is not between {self._low} and {self._high}") + return float(value) + LuaBool = Or(bool, And(int, lambda n: n in (0, 1))) From b7b5bf58aa16cae9926f66613db4c7f3d0aa2d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Fri, 11 Apr 2025 20:19:17 -0400 Subject: [PATCH 030/199] Stardew Valley: Use classvar_matrix to split tests (#4762) * Unroll tests for better parallelization * fix ut test * self review * bro it's the second time today I have to commit some garbage to have a github action rerun because messenger fails what is this * my god can the tests plz pass * code reviews * code reviews * move TestRandomWorlds out of long module --- worlds/stardew_valley/test/TestOptions.py | 89 +++++++------- .../stardew_valley/test/TestRandomWorlds.py | 29 +++++ worlds/stardew_valley/test/__init__.py | 53 ++++---- .../stardew_valley/test/long/TestModsLong.py | 115 ++++++++++-------- .../test/long/TestOptionsLong.py | 48 ++++---- .../test/long/TestPreRolledRandomness.py | 37 +++--- .../test/long/TestRandomWorlds.py | 86 ------------- .../stardew_valley/test/long/option_names.py | 30 ----- worlds/stardew_valley/test/mods/TestMods.py | 110 +++++++---------- .../test/options/option_names.py | 51 ++++++++ .../test/stability/TestUniversalTracker.py | 7 +- 11 files changed, 304 insertions(+), 351 deletions(-) create mode 100644 worlds/stardew_valley/test/TestRandomWorlds.py delete mode 100644 worlds/stardew_valley/test/long/TestRandomWorlds.py delete mode 100644 worlds/stardew_valley/test/long/option_names.py create mode 100644 worlds/stardew_valley/test/options/option_names.py diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 9d9af04a4e..4894ea55f2 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -1,12 +1,13 @@ import itertools +from typing import ClassVar from BaseClasses import ItemClassification -from Options import NamedRange +from test.param import classvar_matrix from . import SVTestCase, solo_multiworld, SVTestBase from .assertion import WorldAssertMixin -from .long.option_names import all_option_choices +from .options.option_names import all_option_choices from .options.presets import allsanity_no_mods_6_x_x, allsanity_mods_6_x_x -from .. import items_by_group, Group, StardewValleyWorld +from .. import items_by_group, Group from ..locations import locations_by_tag, LocationTags, location_table from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations from ..strings.goal_names import Goal as GoalName @@ -18,42 +19,36 @@ SEASONS = {Season.spring, Season.summer, Season.fall, Season.winter} TOOLS = {"Hoe", "Pickaxe", "Axe", "Watering Can", "Trash Can", "Fishing Rod"} +@classvar_matrix(option_and_choice=all_option_choices) class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): - def test_given_special_range_when_generate_then_basic_checks(self): - options = StardewValleyWorld.options_dataclass.type_hints - for option_name, option in options.items(): - if not issubclass(option, NamedRange): - continue - for value in option.special_range_names: - world_options = {option_name: option.special_range_names[value]} - with self.solo_world_sub_test(f"{option_name}: {value}", world_options) as (multiworld, _): - self.assert_basic_checks(multiworld) + option_and_choice: ClassVar[tuple[str, str]] - def test_given_choice_when_generate_then_basic_checks(self): - options = StardewValleyWorld.options_dataclass.type_hints - for option_name, option in options.items(): - if not option.options: - continue - for value in option.options: - world_options = {option_name: option.options[value]} - with self.solo_world_sub_test(f"{option_name}: {value}", world_options) as (multiworld, _): - self.assert_basic_checks(multiworld) + def test_given_option_and_choice_when_generate_then_basic_checks(self): + option, choice = self.option_and_choice + world_options = {option: choice} + with solo_multiworld(world_options) as (multiworld, stardew_world): + self.assert_basic_checks(multiworld) +@classvar_matrix(goal_and_location=[ + ("community_center", GoalName.community_center), + ("grandpa_evaluation", GoalName.grandpa_evaluation), + ("bottom_of_the_mines", GoalName.bottom_of_the_mines), + ("cryptic_note", GoalName.cryptic_note), + ("master_angler", GoalName.master_angler), + ("complete_collection", GoalName.complete_museum), + ("full_house", GoalName.full_house), + ("perfection", GoalName.perfection), +]) class TestGoal(SVTestCase): + goal_and_location: ClassVar[tuple[str, str]] + def test_given_goal_when_generate_then_victory_is_in_correct_location(self): - for goal, location in [("community_center", GoalName.community_center), - ("grandpa_evaluation", GoalName.grandpa_evaluation), - ("bottom_of_the_mines", GoalName.bottom_of_the_mines), - ("cryptic_note", GoalName.cryptic_note), - ("master_angler", GoalName.master_angler), - ("complete_collection", GoalName.complete_museum), - ("full_house", GoalName.full_house), - ("perfection", GoalName.perfection)]: - world_options = {Goal.internal_name: Goal.options[goal]} - with self.solo_world_sub_test(f"Goal: {goal}, Location: {location}", world_options) as (multi_world, _): - victory = multi_world.find_item("Victory", 1) - self.assertEqual(victory.name, location) + goal, location = self.goal_and_location + world_options = {Goal.internal_name: goal} + with solo_multiworld(world_options) as (multi_world, _): + victory = multi_world.find_item("Victory", 1) + self.assertEqual(victory.name, location) class TestSeasonRandomization(SVTestCase): @@ -104,26 +99,28 @@ class TestToolProgression(SVTestBase): self.assertEqual(useful_count, 1) +@classvar_matrix(option_and_choice=all_option_choices) class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase): + option_and_choice: ClassVar[tuple[str, str]] def test_given_choice_when_generate_exclude_ginger_island_then_ginger_island_is_properly_excluded(self): - for option, option_choice in all_option_choices: - if option is ExcludeGingerIsland: - continue + option, option_choice = self.option_and_choice - world_options = { - ExcludeGingerIsland: ExcludeGingerIsland.option_true, - option: option_choice - } + if option == ExcludeGingerIsland.internal_name: + self.skipTest("ExcludeGingerIsland is forced to true") - with self.solo_world_sub_test(f"{option.internal_name}: {option_choice}", world_options) as (multiworld, stardew_world): + world_options = { + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + option: option_choice + } - # Some options, like goals, will force Ginger island back in the game. We want to skip testing those. - if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: - continue + with solo_multiworld(world_options) as (multiworld, stardew_world): - self.assert_basic_checks(multiworld) - self.assert_no_ginger_island_content(multiworld) + if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: + self.skipTest("Some options, like goals, will force Ginger island back in the game. We want to skip testing those.") + + self.assert_basic_checks(multiworld) + self.assert_no_ginger_island_content(multiworld) class TestTraps(SVTestCase): diff --git a/worlds/stardew_valley/test/TestRandomWorlds.py b/worlds/stardew_valley/test/TestRandomWorlds.py new file mode 100644 index 0000000000..550ae14b55 --- /dev/null +++ b/worlds/stardew_valley/test/TestRandomWorlds.py @@ -0,0 +1,29 @@ +from typing import ClassVar + +from BaseClasses import MultiWorld, get_seed +from test.param import classvar_matrix +from . import SVTestCase, skip_long_tests, solo_multiworld +from .assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin +from .options.option_names import generate_random_world_options + + +@classvar_matrix(n=range(10 if skip_long_tests() else 1000)) +class TestGenerateManyWorlds(GoalAssertMixin, OptionAssertMixin, WorldAssertMixin, SVTestCase): + n: ClassVar[int] + + def test_generate_many_worlds_then_check_results(self): + seed = get_seed() + world_options = generate_random_world_options(seed + self.n) + + print(f"Generating solo multiworld with seed {seed} for Stardew Valley...") + with solo_multiworld(world_options, seed=seed, world_caching=False) as (multiworld, _): + self.assert_multiworld_is_valid(multiworld) + + def assert_multiworld_is_valid(self, multiworld: MultiWorld): + self.assert_victory_exists(multiworld) + self.assert_same_number_items_locations(multiworld) + self.assert_goal_world_is_valid(multiworld) + self.assert_can_reach_island_if_should(multiworld) + self.assert_cropsanity_same_number_items_and_locations(multiworld) + self.assert_festivals_give_access_to_deluxe_scarecrow(multiworld) + self.assert_has_festival_recipes(multiworld) diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index 800b210576..702f590221 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -22,21 +22,19 @@ DEFAULT_TEST_SEED = get_seed() logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") -class SVTestCase(unittest.TestCase): - # Set False to not skip some 'extra' tests - skip_base_tests: bool = True - # Set False to run tests that take long - skip_long_tests: bool = True +def skip_default_tests() -> bool: + return not bool(os.environ.get("base", False)) - @classmethod - def setUpClass(cls) -> None: - super().setUpClass() - base_tests_key = "base" - if base_tests_key in os.environ: - cls.skip_base_tests = not bool(os.environ[base_tests_key]) - long_tests_key = "long" - if long_tests_key in os.environ: - cls.skip_long_tests = not bool(os.environ[long_tests_key]) + +def skip_long_tests() -> bool: + return not bool(os.environ.get("long", False)) + + +class SVTestCase(unittest.TestCase): + skip_default_tests: bool = skip_default_tests() + """Set False to not skip the base fill tests""" + skip_long_tests: bool = skip_long_tests() + """Set False to run tests that take long""" @contextmanager def solo_world_sub_test(self, msg: Optional[str] = None, @@ -94,7 +92,7 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): @property def run_default_tests(self) -> bool: - if self.skip_base_tests: + if self.skip_default_tests: return False return super().run_default_tests @@ -196,21 +194,22 @@ def solo_multiworld(world_options: Optional[Dict[Union[str, StardewValleyOption] yield multiworld, multiworld.worlds[1] else: multiworld = setup_solo_multiworld(world_options, seed) - multiworld.lock.acquire() - world = multiworld.worlds[1] + try: + multiworld.lock.acquire() + world = multiworld.worlds[1] - original_state = multiworld.state.copy() - original_itempool = multiworld.itempool.copy() - unfilled_locations = multiworld.get_unfilled_locations(1) + original_state = multiworld.state.copy() + original_itempool = multiworld.itempool.copy() + unfilled_locations = multiworld.get_unfilled_locations(1) - yield multiworld, world + yield multiworld, world - multiworld.state = original_state - multiworld.itempool = original_itempool - for location in unfilled_locations: - location.item = None - - multiworld.lock.release() + multiworld.state = original_state + multiworld.itempool = original_itempool + for location in unfilled_locations: + location.item = None + finally: + multiworld.lock.release() # Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. diff --git a/worlds/stardew_valley/test/long/TestModsLong.py b/worlds/stardew_valley/test/long/TestModsLong.py index 395c48ee69..bc5e8bfff8 100644 --- a/worlds/stardew_valley/test/long/TestModsLong.py +++ b/worlds/stardew_valley/test/long/TestModsLong.py @@ -1,61 +1,19 @@ import unittest -from itertools import combinations, product +from itertools import combinations +from typing import ClassVar from BaseClasses import get_seed -from .option_names import all_option_choices, get_option_choices -from .. import SVTestCase +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin, ModAssertMixin +from ..options.option_names import all_option_choices from ... import options from ...mods.mod_data import ModNames - -assert unittest +from ...options.options import all_mods -class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): - - @classmethod - def setUpClass(cls) -> None: - super().setUpClass() - if cls.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - def test_given_mod_pairs_when_generate_then_basic_checks(self): - for mod_pair in combinations(options.Mods.valid_keys, 2): - world_options = { - options.Mods: frozenset(mod_pair) - } - - with self.solo_world_sub_test(f"Mods: {mod_pair}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - self.assert_stray_mod_items(list(mod_pair), multiworld) - - def test_given_mod_names_when_generate_paired_with_other_options_then_basic_checks(self): - for mod, (option, value) in product(options.Mods.valid_keys, all_option_choices): - world_options = { - option: value, - options.Mods: mod - } - - with self.solo_world_sub_test(f"{option.internal_name}: {value}, Mod: {mod}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - self.assert_stray_mod_items(mod, multiworld) - - def test_given_no_quest_all_mods_when_generate_with_all_goals_then_basic_checks(self): - for goal, (option, value) in product(get_option_choices(options.Goal), all_option_choices): - if option is options.QuestLocations: - continue - - world_options = { - options.Goal: goal, - option: value, - options.QuestLocations: -1, - options.Mods: frozenset(options.Mods.valid_keys), - } - - with self.solo_world_sub_test(f"Goal: {goal}, {option.internal_name}: {value}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - - @unittest.skip +@unittest.skip +class TestTroubleshootMods(WorldAssertMixin, ModAssertMixin, SVTestCase): def test_troubleshoot_option(self): seed = get_seed(78709133382876990000) @@ -67,3 +25,60 @@ class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): with self.solo_world_sub_test(world_options=world_options, seed=seed, world_caching=False) as (multiworld, _): self.assert_basic_checks(multiworld) self.assert_stray_mod_items(world_options[options.Mods], multiworld) + + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + + +@classvar_matrix(mod_pair=combinations(sorted(all_mods), 2)) +class TestGenerateModsPairs(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod_pair: ClassVar[tuple[str, str]] + + def test_given_mod_pairs_when_generate_then_basic_checks(self): + world_options = { + options.Mods.internal_name: frozenset(self.mod_pair) + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) + self.assert_stray_mod_items(list(self.mod_pair), multiworld) + + +@classvar_matrix(mod=all_mods, option_and_choice=all_option_choices) +class TestGenerateModAndOptionChoice(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod: ClassVar[str] + option_and_choice: ClassVar[tuple[str, str]] + + def test_given_mod_names_when_generate_paired_with_other_options_then_basic_checks(self): + option, choice = self.option_and_choice + + world_options = { + option: choice, + options.Mods.internal_name: self.mod + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) + self.assert_stray_mod_items(self.mod, multiworld) + + +@classvar_matrix(goal=options.Goal.options.keys(), option_and_choice=all_option_choices) +class TestGenerateAllGoalAndAllOptionWithAllModsWithoutQuest(WorldAssertMixin, ModAssertMixin, SVTestCase): + goal = ClassVar[str] + option_and_choice = ClassVar[tuple[str, str]] + + def test_given_no_quest_all_mods_when_generate_with_all_goals_then_basic_checks(self): + option, choice = self.option_and_choice + if option == options.QuestLocations.internal_name: + self.skipTest("QuestLocations are disabled") + + world_options = { + options.Goal.internal_name: self.goal, + option: choice, + options.QuestLocations.internal_name: -1, + options.Mods.internal_name: frozenset(options.Mods.valid_keys), + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestOptionsLong.py b/worlds/stardew_valley/test/long/TestOptionsLong.py index 81bb4d1f30..db467964e7 100644 --- a/worlds/stardew_valley/test/long/TestOptionsLong.py +++ b/worlds/stardew_valley/test/long/TestOptionsLong.py @@ -1,34 +1,16 @@ import unittest from itertools import combinations +from typing import ClassVar from BaseClasses import get_seed -from .option_names import all_option_choices -from .. import SVTestCase, solo_multiworld +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion.world_assert import WorldAssertMixin +from ..options.option_names import all_option_choices from ... import options -class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): - def test_given_option_pair_when_generate_then_basic_checks(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - for (option1, option1_choice), (option2, option2_choice) in combinations(all_option_choices, 2): - if option1 is option2: - continue - - world_options = { - option1: option1_choice, - option2: option2_choice - } - - with self.solo_world_sub_test(f"{option1.internal_name}: {option1_choice}, {option2.internal_name}: {option2_choice}", - world_options, - world_caching=False) \ - as (multiworld, _): - self.assert_basic_checks(multiworld) - - +@unittest.skip class TestDynamicOptionDebug(WorldAssertMixin, SVTestCase): def test_option_pair_debug(self): @@ -42,3 +24,23 @@ class TestDynamicOptionDebug(WorldAssertMixin, SVTestCase): print(f"Seed: {seed}") with solo_multiworld(option_dict, seed=seed) as (multiworld, _): self.assert_basic_checks(multiworld) + + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + + +@classvar_matrix(options_and_choices=combinations(all_option_choices, 2)) +class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): + options_and_choices: ClassVar[tuple[tuple[str, str], tuple[str, str]]] + + def test_given_option_pair_when_generate_then_basic_checks(self): + (option1, option1_choice), (option2, option2_choice) = self.options_and_choices + + world_options = { + option1: option1_choice, + option2: option2_choice + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py index f233fc36dc..3b6f818ec4 100644 --- a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py +++ b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py @@ -1,28 +1,29 @@ import unittest +from typing import ClassVar from BaseClasses import get_seed -from .. import SVTestCase +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin from ... import options +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") +player_options = { + options.EntranceRandomization.internal_name: options.EntranceRandomization.option_buildings, + options.BundleRandomization.internal_name: options.BundleRandomization.option_remixed, + options.BundlePrice.internal_name: options.BundlePrice.option_maximum +} + + +@classvar_matrix(n=range(1000)) class TestGeneratePreRolledRandomness(WorldAssertMixin, SVTestCase): + n: ClassVar[int] + def test_given_pre_rolled_difficult_randomness_when_generate_then_basic_checks(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") + seed = get_seed() - choices = { - options.EntranceRandomization.internal_name: options.EntranceRandomization.option_buildings, - options.BundleRandomization.internal_name: options.BundleRandomization.option_remixed, - options.BundlePrice.internal_name: options.BundlePrice.option_maximum - } - - num_tests = 1000 - for i in range(num_tests): - seed = get_seed() # Put seed in parameter to test - with self.solo_world_sub_test(f"Entrance Randomizer and Remixed Bundles", - choices, - seed=seed, - world_caching=False) \ - as (multiworld, _): - self.assert_basic_checks(multiworld) + print(f"Generating solo multiworld with seed {seed} for Stardew Valley...") + with solo_multiworld(player_options, seed=seed, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestRandomWorlds.py b/worlds/stardew_valley/test/long/TestRandomWorlds.py deleted file mode 100644 index 6d4931280a..0000000000 --- a/worlds/stardew_valley/test/long/TestRandomWorlds.py +++ /dev/null @@ -1,86 +0,0 @@ -import random -import unittest -from typing import Dict - -from BaseClasses import MultiWorld, get_seed -from Options import NamedRange, Range -from .option_names import options_to_include -from .. import SVTestCase -from ..assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin - - -def get_option_choices(option) -> Dict[str, int]: - if issubclass(option, NamedRange): - return option.special_range_names - if issubclass(option, Range): - return {f"{val}": val for val in range(option.range_start, option.range_end + 1)} - elif option.options: - return option.options - return {} - - -def generate_random_world_options(seed: int) -> Dict[str, int]: - num_options = len(options_to_include) - world_options = dict() - rng = random.Random(seed) - for option_index in range(0, num_options): - option = options_to_include[option_index] - option_choices = get_option_choices(option) - if not option_choices: - continue - chosen_option_value = rng.choice(list(option_choices.values())) - world_options[option.internal_name] = chosen_option_value - return world_options - - -def get_number_log_steps(number_worlds: int) -> int: - if number_worlds <= 10: - return 2 - if number_worlds <= 100: - return 5 - if number_worlds <= 500: - return 10 - if number_worlds <= 1000: - return 20 - if number_worlds <= 5000: - return 25 - if number_worlds <= 10000: - return 50 - return 100 - - -class TestGenerateManyWorlds(GoalAssertMixin, OptionAssertMixin, WorldAssertMixin, SVTestCase): - def test_generate_many_worlds_then_check_results(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - number_worlds = 10 if self.skip_long_tests else 1000 - seed = get_seed() - self.generate_and_check_many_worlds(number_worlds, seed) - - def generate_and_check_many_worlds(self, number_worlds: int, seed: int): - num_steps = get_number_log_steps(number_worlds) - log_step = number_worlds / num_steps - - print(f"Generating {number_worlds} Solo Multiworlds [Start Seed: {seed}] for Stardew Valley...") - for world_number in range(0, number_worlds + 1): - - world_seed = world_number + seed - world_options = generate_random_world_options(world_seed) - - with self.solo_world_sub_test(f"Multiworld: {world_seed}", world_options, seed=world_seed, world_caching=False) as (multiworld, _): - self.assert_multiworld_is_valid(multiworld) - - if world_number > 0 and world_number % log_step == 0: - print(f"Generated and Verified {world_number}/{number_worlds} worlds [{(world_number * 100) // number_worlds}%]") - - print(f"Finished generating and verifying {number_worlds} Solo Multiworlds for Stardew Valley") - - def assert_multiworld_is_valid(self, multiworld: MultiWorld): - self.assert_victory_exists(multiworld) - self.assert_same_number_items_locations(multiworld) - self.assert_goal_world_is_valid(multiworld) - self.assert_can_reach_island_if_should(multiworld) - self.assert_cropsanity_same_number_items_and_locations(multiworld) - self.assert_festivals_give_access_to_deluxe_scarecrow(multiworld) - self.assert_has_festival_recipes(multiworld) diff --git a/worlds/stardew_valley/test/long/option_names.py b/worlds/stardew_valley/test/long/option_names.py deleted file mode 100644 index 9f3cf98b87..0000000000 --- a/worlds/stardew_valley/test/long/option_names.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import Dict - -from Options import NamedRange -from ... import StardewValleyWorld - -options_to_exclude = {"profit_margin", "starting_money", "multiple_day_sleep_enabled", "multiple_day_sleep_cost", - "experience_multiplier", "friendship_multiplier", "debris_multiplier", - "quick_start", "gifting", "gift_tax", - "progression_balancing", "accessibility", "start_inventory", "start_hints", "death_link"} - -options_to_include = [option - for option_name, option in StardewValleyWorld.options_dataclass.type_hints.items() - if option_name not in options_to_exclude] - - -def get_option_choices(option) -> Dict[str, int]: - if issubclass(option, NamedRange): - return option.special_range_names - elif option.options: - return option.options - return {} - - -all_option_choices = [(option, value) - for option in options_to_include - if option.options - for value in get_option_choices(option) - if option.default != get_option_choices(option)[value]] - -assert all_option_choices diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 932c76c680..bd5d7d626d 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,88 +1,64 @@ import random +from typing import ClassVar from BaseClasses import get_seed -from .. import SVTestBase, SVTestCase +from test.param import classvar_matrix +from .. import SVTestBase, SVTestCase, solo_multiworld from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin from ..options.presets import allsanity_mods_6_x_x from ..options.utils import fill_dataclass_with_default from ... import options, Group, create_content from ...mods.mod_data import ModNames -from ...options import SkillProgression, Walnutsanity from ...options.options import all_mods from ...regions import RandomizationFlag, randomize_connections, create_final_connections_and_regions -class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): - - def test_given_single_mods_when_generate_then_basic_checks(self): - for mod in options.Mods.valid_keys: - world_options = {options.Mods: mod, options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false} - with self.solo_world_sub_test(f"Mod: {mod}", world_options) as (multi_world, _): - self.assert_basic_checks(multi_world) - self.assert_stray_mod_items(mod, multi_world) - - # The following tests validate that ER still generates winnable and logically-sane games with given mods. - # Mods that do not interact with entrances are skipped - # Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others - def test_deepwoods_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.deepwoods, options.EntranceRandomization.option_buildings) - - def test_juna_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.juna, options.EntranceRandomization.option_buildings) - - def test_jasper_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.jasper, options.EntranceRandomization.option_buildings) - - def test_alec_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.alec, options.EntranceRandomization.option_buildings) - - def test_yoba_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.yoba, options.EntranceRandomization.option_buildings) - - def test_eugene_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.eugene, options.EntranceRandomization.option_buildings) - - def test_ayeisha_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.ayeisha, options.EntranceRandomization.option_buildings) - - def test_riley_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.riley, options.EntranceRandomization.option_buildings) - - def test_sve_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.sve, options.EntranceRandomization.option_buildings) - - def test_alecto_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.alecto, options.EntranceRandomization.option_buildings) - - def test_lacey_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.lacey, options.EntranceRandomization.option_buildings) - - def test_boarding_house_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.boarding_house, options.EntranceRandomization.option_buildings) - - def test_all_mods_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(all_mods, options.EntranceRandomization.option_buildings) - - def perform_basic_checks_on_mod_with_er(self, mods: str | set[str], er_option: int) -> None: - if isinstance(mods, str): - mods = {mods} - world_options = { - options.EntranceRandomization: er_option, - options.Mods: frozenset(mods), - options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false - } - with self.solo_world_sub_test(f"entrance_randomization: {er_option}, Mods: {mods}", world_options) as (multi_world, _): - self.assert_basic_checks(multi_world) +class TestCanGenerateAllsanityWithMods(WorldAssertMixin, ModAssertMixin, SVTestCase): def test_allsanity_all_mods_when_generate_then_basic_checks(self): - with self.solo_world_sub_test(world_options=allsanity_mods_6_x_x()) as (multi_world, _): + with solo_multiworld(allsanity_mods_6_x_x()) as (multi_world, _): self.assert_basic_checks(multi_world) def test_allsanity_all_mods_exclude_island_when_generate_then_basic_checks(self): world_options = allsanity_mods_6_x_x() world_options.update({options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true}) - with self.solo_world_sub_test(world_options=world_options) as (multi_world, _): + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + +@classvar_matrix(mod=all_mods) +class TestCanGenerateWithEachMod(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod: ClassVar[str] + + def test_given_single_mods_when_generate_then_basic_checks(self): + world_options = { + options.Mods: self.mod, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + self.assert_stray_mod_items(self.mod, multi_world) + + +@classvar_matrix(mod=all_mods.difference([ + ModNames.ginger, ModNames.distant_lands, ModNames.skull_cavern_elevator, ModNames.wellwick, ModNames.magic, ModNames.binning_skill, ModNames.big_backpack, + ModNames.luck_skill, ModNames.tractor, ModNames.shiko, ModNames.archaeology, ModNames.delores, ModNames.socializing_skill, ModNames.cooking_skill +])) +class TestCanGenerateEachModWithEntranceRandomizationBuildings(WorldAssertMixin, SVTestCase): + """The following tests validate that ER still generates winnable and logically-sane games with given mods. + Mods that do not interact with entrances are skipped + Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others + """ + mod: ClassVar[str] + + def test_given_mod_when_generate_then_basic_checks(self) -> None: + world_options = { + options.EntranceRandomization: options.EntranceRandomization.option_buildings, + options.Mods: self.mod, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options, world_caching=False) as (multi_world, _): self.assert_basic_checks(multi_world) @@ -105,7 +81,7 @@ class TestBaseItemGeneration(SVTestBase): options.Chefsanity.internal_name: options.Chefsanity.option_all, options.Craftsanity.internal_name: options.Craftsanity.option_all, options.Booksanity.internal_name: options.Booksanity.option_all, - Walnutsanity.internal_name: Walnutsanity.preset_all, + options.Walnutsanity.internal_name: options.Walnutsanity.preset_all, options.Mods.internal_name: frozenset(options.Mods.valid_keys) } @@ -151,7 +127,7 @@ class TestModEntranceRando(SVTestCase): sv_options = fill_dataclass_with_default({ options.EntranceRandomization.internal_name: option, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, + options.SkillProgression.internal_name: options.SkillProgression.option_progressive_with_masteries, options.Mods.internal_name: frozenset(options.Mods.valid_keys) }) content = create_content(sv_options) diff --git a/worlds/stardew_valley/test/options/option_names.py b/worlds/stardew_valley/test/options/option_names.py new file mode 100644 index 0000000000..07fa42b508 --- /dev/null +++ b/worlds/stardew_valley/test/options/option_names.py @@ -0,0 +1,51 @@ +import random + +from Options import NamedRange, Option, Range +from ... import StardewValleyWorld +from ...options import StardewValleyOption + +options_to_exclude = {"profit_margin", "starting_money", "multiple_day_sleep_enabled", "multiple_day_sleep_cost", + "experience_multiplier", "friendship_multiplier", "debris_multiplier", + "quick_start", "gifting", "gift_tax", + "progression_balancing", "accessibility", "start_inventory", "start_hints", "death_link"} + +options_to_include: list[type[StardewValleyOption | Option]] = [ + option + for option_name, option in StardewValleyWorld.options_dataclass.type_hints.items() + if option_name not in options_to_exclude +] + + +def get_option_choices(option: type[Option]) -> dict[str, int]: + if issubclass(option, NamedRange): + return option.special_range_names + if issubclass(option, Range): + return {f"{val}": val for val in range(option.range_start, option.range_end + 1)} + elif option.options: + return option.options + return {} + + +def generate_random_world_options(seed: int) -> dict[str, int]: + num_options = len(options_to_include) + world_options = dict() + rng = random.Random(seed) + for option_index in range(0, num_options): + option = options_to_include[option_index] + option_choices = get_option_choices(option) + if not option_choices: + continue + chosen_option_value = rng.choice(list(option_choices.values())) + world_options[option.internal_name] = chosen_option_value + return world_options + + +all_option_choices = [ + (option.internal_name, value) + for option in options_to_include + if option.options + for value in get_option_choices(option) + if option.default != get_option_choices(option)[value] +] + +assert all_option_choices diff --git a/worlds/stardew_valley/test/stability/TestUniversalTracker.py b/worlds/stardew_valley/test/stability/TestUniversalTracker.py index 5e8075e4a1..0268d9e515 100644 --- a/worlds/stardew_valley/test/stability/TestUniversalTracker.py +++ b/worlds/stardew_valley/test/stability/TestUniversalTracker.py @@ -1,11 +1,12 @@ import unittest from unittest.mock import Mock -from .. import SVTestBase, fill_namespace_with_default +from .. import SVTestBase, fill_namespace_with_default, skip_long_tests from ..options.presets import allsanity_mods_6_x_x from ... import STARDEW_VALLEY, FarmType, BundleRandomization, EntranceRandomization +@unittest.skipIf(skip_long_tests(), "Long tests disabled") class TestUniversalTrackerGenerationIsStable(SVTestBase): options = allsanity_mods_6_x_x() options.update({ @@ -16,8 +17,6 @@ class TestUniversalTrackerGenerationIsStable(SVTestBase): def test_all_locations_and_items_are_the_same_between_two_generations(self): # This might open a kivy window temporarily, but it's the only way to test this... - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") try: # This test only run if UT is present, so no risk of running in the CI. @@ -30,7 +29,7 @@ class TestUniversalTrackerGenerationIsStable(SVTestBase): fake_context = Mock() fake_context.re_gen_passthrough = {STARDEW_VALLEY: ut_data} - args = fill_namespace_with_default({0: self.options}) + args = fill_namespace_with_default([self.options]) args.outputpath = None args.outputname = None args.multi = 1 From 347efac0cd787ded2eb79299e5eee6e60789733e Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Fri, 11 Apr 2025 20:41:08 -0400 Subject: [PATCH 031/199] DLC Quest - Skip two long tests in the main pipeline (#4862) * - Set up the two long tests to only run when the specific config is active * Apply Black Sliver's suggestion --- worlds/dlcquest/test/TestOptionsLong.py | 9 +++++++-- worlds/dlcquest/test/__init__.py | 15 +++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/worlds/dlcquest/test/TestOptionsLong.py b/worlds/dlcquest/test/TestOptionsLong.py index c6c594b6a0..d31e82c00f 100644 --- a/worlds/dlcquest/test/TestOptionsLong.py +++ b/worlds/dlcquest/test/TestOptionsLong.py @@ -1,10 +1,11 @@ +import unittest from typing import Dict from BaseClasses import MultiWorld from Options import NamedRange -from .option_names import options_to_include -from .checks.world_checks import assert_can_win, assert_same_number_items_locations from . import DLCQuestTestBase, setup_dlc_quest_solo_multiworld +from .checks.world_checks import assert_can_win, assert_same_number_items_locations +from .option_names import options_to_include def basic_checks(tester: DLCQuestTestBase, multiworld: MultiWorld): @@ -38,6 +39,8 @@ class TestGenerateDynamicOptions(DLCQuestTestBase): basic_checks(self, multiworld) def test_given_option_truple_when_generate_then_basic_checks(self): + if self.skip_long_tests: + raise unittest.SkipTest("Long tests disabled") num_options = len(options_to_include) for option1_index in range(0, num_options): for option2_index in range(option1_index + 1, num_options): @@ -59,6 +62,8 @@ class TestGenerateDynamicOptions(DLCQuestTestBase): basic_checks(self, multiworld) def test_given_option_quartet_when_generate_then_basic_checks(self): + if self.skip_long_tests: + raise unittest.SkipTest("Long tests disabled") num_options = len(options_to_include) for option1_index in range(0, num_options): for option2_index in range(option1_index + 1, num_options): diff --git a/worlds/dlcquest/test/__init__.py b/worlds/dlcquest/test/__init__.py index 0432ae8b60..bcc4c14659 100644 --- a/worlds/dlcquest/test/__init__.py +++ b/worlds/dlcquest/test/__init__.py @@ -1,19 +1,26 @@ -from typing import ClassVar - -from typing import Dict, FrozenSet, Tuple, Any +import os from argparse import Namespace +from typing import ClassVar +from typing import Dict, FrozenSet, Tuple, Any from BaseClasses import MultiWorld from test.bases import WorldTestBase -from .. import DLCqworld from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld from worlds.AutoWorld import call_all +from .. import DLCqworld class DLCQuestTestBase(WorldTestBase): game = "DLCQuest" world: DLCqworld player: ClassVar[int] = 1 + # Set False to run tests that take long + skip_long_tests: bool = True + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.skip_long_tests = not bool(os.environ.get("long")) def world_setup(self, *args, **kwargs): super().world_setup(*args, **kwargs) From ec1e113b4c6dbaa977a46325fb6cb7d958ea531e Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 13 Apr 2025 13:10:36 +0200 Subject: [PATCH 032/199] Doc: fix parse_yaml in adding games.md (#4872) --- docs/adding games.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/adding games.md b/docs/adding games.md index 2decb667b7..c3eb0d023e 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -146,8 +146,8 @@ workarounds or preferred methods which should be used instead: * If you need to place specific items, there are multiple ways to do so, but they should not be added to the multiworld itempool. * It is not allowed to use `eval` for most reasons, chiefly due to security concerns. -* It is discouraged to use `yaml.load` directly due to security concerns. - * When possible, use `Utils.yaml_load` instead, as this defaults to the safe loader. +* It is discouraged to use PyYAML (i.e. `yaml.load`) directly due to security concerns. + * When possible, use `Utils.parse_yaml` instead, as this defaults to the safe loader and the faster C parser. * When submitting regions or items to the multiworld (`multiworld.regions` and `multiworld.itempool` respectively), do **not** use `=` as this will overwrite all elements for all games in the seed. * Instead, use `append`, `extend`, or `+=`. From 1873c52aa6f66fb79657555098d6c8e2efc9dada Mon Sep 17 00:00:00 2001 From: Seldom <38388947+Seldom-SE@users.noreply.github.com> Date: Tue, 15 Apr 2025 06:51:05 -0700 Subject: [PATCH 033/199] Terraria: 1.4.4 and Calamity support (#3847) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Terraria integration * Precollected items for debugging * Fix item classification * Golem requires Plantera's Bulb * Pumpkin Moon requires Dungeon * Progressive Dungeon * Reorg, Options.py work * Items are boss flags * Removed unused option * Removed nothing * Wall, Plantera, and Zenith goals * Achievements and items * Fixed The Cavalry and Completely Awesome achievements * Made "Dead Men Tell No Tales" a grindy achievement * Some docs, Python 3.8 compat * docs * Fix extra item and "Head in the Clouds" being included when achievements are disabled * Requested changes * Fix potential thread unsafety, replace Nothing with 50 Silver * Remove a log * Corrected heading * Added incompatible mods list * In-progress calamity integration * Terraria events progress * Rules use events * Removed an intentional crash I accidentally left in * Fixed infinite loop * Moved rules to data file * Moved item rewards to data file * Generating from data file * Fixed broken Mech Boss goal * Changes Calamity makes to vanilla rules, Calamity final bosses goal * Added Deerclops, fixed Zenith goal * Final detailed vanilla pass * Disable calamity goals * Typo * Fixed some reward items not adding to item pool * In-progress unit test fixes * Unit test fixes * `.apworld` compat * Organized rewards file, made Frog Leg and Fllpper available in vanilla * Water Walking Boots and Titan Glove rewards * Add goals to slot data * Fixed Hammush logic in Post-Mech goal * Fixed coin rewards * Updated Terraria docs * Formatted * Deathlink in-progress * Boots of the Hero is grindy * Fixed zenith goal not placing an item * Address review * Gelatin World Tour is grindy * Difficulty notice * Switched some achievements' grindiness * Added "Hey! Listen!" achievement * Terarria Python 3.8 compat * Fixed Terraria You and What Army logic * Calamity minion accessories * Typo * Calamity integration * `deathlink` -> `death_link` Co-authored-by: Zach Parks * Missing `.` Co-authored-by: Zach Parks * Incorrect type annotation Co-authored-by: Zach Parks * `deathlink` -> `death_link` 2 Co-authored-by: Zach Parks * Style Co-authored-by: Zach Parks * Markdown style Co-authored-by: Zach Parks * Markdown style 2 Co-authored-by: Zach Parks * Address review * Fix bad merge * Terraria utility mod recommendations * Calamity minion armor logic * ArmorMinions -> Armor Minions, boss rush goal, fixed unplaced item * Fixed unplaced item * Started on Terraria 1.4.4 * Crate logic * getfixedboi, 1.4.4 achievements, shimmer, town slimes, `Rule`, `Condition`, etc * More clam getfixedboi logic, bar decraft logic, `NotGetfixedboi` -> `Not Getfixedboi` * Calamity fixes * Calamity crate ore logic * Fixed item accessibility not generating in getfixedboi, fixed not generating with incompatible options, fixed grindy function * Early achievements, separate achievement category options * Infinity +1 Sword achievement can be location in later goals * The Frequent Flyer is impossible in Calamity getfixedboi * Add Enchanted Sword and Starfury for starting inventories * Don't Dread on Me is redundant in Calamity * In Calamity getfixedboi, Queen Bee summons enemies who drop Plague Cell Canisters * Can't use Gelatin Crystal outside Hallow * You can't get the Terminus without flags * Typo * Options difficult warnings * Robbing the Grave is Hardmode * Don't reserve an ID for unused Victory item * Plantera is accessible early in Calamity via Giant Plantera's Bulbs * Unshuffled Life Crystal and Defender Medal items * Comment about Midas' Blessing * Update worlds/terraria/Options.py Co-authored-by: Scipio Wright * Remove stray expression Co-authored-by: Scipio Wright * Review suggestions * Option naming caps consistency, add Laser Drill, Lunatic Cultist alt reqs, fix Eldritch Soul Artifact, Ceaseless Void reqs Dungeon * Cal Clone doesn't drop Broken Hero Sword anymore, Laser Drill is weaker in Calamity Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com> * Fix Acid Rain logic * Fix XB-∞ Hekate failing accessibility checks (by commenting it out bc it doesn't affect logic) * Hardmode ores being fishable early in Calamity is not a bug anymore * Mecha Mayhem is inaccessible in getfixedboi * Update worlds/terraria/Rules.dsv Co-authored-by: Seafo <92278897+Seatori@users.noreply.github.com> --------- Co-authored-by: Fabian Dill Co-authored-by: Zach Parks Co-authored-by: Scipio Wright Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com> --- worlds/terraria/Checks.py | 245 +++++++++++-------- worlds/terraria/Options.py | 73 ++++-- worlds/terraria/Rewards.dsv | 12 +- worlds/terraria/Rules.dsv | 465 ++++++++++++++++++++++++------------ worlds/terraria/__init__.py | 247 ++++++++++--------- 5 files changed, 661 insertions(+), 381 deletions(-) diff --git a/worlds/terraria/Checks.py b/worlds/terraria/Checks.py index 0630d6290b..53e6626204 100644 --- a/worlds/terraria/Checks.py +++ b/worlds/terraria/Checks.py @@ -157,24 +157,57 @@ COND_FN = 2 COND_GROUP = 3 +class Condition: + def __init__( + self, + # True = positive, False = negative + sign: bool, + # See the `COND_*` constants + type: int, + # Condition name or list + condition: Union[str, Tuple[Union[bool, None], List["Condition"]]], + argument: Union[str, int, None], + ): + self.sign = sign + self.type = type + self.condition = condition + self.argument = argument + + +class Rule: + def __init__( + self, + name: str, + # Name to arg + flags: Dict[str, Union[str, int, None]], + # True = or, False = and, None = N/A + operator: Union[bool, None], + conditions: List[Condition], + ): + self.name = name + self.flags = flags + self.operator = operator + self.conditions = conditions + + def validate_conditions( rule: str, rule_indices: dict, - conditions: List[ - Tuple[ - bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None] - ] - ], + conditions: List[Condition], ): - for _, type, condition, _ in conditions: - if type == COND_ITEM: - if condition not in rule_indices: - raise Exception(f"item `{condition}` in `{rule}` is not defined") - elif type == COND_LOC: - if condition not in rule_indices: - raise Exception(f"location `{condition}` in `{rule}` is not defined") - elif type == COND_FN: - if condition not in { + for condition in conditions: + if condition.type == COND_ITEM: + if condition.condition not in rule_indices: + raise Exception( + f"item `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_LOC: + if condition.condition not in rule_indices: + raise Exception( + f"location `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_FN: + if condition.condition not in { "npc", "calamity", "grindy", @@ -182,43 +215,48 @@ def validate_conditions( "hammer", "mech_boss", "minions", + "getfixedboi", }: - raise Exception(f"function `{condition}` in `{rule}` is not defined") - elif type == COND_GROUP: - _, conditions = condition + raise Exception( + f"function `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_GROUP: + _, conditions = condition.condition validate_conditions(rule, rule_indices, conditions) def mark_progression( - conditions: List[ - Tuple[ - bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None] - ] - ], + conditions: List[Condition], progression: Set[str], rules: list, rule_indices: dict, loc_to_item: dict, ): - for _, type, condition, _ in conditions: - if type == COND_ITEM: - prog = condition in progression - progression.add(loc_to_item[condition]) - _, flags, _, conditions = rules[rule_indices[condition]] + for condition in conditions: + if condition.type == COND_ITEM: + prog = condition.condition in progression + progression.add(loc_to_item[condition.condition]) + rule = rules[rule_indices[condition.condition]] if ( not prog - and "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags + and "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags ): mark_progression( - conditions, progression, rules, rule_indices, loc_to_item + rule.conditions, progression, rules, rule_indices, loc_to_item ) - elif type == COND_LOC: - _, _, _, conditions = rules[rule_indices[condition]] - mark_progression(conditions, progression, rules, rule_indices, loc_to_item) - elif type == COND_GROUP: - _, conditions = condition + elif condition.type == COND_LOC: + + mark_progression( + rules[rule_indices[condition.condition]].conditions, + progression, + rules, + rule_indices, + loc_to_item, + ) + elif condition.type == COND_GROUP: + _, conditions = condition.condition mark_progression(conditions, progression, rules, rule_indices, loc_to_item) @@ -226,29 +264,7 @@ def read_data() -> Tuple[ # Goal to rule index that ends that goal's range and the locations required List[Tuple[int, Set[str]]], # Rules - List[ - Tuple[ - # Rule - str, - # Flag to flag arg - Dict[str, Union[str, int, None]], - # True = or, False = and, None = N/A - Union[bool, None], - # Conditions - List[ - Tuple[ - # True = positive, False = negative - bool, - # Condition type - int, - # Condition name or list (True = or, False = and, None = N/A) (list shares type with outer) - Union[str, Tuple[Union[bool, None], List]], - # Condition arg - Union[str, int, None], - ] - ], - ] - ], + List[Rule], # Rule to rule index Dict[str, int], # Label to rewards @@ -379,7 +395,7 @@ def read_data() -> Tuple[ unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == COND_OR_SEMI: if id == IDENT: - conditions.append((sign, COND_ITEM, token, None)) + conditions.append(Condition(sign, COND_ITEM, token, None)) sign = True pos = POST_COND elif id == HASH: @@ -424,14 +440,14 @@ def read_data() -> Tuple[ ) condition = operator, conditions sign, operator, conditions = outer.pop() - conditions.append((sign, COND_GROUP, condition, None)) + conditions.append(Condition(sign, COND_GROUP, condition, None)) sign = True pos = POST_COND else: unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == COND: if id == IDENT: - conditions.append((sign, COND_ITEM, token, None)) + conditions.append(Condition(sign, COND_ITEM, token, None)) sign = True pos = POST_COND elif id == HASH: @@ -449,7 +465,7 @@ def read_data() -> Tuple[ unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == LOC: if id == IDENT: - conditions.append((sign, COND_LOC, token, None)) + conditions.append(Condition(sign, COND_LOC, token, None)) sign = True pos = POST_COND else: @@ -464,10 +480,10 @@ def read_data() -> Tuple[ if id == LPAREN: pos = FN_ARG elif id == SEMI: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) pos = END elif id == AND: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) sign = True if operator is True: raise Exception( @@ -476,7 +492,7 @@ def read_data() -> Tuple[ operator = False pos = COND elif id == OR: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) sign = True if operator is False: raise Exception( @@ -485,21 +501,21 @@ def read_data() -> Tuple[ operator = True pos = COND elif id == RPAREN: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) if not outer: raise Exception( f"found `)` at {line + 1}:{char + 1} without matching `(`" ) condition = operator, conditions sign, operator, conditions = outer.pop() - conditions.append((sign, COND_GROUP, condition, None)) + conditions.append(Condition(sign, COND_GROUP, condition, None)) sign = True pos = POST_COND else: unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == FN_ARG: if id == IDENT or id == NUM: - conditions.append((sign, COND_FN, function, token)) + conditions.append(Condition(sign, COND_FN, function, token)) sign = True pos = FN_ARG_END else: @@ -527,7 +543,33 @@ def read_data() -> Tuple[ f"rule `{name}` on line `{line + 1}` shadows a previous rule" ) rule_indices[name] = len(rules) - rules.append((name, flags, operator, conditions)) + rules.append(Rule(name, flags, operator, conditions)) + + for flag in flags: + if flag not in { + "Location", + "Item", + "Goal", + "Early", + "Achievement", + "Grindy", + "Fishing", + "Npc", + "Pickaxe", + "Hammer", + "Minions", + "Armor Minions", + "Mech Boss", + "Final Boss", + "Getfixedboi", + "Not Getfixedboi", + "Calamity", + "Not Calamity", + "Not Calamity Getfixedboi", + }: + raise Exception( + f"rule `{name}` on line `{line + 1}` has unrecognized flag `{flag}`" + ) if "Item" in flags: item_name = flags["Item"] or f"Post-{name}" @@ -558,7 +600,7 @@ def read_data() -> Tuple[ final_bosses.append(flags["Item"] or f"Post-{name}") final_boss_loc.append(name) - if (minions := flags.get("ArmorMinions")) is not None: + if (minions := flags.get("Armor Minions")) is not None: armor_minions[name] = minions if (minions := flags.get("Minions")) is not None: @@ -572,16 +614,19 @@ def read_data() -> Tuple[ goal_indices[goal] = len(goals) goals.append((len(rules), set())) - for name, flags, _, _ in rules: - if "Goal" in flags: - _, items = goals[ - goal_indices[ - name.translate(str.maketrans("", "", string.punctuation)) + for rule in rules: + if "Goal" in rule.flags: + if (name := rule.flags.get("Goal")) is not None: + goal_name = name + else: + goal_name = ( + rule.name.translate(str.maketrans("", "", string.punctuation)) .replace(" ", "_") .lower() - ] - ] - items.add(name) + ) + + _, items = goals[goal_indices[goal_name]] + items.add(rule.name) _, mech_boss_items = goals[goal_indices["mechanical_bosses"]] mech_boss_items.update(mech_boss_loc) @@ -589,24 +634,27 @@ def read_data() -> Tuple[ _, final_boss_items = goals[goal_indices["calamity_final_bosses"]] final_boss_items.update(final_boss_loc) - for name, _, _, conditions in rules: - validate_conditions(name, rule_indices, conditions) + for rule in rules: + validate_conditions(rule.name, rule_indices, rule.conditions) - for name, flags, _, conditions in rules: + for rule in rules: prog = False if ( - "Npc" in flags - or "Goal" in flags - or "Pickaxe" in flags - or "Hammer" in flags - or "Mech Boss" in flags - or "Minions" in flags - or "ArmorMinions" in flags + "Npc" in rule.flags + or "Goal" in rule.flags + or "Pickaxe" in rule.flags + or "Hammer" in rule.flags + or "Mech Boss" in rule.flags + or "Final Boss" in rule.flags + or "Minions" in rule.flags + or "Armor Minions" in rule.flags ): - progression.add(loc_to_item[name]) + progression.add(loc_to_item[rule.name]) prog = True - if prog or "Location" in flags or "Achievement" in flags: - mark_progression(conditions, progression, rules, rule_indices, loc_to_item) + if prog or "Location" in rule.flags or "Achievement" in rule.flags: + mark_progression( + rule.conditions, progression, rules, rule_indices, loc_to_item + ) # Will be randomized via `slot_randoms` / `self.multiworld.random` label = None @@ -685,16 +733,15 @@ def read_data() -> Tuple[ next_id += 1 item_name_to_id["Reward: Coins"] = next_id - item_name_to_id["Victory"] = next_id + 1 - next_id += 2 + next_id += 1 location_name_to_id = {} - for name, flags, _, _ in rules: - if "Location" in flags or "Achievement" in flags: - if name in location_name_to_id: - raise Exception(f"location `{name}` shadows a previous location") - location_name_to_id[name] = next_id + for rule in rules: + if "Location" in rule.flags or "Achievement" in rule.flags: + if rule.name in location_name_to_id: + raise Exception(f"location `{rule.name}` shadows a previous location") + location_name_to_id[rule.name] = next_id next_id += 1 return ( diff --git a/worlds/terraria/Options.py b/worlds/terraria/Options.py index 4c4b96056c..f5056e4a06 100644 --- a/worlds/terraria/Options.py +++ b/worlds/terraria/Options.py @@ -1,40 +1,70 @@ from dataclasses import dataclass -from Options import Choice, DeathLink, PerGameCommonOptions +from Options import Choice, DeathLink, PerGameCommonOptions, Toggle, DefaultOnToggle + + +class Calamity(Toggle): + """Calamity mod bosses and events are shuffled""" + + display_name = "Calamity Mod Integration" + + +class Getfixedboi(Toggle): + """Generation accomodates the secret, very difficult "getfixedboi" seed""" + + display_name = """"getfixedboi" Seed""" class Goal(Choice): - """The victory condition for your run. Stuff after the goal will not be shuffled.""" + """ + The victory condition for your run. Stuff after the goal will not be shuffled. + Primordial Wyrm and Boss Rush are accessible relatively early, so consider "Items" or + "Locations" accessibility to avoid getting stuck on the goal. + """ display_name = "Goal" option_mechanical_bosses = 0 - # option_calamitas_clone = 1 + option_calamitas_clone = 1 option_plantera = 2 option_golem = 3 option_empress_of_light = 4 option_lunatic_cultist = 5 - # option_astrum_deus = 6 + option_astrum_deus = 6 option_moon_lord = 7 - # option_providence_the_profaned_goddess = 8 - # option_devourer_of_gods = 9 - # option_yharon_dragon_of_rebirth = 10 + option_providence_the_profaned_goddess = 8 + option_devourer_of_gods = 9 + option_yharon_dragon_of_rebirth = 10 option_zenith = 11 - # option_calamity_final_bosses = 12 - # option_adult_eidolon_wyrm = 13 + option_calamity_final_bosses = 12 + option_primordial_wyrm = 13 + option_boss_rush = 14 default = 0 -class Achievements(Choice): +class EarlyAchievements(DefaultOnToggle): + """Adds checks upon collecting early Pre-Hardmode achievements. Adds many sphere 1 checks.""" + + display_name = "Early Pre-Hardmode Achievements" + + +class NormalAchievements(DefaultOnToggle): """ - Adds checks upon collecting achievements. Achievements for clearing bosses and events are excluded. - "Exclude Grindy" also excludes fishing achievements. + Adds checks upon collecting achivements not covered by the other options. Achievements for + clearing bosses and events are excluded. """ - display_name = "Achievements" - option_none = 0 - option_exclude_grindy = 1 - option_exclude_fishing = 2 - option_all = 3 - default = 1 + display_name = "Normal Achievements" + + +class GrindyAchievements(Toggle): + """Adds checks upon collecting grindy achievements""" + + display_name = "Grindy Achievements" + + +class FishingAchievements(Toggle): + """Adds checks upon collecting fishing quest achievements""" + + display_name = "Fishing Quest Achievements" class FillExtraChecksWith(Choice): @@ -51,7 +81,12 @@ class FillExtraChecksWith(Choice): @dataclass class TerrariaOptions(PerGameCommonOptions): + calamity: Calamity + getfixedboi: Getfixedboi goal: Goal - achievements: Achievements + early_achievements: EarlyAchievements + normal_achievements: NormalAchievements + grindy_achievements: GrindyAchievements + fishing_achievements: FishingAchievements fill_extra_checks_with: FillExtraChecksWith death_link: DeathLink diff --git a/worlds/terraria/Rewards.dsv b/worlds/terraria/Rewards.dsv index dbae37b449..c8fb969689 100644 --- a/worlds/terraria/Rewards.dsv +++ b/worlds/terraria/Rewards.dsv @@ -121,10 +121,9 @@ Corrupt Flask; Calamity; Crimson Flask; Calamity; Craw Carapace; Calamity; Giant Shell; Calamity; -Fungal Carapace; Calamity; Life Jelly; Calamity; Vital Jelly; Calamity; -Mana Jelly; Calamity; +Cleansing Jelly; Calamity; Giant Tortoise Shell; Calamity; Coin of Deceit; Calamity; Ink Bomb; Calamity; @@ -151,4 +150,11 @@ Depths Charm; Calamity; Anechoic Plating; Calamity; Iron Boots; Calamity; Sprit Glyph; Calamity; -Abyssal Amulet; Calamity; \ No newline at end of file +Abyssal Amulet; Calamity; + +# unshuffled + +Life Crystal; +Enchanted Sword; +Starfury; +Defender Medal; \ No newline at end of file diff --git a/worlds/terraria/Rules.dsv b/worlds/terraria/Rules.dsv index 322bf9c5d3..9ae82d7472 100644 --- a/worlds/terraria/Rules.dsv +++ b/worlds/terraria/Rules.dsv @@ -1,43 +1,57 @@ -// TODO Calamity minion armor +// For the logic to account for all skips, these rules would need to be made much more comprehensive // Starting gear Copper Shortsword; Guide; Npc; // Immediately accessible -Timber!!; Achievement; -Benched; Achievement; -Stop! Hammer Time!; Achievement; -Matching Attire; Achievement; -Fashion Statement; Achievement; -Ooo! Shiny!; Achievement; -No Hobo; Achievement; +Squire Slime; Npc; +Traveling Merchant; ; @npc(2); +Lifeform Analyzer; ; Traveling Merchant; +DPS Meter; ; Traveling Merchant | (@calamity & Wire); +Stopwatch; ; Traveling Merchant; +Timber!!; Achievement | Early; +Benched; Achievement | Early; +Stop! Hammer Time!; Achievement | Early; +Matching Attire; Achievement | Early; +Fashion Statement; Achievement | Early; +Ooo! Shiny!; Achievement | Early; +No Hobo; Achievement | Early; // When NPC shuffling is added, this shouldn't be considered early Merchant; Npc; Bug Net; ; @calamity | Merchant; -Heavy Metal; Achievement; -Nurse; Npc; Merchant; -The Frequent Flyer; Achievement; Nurse; -Demolitionist; Npc; Merchant; +Heavy Metal; Achievement | Early; Dye Trader; Npc; @npc(4); Dye Hard; Achievement; Dye Trader; -Lucky Break; Achievement; -Star Power; Achievement; -You Can Do It!; Achievement; +Demolitionist; Npc; Merchant; +Lucky Break; Achievement | Early; +Star Power; Achievement | Early; +You Can Do It!; Achievement | Early; +Wulfrum Battery; Calamity; +Wulfrum Armor; Calamity | Armor Minions(1); // Surface exploration +Cactus; +Unusual Survival Strategies; Achievement | Early; Aglet; +Radar; +Wand of Sparking; Heliophobia; Achievement; Blighted Gel; Calamity; +Evil Powder; Archaeologist; Achievement | Grindy; Zoologist; Npc; Cat; Npc; Zoologist; Feeling Petty; Achievement; Cat | Dog; Dog; Npc; Zoologist; +Painter; Npc; @npc(8); A Rather Blustery Day; Achievement | Grindy; Enchanted Sword; Pretty in Pink; Achievement | Grindy; Marathon Medalist; Achievement | Grindy; Angler; Npc; +Fisherman's Pocket Guide; ; Angler | Weather Radio; +Weather Radio; ; Angler | Sextant; +Sextant; ; Angler | Fisherman's Pocket Guide; Servant-in-Training; Achievement | Fishing; Angler; \10 Fishing Quests; Achievement | Fishing; Angler; Trout Monkey; Achievement | Fishing; Angler; @@ -45,52 +59,69 @@ Glorious Golden Pole; Achievement | Fishing; Fast and Fishious; Achievement | Fishing; Angler; Supreme Helper Minion!; Achievement | Fishing; Angler; Water Walking Boots; -Painter; Npc; @npc(8); +Aquatic Heart; Calamity; // Sky exploration -Into Orbit; Achievement; +Into Orbit; Achievement | Early; Mysterious Circuitry; Calamity; Dubious Plating; Calamity; Charging Station; Calamity; Codebreaker Base; Calamity; Starfury; +Celestial Magnet; +Clumsy Slime; Npc; // Underground -Watch Your Step!; Achievement; -Throwing Lines; Achievement; +Watch Your Step!; Achievement | Early; +Throwing Lines; Achievement | Early; Torch God; Location | Item(Reward: Torch God's Favor); -Vehicular Manslaughter; Achievement; -Hey! Listen!; Achievement; +Vehicular Manslaughter; Achievement | Early; +Ancient Bone Dust; Calamity; +Depth Meter; +Compass; +Hey! Listen!; Achievement | Early; I Am Loot!; Achievement; +Magic Mirror; Heart Breaker; Achievement; -Hold on Tight!; Achievement; +Nurse; Npc; Merchant; +The Frequent Flyer; Not Calamity Getfixedboi | Achievement; Nurse; +Feast of Midas; Achievement; Bug Net; +Hold on Tight!; Achievement | Early; Feller of Evergreens; Calamity; Gold Hammer; Hammer(55); Gold Pickaxe; Pickaxe(55); +Gold Watch; Like a Boss; Achievement; Hermes Boots; Jeepers Creepers; Achievement; Stylist; Npc; Funkytown; Achievement; Deceiver of Fools; Achievement | Grindy; +Metal Detector; Dead Men Tell No Tales; Achievement; Bulldozer; Achievement | Grindy; // Cavern Obsidian; Obsidian Skull; ; Obsidian; +Raider's Talisman; Calamity; Obsidian; There are Some Who Call Him...; Achievement | Grindy; Lava Charm; Demonite Ore; -Demonite Bar; ; Demonite Ore | (@calamity & #Calamity Evil Boss); +Demonite Bar; ; Demonite Ore; Evil Sword; ; Demonite Bar; +Coin of Deceit; Calamity; Demonite Bar | Ruin Medallion; // Underground Ice Ice Skates; -Flinx Fur Coat; ArmorMinions(1); +Flinx Fur Coat; Armor Minions(1); // Underground Desert +Stormlion Mandible; Calamity; Golfer; Npc; +Party Girl; Npc; @npc(14); +Jolly Jamboree; Achievement | Grindy; Party Girl; +Cool Slime; Npc; Party Girl; // Sunken Sea Sea Prism; Calamity; @@ -98,37 +129,50 @@ Navyplate; Calamity; // Underground Jungle Anklet of the Wind; +Feral Claws; Stinger; Jungle Spores; Vine; Blade of Grass; ; Stinger & Jungle Spores & Vine; +Nature's Gift; +Bezoar; Summoning Potion; Minions(1); +// The Aether +A Shimmer In The Dark; Achievement; + // Underworld It's Getting Hot in Here; Achievement; Rock Bottom; Achievement; Obsidian Rose; Havocplate; Calamity; +Magma Stone; // Evil Smashing, Poppet!; Achievement; Arms Dealer; Npc; Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything Completely Awesome; Achievement; Arms Dealer; +Illegal Gun Parts; ; Arms Dealer | Flamethrower; + +// Abyss +Ink Bomb; Calamity; // King Slime King Slime; Location | Item; -Sticky Situation; Achievement | Grindy; +Sticky Situation; Not Getfixedboi | Achievement | Grindy; The Cavalry; Achievement; Solidifier; ; #King Slime; +Nerdy Slime; Npc; #King Slime; // Desert Scourge Desert Scourge; Calamity | Location | Item; Pearl Shard; Calamity; #Desert Scourge; Sea Remains; Calamity; Pearl Shard; Reefclaw Hamaxe; Calamity | Hammer(60); Sea Remains; +Victide Armor; Calamity | Armor Minions(1); Sea Remains; Sandstorm; ; ~@calamity | Desert Scourge; -Voltaic Jelly; Calamity | Minions(1); Desert Scourge; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades. +Voltaic Jelly; Calamity | Minions(1); Desert Scourge | Jelly-Charged Battery; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades. // Giant Clam Giant Clam; Calamity | Location | Item; Desert Scourge; @@ -136,18 +180,21 @@ Amidias; Calamity; // Blood Moon Bloodbath; Achievement | Grindy; +Blood Orb; Calamity; +Shark Tooth Necklace; Til Death...; Achievement | Grindy; -Quiet Neighborhood; Achievement; +Quiet Neighborhood; Achievement | Early; +Surly Slime; Npc; // Eye of Cthulhu Eye of Cthulhu; Location | Item; Dryad; Npc; Eye of Cthulhu | Evil Boss | Skeletron; Pumpkin Seeds; ; Dryad; -Pumpkin; ; Pumpkin Seeds; -Purification Powder; ; Dryad; // Shimmered from Evil Powder in 1.4.4. Not bought from Dryad in get fixed boi. -Party Girl; Npc; @npc(14); -Jolly Jamboree; Achievement | Grindy; Party Girl; -Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu; +Pumpkin; ; Pumpkin Seeds | Cactus; +Purification Powder; ; (~@getfixedboi & Dryad) | Evil Powder; +Mystic Slime; Npc; Purification Powder; +And Good Riddance!; Achievement | Grindy; Dryad; +Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu | Wall of Flesh | Aquatic Scourge; // Crabulon Crabulon; Calamity | Location | Item; @@ -156,112 +203,160 @@ Crabulon; Calamity | Location | Item; Evil Boss; Location | Item; Evil Boss Part; ; #Evil Boss; Evil Pickaxe; Pickaxe(65); Evil Boss Part; -Obsidian Armor; ArmorMinions(1); Obsidian & Evil Boss Part; +Obsidian Armor; Armor Minions(1); Obsidian & Evil Boss Part; Tavernkeep; Npc; Evil Boss; Old One's Army Tier 1; Location | Item; Tavernkeep; -Meteorite; ; Evil Boss; -Meteorite Bar; ; Meteorite; +Meteorite; ; #Evil Boss | Evil Boss | Meteorite Bar | (@calamity & Astral Infection); +Meteorite Bar; ; Meteorite | (@calamity & Astral Infection) | Meteor Staff; Meteor Hamaxe; Hammer(60); Meteorite Bar; Hellforge; ; @pickaxe(60); -Hellstone; ; @pickaxe(65) | Wall of Flesh; +Hellstone; ; @pickaxe(65) | Wall of Flesh | Hellstone Bar; Hellstone Bar; ; Hellstone; Fiery Greatsword; ; Hellstone Bar; Molten Hamaxe; Hammer(70); Hellstone Bar; Molten Pickaxe; Pickaxe(100); Hellstone Bar; Miner for Fire; Achievement; Molten Pickaxe; -Hot Reels!; Achievement; Hellstone Bar & Bug Net; // TODO Calamity +Hot Reels!; Achievement; Hellstone Bar & (@calamity | Bug Net); Brimstone Slag; Calamity; @pickaxe(100); // Goblin Army Goblin Army; Location | Item; Goblin Tinkerer; Npc; Goblin Army; Tinkerer's Workshop; ; Goblin Tinkerer; +Mana Flower; ; (Tinkerer's Workshop & Nature's Gift) | (@calamity & Ethereal Talisman); +Silencing Sheath; Calamity; (Tinkerer's Workshop & Demonite Bar & Evil Boss Part) | Dark Matter Sheath; Rocket Boots; ; Goblin Tinkerer; Spectre Boots; ; Tinkerer's Workshop & Hermes Boots & Rocket Boots; Lightning Boots; ; Tinkerer's Workshop & Spectre Boots & Anklet of the Wind & Aglet; Frostspark Boots; ; Tinkerer's Workshop & Lightning Boots & Ice Skates; Lava Waders; ; Tinkerer's Workshop & Obsidian Skull & Lava Charm & Obsidian Rose & Water Walking Boots; Terraspark Boots; ; Tinkerer's Workshop & Frostspark Boots & Lava Waders; +GPS; ; Tinkerer's Workshop & Depth Meter & Gold Watch & Compass; +Goblin Tech; ; Tinkerer's Workshop & DPS Meter & Stopwatch & Metal Detector; +Fish Finder; ; Tinkerer's Workshop & Fisherman's Pocket Guide & Weather Radio & Sextant; Boots of the Hero; Achievement | Grindy; Terraspark Boots; +Diving Gear; ; Tinkerer's Workshop; // Queen Bee Where's My Honey?; Achievement; Queen Bee; Location | Item; Bee Keeper; ; #Queen Bee; Bee Wax; ; #Queen Bee; -Bee Armor; ArmorMinions(2); Bee Wax; +Bee Armor; Armor Minions(2); Bee Wax; Not the Bees!; Achievement; #Queen Bee & Bee Armor; Witch Doctor; Npc; Queen Bee; -Pygmy Necklace; Minions(1); Witch Doctor; +Pygmy Necklace; Minions(1); Witch Doctor | (@calamity & Statis' Blessing); // Calamity Evil Boss -Calamity Evil Boss; Calamity | Location | Item; -Aerialite Ore; Calamity; Calamity Evil Boss & @pickaxe(65); -Aerialite Bar; Calamity; Aerialite Ore; +The Hive Mind; Calamity | Location | Item; +The Perforators; Calamity | Location | Item; +Blood Sample; Calamity; #The Perforators; +Aerialite Ore; Calamity; The Hive Mind | The Perforators | Cobalt Ore | Aerialite Bar; // No pick needed; can be fished +Aerialite Bar; Calamity; Aerialite Ore | Feather Crown; Aerial Hamaxe; Calamity | Hammer(70); Aerialite Bar; Skyfringe Pickaxe; Calamity | Pickaxe(75); Aerialite Bar; +Aerospec Armor; Calamity | Armor Minions(1); Aerialite Bar; +Feather Crown; Calamity; Aerialite Bar | Moonstone Crown; // Skeletron Skeletron; Location | Item; Clothier; Npc; Skeletron; Dungeon; ; Skeletron; Dungeon Heist; Achievement; Dungeon; -Bone; ; Dungeon | (@calamity & #Skeletron); -Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard); +Bone; ; Dungeon | (@calamity & (#Skeletron | (@getfixedboi & #Ravager) | Mirage Mirror)); +Mirage Mirror; Calamity; (Tinkerer's Workshop & Bone) | Abyssal Mirror; +Tally Counter; ; Dungeon; +R.E.K. 3000; ; Tinkerer's Workshop & Radar & Tally Counter & Lifeform Analyzer; +PDA; ; Tinkerer's Workshop & GPS & R.E.K. 3000 & Goblin Tech & Fish Finder; +Cell Phone; ; (Tinkerer's Workshop & Magic Mirror & PDA) | (@getfixedboi & @calamity & #Polterghast); +Black Mirror; Achievement | Grindy; Cell Phone; +Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard) | Alchemy Table; +Alchemy Table; ; Dungeon | Bewitching Table; Mechanic; ; Dungeon; -Wire; ; Mechanic; +Wire; ; Mechanic | (@calamity & Electrician's Glove); Decryption Computer; Calamity; Mysterious Circuitry & Dubious Plating & Wire; Actuator; ; Mechanic; Muramasa; ; Dungeon; +Cobalt Shield; ; Dungeon | (@calamity & Cobalt Bar); +Obsidian Shield; ; Tinkerer's Workshop & Cobalt Shield & Obsidian Skull; +Elder Slime; Npc; Skeletron & Dungeon; // Deerclops Deerclops; Location | Item; // The Slime God The Slime God; Calamity | Location | Item; Blighted Gel; -Purified Gel; Calamity; #The Slime God; +Purified Gel; Calamity; #The Slime God | Jelly-Charged Battery; +Jelly-Charged Battery; Calamity; (Wulfrum Battery & Voltaic Jelly & Purified Gel & Stormlion Mandible) | Star-Tainted Generator; Static Refiner; Calamity; Purified Gel & Solidifier; Gelpick; Calamity | Pickaxe(100); Static Refiner & Purified Gel & Blighted Gel; +Statigel Armor; Calamity | Armor Minions(1); Static Refiner & Purified Gel & Blighted Gel; Night's Edge; ; Evil Sword & Muramasa & Blade of Grass & Fiery Greatsword & (~@calamity | Purified Gel); // Wall of Flesh Wall of Flesh; Location | Item(Hardmode); Guide; Pwnhammer; Hammer(80); #Wall of Flesh; +Emblem; ; #Wall of Flesh | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem | Statis' Blessing)); +Fast Clock; ; Wall of Flesh | Trifold Map | (@calamity & Wire & Pixie Dust & Soul of Light); Wizard; Npc; Wall of Flesh; -Tax Collector; Npc; Purification Powder & Wall of Flesh; +Titan Glove; ; Wall of Flesh | Power Glove; +Power Glove; ; Tinkerer's Workshop & Titan Glove & Feral Claws; +Magic Quiver; ; Wall of Flesh | (@calamity & Elemental Quiver); +Hallowed Seeds; ; (Wall of Flesh & Dryad) | Holy Water; +Armor Polish; ; Wall of Flesh | Vitamins | (@calamity & Bone & Ancient Bone Dust); +Adhesive Bandage; ; @calamity | Wall of Flesh; +Medicated Bandage; ; Tinkerer's Workshop & Bezoar & Adhesive Bandage; +Megaphone; ; Wall of Flesh | Nazar | (@calamity & Wire & Cobalt Bar); +Pocket Mirror; ; Wall of Flesh | Blindfold | (@calamity & Crystal Shard & Soul of Night); +Trifold Map; ; Wall of Flesh | Fast Clock | (@calamity & Soul of Light & Soul of Night); +The Plan; ; Tinkerer's Workshop & Trifold Map & Fast Clock; +Tax Collector; Npc; (Purification Powder & Wall of Flesh) | @getfixedboi; Spider Fangs; ; Wall of Flesh; -Spider Armor; ArmorMinions(3); Spider Fangs; +Spider Armor; Armor Minions(3); Spider Fangs; Cross Necklace; ; Wall of Flesh; Altar; ; Wall of Flesh & @hammer(80); Begone, Evil!; Achievement; Altar; -Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh; +Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh | Mythril Ore | Cobalt Bar; Extra Shiny!; Achievement; Cobalt Ore | Mythril Ore | Adamantite Ore | Chlorophyte Ore; -Cobalt Bar; ; Cobalt Ore | Wall of Flesh; +Cobalt Bar; ; Cobalt Ore | (@calamity & Lunic Eye) | Wall of Flesh; Cobalt Pickaxe; Pickaxe(110); Cobalt Bar; -Soul of Night; ; Wall of Flesh | (@calamity & Altar); +Blindfold; ; @calamity | Wall of Flesh | Pocket Mirror; +Reflective Shades; ; Tinkerer's Workshop & Blindfold & Pocket Mirror; +Vitamins; ; Wall of Flesh | Armor Polish | (@calamity & Alchemy Table & Blood Orb); +Armor Bracing; ; Tinkerer's Workshop & Vitamins & Armor Polish; +Nazar; ; Wall of Flesh | Megaphone | (@calamity & Soul of Night); +Countercurse Mantra; ; Tinkerer's Workshop & Nazar & Megaphone; +Ankh Charm; ; Tinkerer's Workshop & Reflective Shades & Armor Bracing & Medicated Bandage & Countercurse Mantra & The Plan; +Ankh Shield; ; Tinkerer's Workshop & Obsidian Shield & Ankh Charm; +Ankhumulation Complete; Achievement | Grindy; Ankh Shield; +Soul of Night; ; Wall of Flesh | (@calamity & (Altar | (@getfixedboi & #Duke Fishron))); Hallow; ; Wall of Flesh; -Pixie Dust; ; Hallow; +Pixie Dust; ; Hallow | Meteor Staff | Holy Water; +Holy Water; ; (Pixie Dust & Hallowed Seeds) | (@calamity & Statis' Blessing); Unicorn Horn; ; Hallow; Crystal Shard; ; Hallow; Axe of Purity; Calamity; Feller of Evergreens & Purification Powder & Pixie Dust & Crystal Shard; -Soul of Light; ; Hallow | (@calamity & #Queen Slime); +Fabsol's Vodka; Calamity; (Pixie Dust & Crystal Shard & Unicorn Horn) | (@getfixedboi & #Empress of Light); +Soul of Light; ; Hallow | (@calamity & (#Queen Slime | (@getfixedboi & #Duke Fishron))) | Light Disc | Meteor Staff; +Meteor Staff; ; (Hardmode Anvil & Meteorite Bar & Pixie Dust & Soul of Light) | Asteroid Staff; Blessed Apple; ; Hallow; Rod of Discord; ; Hallow; Gelatin World Tour; Achievement | Grindy; Dungeon & Wall of Flesh & Hallow & #King Slime; Soul of Flight; ; Wall of Flesh; -Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator); // Leaf Wings are Post-Plantera in 1.4.4 +Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Plantera & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator); Bunny; Npc; Zoologist & Wall of Flesh; // Extremely simplified Forbidden Fragment; ; Sandstorm & Wall of Flesh; -Astral Infection; Calamity; Wall of Flesh; -Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus; +Astral Infection; Calamity; Wall of Flesh | Astrum Aureus; +Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus | Eye of Magnus | Meld Construct; +Lunic Eye; Calamity; (Cobalt Bar & Stardust) | Eye of Magnus; Trapper Bulb; Calamity; Wall of Flesh; Titan Heart; Calamity; Astral Infection; Essence of Sunlight; Calamity; Wall of Flesh | Golem; -Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen; // TODO Check -Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental; -Don't Dread on Me; Achievement; Wall of Flesh; -Earth Elemental; Calamity | Location | Item; Wall of Flesh; -Cloud Elemental; Calamity | Location | Item; Wall of Flesh; +Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen | (@getfixedboi & #Duke Fishron); +Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental | Ruin Medallion; +Dreadnautilus; Calamity | Location | Item; Wall of Flesh; +Don't Dread on Me; Not Calamity | Achievement; Wall of Flesh; +Hardmode Giant Clam; Calamity | Location | Item; #Giant Clam & Wall of Flesh; Truffle; Npc; Wall of Flesh; It Can Talk?!; Achievement; Truffle; The First Shadowflame; Calamity | Minions(1); Goblin Army | Wall of Flesh; @@ -271,103 +366,125 @@ Pirate Invasion; Location | Item; Pirate; Npc; Pirate Invasion; // Queen Slime -Queen Slime; Location | Item; Hallow; +Queen Slime; Location | Item; Hallow | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus); +Sparkle Slime Balloon; ; #Queen Slime; +Diva Slime; Npc; Sparkle Slime Balloon; +The Great Slime Mitosis; Achievement; Nerdy Slime & Cool Slime & Elder Slime & Clumsy Slime & Diva Slime & Surly Slime & Mystic Slime & Squire Slime; // Aquatic Scourge -Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | (Wall of Flesh & (~@calamity | @mech_boss(1))); -Mythril Bar; ; Mythril Ore | (Wall of Flesh & (~@calamity | @mech_boss(1))); +Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | Wall of Flesh | Adamantite Ore | Mythril Bar; +Mythril Bar; ; Mythril Ore | Wall of Flesh | (@calamity & Electrician's Glove); Hardmode Anvil; ; Mythril Bar; Mythril Pickaxe; Pickaxe(150); Hardmode Anvil & Mythril Bar; -Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | (Wall of Flesh & (~@calamity | @mech_boss(2))); +Electrician's Glove; Calamity; (Hardmode Anvil & Wire & Mythril Bar) | Nanotech; +Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | Wall of Flesh | (~@calamity & Chlorophyte Ore) | Adamantite Bar | (@calamity & Hallowed Ore); Hardmode Forge; ; Hardmode Anvil & Adamantite Ore & Hellforge; -Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | (Wall of Flesh & (~@calamity | @mech_boss(2))); +Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | Wall of Flesh; Adamantite Pickaxe; Pickaxe(180); Hardmode Anvil & Adamantite Bar; -Forbidden Armor; ArmorMinions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment; +Forbidden Armor; Armor Minions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment; Aquatic Scourge; Calamity | Location | Item; -The Twins; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Light; -Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core; -The Destroyer; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night; -Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum; -Skeletron Prime; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone; -# mechanical_bosses Cragmaw Mire; Calamity | Location | Item; #Acid Rain Tier 2; -Nuclear Rod; Calamity | Minions(1); #Cragmaw Mire; -Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & Aquatic Scourge; +Nuclear Fuel Rod; Calamity | Minions(1); #Cragmaw Mire | Star-Tainted Generator; +Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & (Aquatic Scourge | Acid Rain Tier 3); +Mechanical Eye; ; (@calamity | Hardmode Anvil) & Soul of Light; +Mechanical Worm; ; (@calamity | Hardmode Anvil) & Soul of Night; +Mechanical Skull; ; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone; +Ocram's Razor; Getfixedboi; (@calamity | Hardmode Anvil) & Mechanical Eye & Mechanical Worm & Mechanical Skull; +The Twins; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Eye) | (@getfixedboi & Ocram's Razor); +Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core; +The Destroyer; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Worm) | (@getfixedboi & Ocram's Razor); +Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum; +Skeletron Prime; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Skull) | (@getfixedboi & Ocram's Razor); +# mechanical_bosses // The Twins -Soul of Sight; ; #The Twins; +Soul of Sight; ; #The Twins | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem)); Steampunker; Npc; @mech_boss(1); Hammush; ; Truffle & @mech_boss(1); Rainbow Rod; ; Hardmode Anvil & Crystal Shard & Unicorn Horn & Pixie Dust & Soul of Light & Soul of Sight; Prismancer; Achievement; Rainbow Rod; Long Ranged Sensor Array; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Wire & Decryption Computer & Codebreaker Base; Hydraulic Volt Crusher; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Soul of Sight; -Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh)); +Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh | (@getfixedboi & #Plantera))); Get a Life; Achievement; Life Fruit; Topped Off; Achievement; Life Fruit; Old One's Army Tier 2; Location | Item; #Old One's Army Tier 1 & ((Wall of Flesh & @mech_boss(1)) | #Old One's Army Tier 3); // Brimstone Elemental Infernal Suevite; Calamity; @pickaxe(150) | Brimstone Elemental; -Unholy Core; Calamity; Infernal Suevite & Hellstone; +Unholy Core; Calamity; (Infernal Suevite & Hellstone) | Brimstone Elemental; +Ruin Medallion; Calamity; (Hardmode Anvil & Coin of Deceit & Unholy Core & Essence of Havoc) | Dark Matter Sheath; // The Destroyer -Soul of Might; ; #The Destroyer; +Soul of Might; ; #The Destroyer | Avenger Emblem | Light Disc | (@calamity & (Mechanical Glove | Celestial Emblem)); // Cryogen -Cryonic Ore; Calamity; Cryogen & (@pickaxe(180) | @mech_boss(2)); -Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode; +Cryonic Ore; Calamity; (Cryogen & (@pickaxe(180) | @mech_boss(2))) | Cryonic Bar; +Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode | (Cryogen & @mech_boss(2)) | Life Alloy; Abyssal Warhammer; Calamity | Hammer(88); Hardmode Anvil & Cryonic Bar; Shardlight Pickaxe; Calamity | Pickaxe(180); Hardmode Anvil & Cryonic Bar; +Daedalus Armor; Calamity | Armor Minions(2); Hardmode Anvil & Cryonic Bar & Essence of Eleum; // Skeletron Prime -Soul of Fright; ; #Skeletron Prime; +Soul of Fright; ; #Skeletron Prime | Avenger Emblem | Flamethrower | (@calamity & (Mechanical Glove | Celestial Emblem)); Inferna Cutter; Calamity; Hardmode Anvil & Axe of Purity & Soul of Fright & Essence of Havoc; +Flamethrower; ; (Hardmode Anvil & Illegal Gun Parts & Soul of Fright) | (@getfixedboi & @calamity & #Skeletron); Buckets of Bolts; Achievement; #The Twins & #The Destroyer & #Skeletron Prime; -Mecha Mayhem; Achievement; #The Twins & #The Destroyer & #Skeletron Prime; -Hallowed Bar; ; (#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3)); // Can't count on Hallowed Ore, since the player may be in prehardmode (TODO Check this) -Hallowed Armor; ArmorMinions(3); Hardmode Anvil & Hallowed Bar; +Mecha Mayhem; Achievement | Not Getfixedboi; #The Twins & #The Destroyer & #Skeletron Prime; +Hallowed Ore; Calamity; (@mech_boss(3) & @pickaxe(180)) | Chlorophyte Ore | Hallowed Bar; +Hallowed Bar; ; ((#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3))) | (@calamity & Hardmode Forge & Hallowed Ore) | Light Disc; +Hallowed Armor; Armor Minions(3); Hardmode Anvil & Hallowed Bar; Excalibur; ; Hardmode Anvil & Hallowed Bar; Pickaxe Axe; Pickaxe(200); Hardmode Anvil & Hallowed Bar & Soul of Fright & Soul of Might & Soul of Sight; Drax Attax; Achievement; Pickaxe Axe; True Night's Edge; ; Hardmode Anvil & Night's Edge & Soul of Fright & Soul of Might & Soul of Sight; -Chlorophyte Ore; ; Wall of Flesh & @pickaxe(200); +Avenger Emblem; ; (Tinkerer's Workshop & Emblem & Soul of Might & Soul of Sight & Soul of Fright) | (@calamity & (Sand Shark Tooth Necklace | Sigil of Calamitas)) | (~@calamity & (Mechanical Glove | Celestial Emblem)); +Mechanical Glove; ; (Power Glove & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Fire Gauntlet; +Celestial Emblem; ; (Celestial Magnet & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Sigil of Calamitas; +Light Disc; ; (Hallowed Bar & Soul of Light & Soul of Might) | (@getfixedboi & @calamity & #Evil Boss); +Chlorophyte Ore; ; (Wall of Flesh & @pickaxe(200)) | (~@calamity & Luminite) | Chlorophyte Bar | (@calamity & Perennial Ore); Photosynthesis; Achievement; Chlorophyte Ore; -Chlorophyte Bar; ; Hardmode Forge & Chlorophyte Ore; +Chlorophyte Bar; ; (Hardmode Forge & Chlorophyte Ore) | Spectre Bar | Shroomite Bar; True Excalibur; ; Hardmode Anvil & Excalibur & Chlorophyte Bar; Chlorophyte Pickaxe; Pickaxe(200); Hardmode Anvil & Chlorophyte Bar; Chlorophyte Warhammer; Hammer(90); Hardmode Anvil & Chlorophyte Bar; // Calamitas Clone Calamitas Clone; Calamity | Location | Item | Goal; Hardmode Anvil & Hellstone Bar & Essence of Havoc; -Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | (@calamity & Hardmode Anvil & Trapper Bulb)); +Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | @calamity); # calamitas_clone # plantera -Ashes of Calamity; Calamity; #Calamitas Clone; +Ashes of Calamity; Calamity; #Calamitas Clone | Sigil of Calamitas; +Depth Cells; Calamity; Calamitas Clone | Abyssal Mirror; +Lumenyl; Calamity; Calamitas Clone | Abyssal Mirror; +Abyssal Mirror; Calamity; (Hardmode Anvil & Mirage Mirror & Ink Bomb & Depth Cells & Lumenyl) | Eclipse Mirror; +Fathom Swarmer Armor; Calamity | Armor Minions(2); Hardmode Anvil & Sea Remains & Depth Cells; // Plantera The Axe; Hammer(100); #Plantera; Seedler; ; #Plantera; Living Shard; Calamity; #Plantera; -Tiki Armor; ArmorMinions(4); Witch Doctor & Wall of Flesh & Plantera; +Tiki Armor; Armor Minions(4); Witch Doctor & Wall of Flesh & Plantera; Hercules Beetle; ; Witch Doctor & Wall of Flesh & Plantera; You and What Army?; Achievement; @minions(8); Cyborg; Npc; Plantera; +To Infinity... and Beyond!; Achievement; Cyborg & Wall of Flesh; Autohammer; ; Truffle & Plantera; Shroomite Bar; ; Autohammer & Chlorophyte Bar; Shroomite Digging Claw; Pickaxe(200); Hardmode Anvil & Shroomite Bar; Princess; Npc; Guide & Merchant & Nurse & Demolitionist & Dye Trader & Zoologist & Angler & Painter & Stylist & Golfer & Arms Dealer & Dryad & Party Girl & Tavernkeep & Goblin Tinkerer & Witch Doctor & Clothier & Wizard & Truffle & Tax Collector & Pirate & Steampunker & Cyborg; Real Estate Agent; Achievement; Princess; -Ectoplasm; ; ((Dungeon & Wall of Flesh) | @calamity) & Plantera; +Ectoplasm; ; (((Dungeon & Wall of Flesh) | @calamity) & Plantera) | Spectre Bar; Paladin's Shield; ; Dungeon & Wall of Flesh & Plantera; -Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode; +Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity | Statis' Blessing; +Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity; +Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity; +Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode | Deadshot Brooch; +Deadshot Brooch; Calamity; (Hardmode Anvil & Emblem & Core of Calamity) | Elemental Quiver; Spectre Bar; ; Hardmode Forge & Chlorophyte Bar & Ectoplasm; Spectre Pickaxe; Pickaxe(200); Hardmode Anvil & Spectre Bar; Spectre Hamaxe; Hammer(90); Hardmode Anvil & Spectre Bar; -Robbing the Grave; Achievement; Dungeon & Plantera; +Robbing the Grave; Achievement; Dungeon & Wall of Flesh & Plantera; Evil Key; ; Plantera | (@calamity & #Wall of Flesh); Frozen Key; ; Plantera | (@calamity & #Cryogen); Jungle Key; ; Plantera | (@calamity & #Plantera); @@ -376,22 +493,25 @@ Desert Key; ; Big Booty; Achievement; Dungeon & Wall of Flesh & Plantera & (Evil Key | Frozen Key | Jungle Key | Hallowed Key | Desert Key); Rainbow Gun; ; Dungeon & Wall of Flesh & Plantera & Hallowed Key; Rainbows and Unicorns; Achievement; Blessed Apple & Rainbow Gun; -Perennial Ore; Calamity; Plantera; -Perennial Bar; Calamity; Hardmode Forge & Perennial Ore; +Perennial Ore; Calamity; Plantera | Perennial Bar; +Perennial Bar; Calamity; (Hardmode Forge & Perennial Ore) | Plantera | Life Alloy; Beastial Pickaxe; Calamity | Pickaxe(200); Hardmode Anvil & Perennial Bar; -Armored Digger; Calamity | Location | Item; Plantera; // TODO Check // Solar Eclipse Temple Raider; Achievement; #Plantera; Lihzahrd Temple; ; #Plantera | (Plantera & Actuator) | @pickaxe(210) | (@calamity & Hardmode Anvil & Soul of Light & Soul of Night); +Lihzahrd Furniture; ; Lihzahrd Temple; Solar Eclipse; ; Lihzahrd Temple & Wall of Flesh; -Broken Hero Sword; ; (Solar Eclipse & Plantera & @mech_boss(3)) | (@calamity & #Calamitas Clone); +Broken Hero Sword; ; Solar Eclipse & Plantera & @mech_boss(3); Terra Blade; ; Hardmode Anvil & True Night's Edge & True Excalibur & Broken Hero Sword & (~@calamity | Living Shard); Sword of the Hero; Achievement; Terra Blade; +Neptune's Shell; ; Solar Eclipse; Kill the Sun; Achievement; Solar Eclipse; // Great Sand Shark Great Sand Shark; Calamity | Location | Item; Hardmode Anvil & Forbidden Fragment & Core of Sunlight; +Grand Scale; Calamity; #Great Sand Shark | Sand Shark Tooth Necklace; +Sand Shark Tooth Necklace; Calamity; (Tinkerer's Workshop & Shark Tooth Necklace & Avenger Emblem & Grand Scale) | (@getfixedboi & #Desert Scourge); // Leviathan and Anahita Leviathan and Anahita; Calamity | Location | Item; @@ -404,32 +524,40 @@ Starbuster Core; Calamity | Minions(1); Golem; Location | Item | Goal; (Wall of Flesh & Plantera & Lihzahrd Temple) | (@calamity & Hardmode Anvil & Lihzahrd Temple & Essence of Sunlight); # golem Picksaw; Pickaxe(210); #Golem; -Lihzahrd Brick; ; @pickaxe(210); -Scoria Ore; Calamity; Golem | @pickaxe(210); -Scoria Bar; Calamity; Hardmode Forge & Scoria Ore; +Lihzahrd Brick; ; @pickaxe(210) | (Lihzahrd Furniture & Golem) | (@calamity & Lihzahrd Temple); +Scoria Ore; Calamity; Golem | @pickaxe(210) | Astral Ore | Luminite | Scoria Bar; +Scoria Bar; Calamity; (Hardmode Forge & Scoria Ore) | Golem | Life Alloy | Sigil of Calamitas | Fire Gauntlet; Seismic Hampick; Calamity | Pickaxe(210) | Hammer(95); Hardmode Anvil & Scoria Bar; -Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode; +Hydrothermic Armor; Calamity | Armor Minions(2); Hardmode Anvil & Scoria Bar & Core of Havoc; +Fire Gauntlet; ; (Tinkerer's Workshop & Magma Stone & Mechanical Glove & (~@calamity | Scoria Bar)) | (@calamity & Elemental Gauntlet); +Sigil of Calamitas; Calamity; (Hardmode Anvil & Celestial Emblem & Scoria Bar & Ashes of Calamity) | Ethereal Talisman; +Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode | Star-Tainted Generator | (@getfixedboi & #Yharon, Dragon of Rebirth); Advanced Display; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Life Alloy & Long Ranged Sensor Array; +Star-Tainted Generator; Calamity; (Hardmode Anvil & Jelly-Charged Battery & Nuclear Fuel Rod & Starbuster Core & Life Alloy) | Nucleogenesis; Old One's Army Tier 3; Location | Item; #Old One's Army Tier 1 & Wall of Flesh & Golem; // Martian Madness Martian Madness; Location | Item; Wall of Flesh & Golem; +Laser Drill; Pickaxe(220); #Martian Madness; Influx Waver; ; #Martian Madness; // The Plaguebringer Goliath -Plague Cell Canister; Calamity; Golem; -Plaguebringer; Calamity | Location | Item; Golem; +Plague Cell Canister; Calamity; Golem | Alchemical Flask | (@getfixedboi & #Queen Bee); +Alchemical Flask; Calamity; (Hardmode Anvil & Bee Wax & Plague Cell Canister) | (@getfixedboi & #Queen Bee); The Plaguebringer Goliath; Calamity | Location | Item; Hardmode Anvil & Plague Cell Canister; +Infected Armor Plating; Calamity; #The Plaguebringer Goliath; +Plaguebringer Armor; Calamity | Armor Minions(3); Hardmode Anvil & Bee Armor & Alchemical Flask & Plague Cell Canister & Infected Armor Plating; // Duke Fishron -Duke Fishron; Location | Item; Bug Net & Wall of Flesh; +Duke Fishron; Location | Item; (Bug Net & Wall of Flesh) | (@getfixedboi & @calamity & #Astrum Deus); // Pumpkin Moon Pumpkin Moon; ; Hardmode Anvil & Pumpkin & Ectoplasm & (@calamity | Hallowed Bar); -Spooky Armor; ArmorMinions(4); Pumpkin Moon; +Spooky Armor; Armor Minions(4); Pumpkin Moon; Mourning Wood; Location | Item; Pumpkin Moon; Necromantic Scroll; Minions(1); #Mourning Wood; -Papyrus Scarab; Minions(1); Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll; +Papyrus Scarab; Minions(1); (Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll) | (@calamity & Statis' Blessing); +Statis' Blessing; Calamity; (Hardmode Anvil & Papyrus Scarab & Pygmy Necklace & Emblem & Holy Water & Core of Sunlight) | Statis' Curse; Pumpking; Location | Item; Pumpkin Moon; The Horseman's Blade; ; #Pumpking; Baleful Harvest; Achievement; Pumpkin Moon; @@ -451,11 +579,11 @@ Ravager; Calamity | Location | Item; Fleshy Geode; Calamity; #Ravager; // Empress of Light -Empress of Light; Location | Item | Goal; Wall of Flesh & Hallow & (@calamity | Plantera); +Empress of Light; Location | Item | Goal; (Wall of Flesh & Hallow & (@calamity | Plantera)) | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus); # empress_of_light // Lunatic Cultist -Lunatic Cultist; Location | Item | Goal; (@calamity | (Dungeon & Golem)) & Wall of Flesh; +Lunatic Cultist; Location | Item | Goal; ((@calamity | (Dungeon & Golem)) & Wall of Flesh) | (@calamity & Calamitas Clone); Astrum Deus; Calamity | Location | Item | Goal; Titan Heart; # lunatic_cultist # astrum_deus @@ -463,111 +591,142 @@ Ancient Manipulator; ; // Lunar Events Lunar Events; Location | Item; #Lunatic Cultist; -Fragment; ; #Lunar Events | #Astrum Deus; -Galactica Singularity; Calamity; Ancient Manipulator & Fragment; -Meld Blob; Calamity; #Lunar Events | #Astrum Deus; -Meld Construct; Calamity; Ancient Manipulator & Meld Blob & Stardust; +Fragment; ; #Lunar Events | #Astrum Deus | (Ancient Manipulator & (Nebula Fragment | Stardust Fragment)) | (@calamity & Galactica Singularity); +Nebula Fragment; ; Fragment | (@calamity & Eye of Magnus); +Eye of Magnus; Calamity; (Ancient Manipulator & Lunic Eye & Nebula Fragment) | (@getfixedboi & #Wall of Flesh); +Stardust Fragment; ; Fragment | (@calamity & Statis' Curse); +Statis' Curse; Calamity; (Ancient Manipulator & Statis' Blessing & The First Shadowflame & Stardust Fragment) | Nucleogenesis; +Galactica Singularity; Calamity; (Ancient Manipulator & Fragment) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman; +Meld Blob; Calamity; #Lunar Events | #Astrum Deus | (Astral Infection & Astrum Deus) | Meld Construct; +Meld Construct; Calamity; (Ancient Manipulator & Meld Blob & Stardust) | Dark Matter Sheath; +Dark Matter Sheath; Calamity; (Ancient Manipulator & Silencing Sheath & Ruin Medallion & Meld Construct) | Eclipse Mirror; // Astrum Deus -Astral Ore; Calamity; Wall of Flesh & Astrum Deus; -Astral Bar; Calamity; Ancient Manipulator & Stardust & Astral Ore; +Astral Ore; Calamity; (Astral Infection & Astrum Deus) | Astral Bar; // No pick needed; you can fish it +Astral Bar; Calamity; (Ancient Manipulator & Stardust & Astral Ore) | (Astral Infection & Astrum Deus); Astral Hamaxe; Calamity | Hammer(100); Ancient Manipulator & Astral Bar; Astral Pickaxe; Calamity | Pickaxe(220); Ancient Manipulator & Astral Bar; +Astral Armor; Calamity | Armor Minions(3); Ancient Manipulator & Astral Bar & Meteorite Bar; // Moon Lord Moon Lord; Location | Item | Goal; #Lunar Events; # moon_lord Slayer of Worlds; Achievement; #Evil Boss & #The Destroyer & #Duke Fishron & #Eye of Cthulhu & #Golem & #King Slime & #Lunatic Cultist & #Moon Lord & #Plantera & #Queen Bee & #Skeletron & #Skeletron Prime & #The Twins & #Wall of Flesh; -Luminite; ; #Moon Lord; -Luminite Bar; ; Ancient Manipulator & Luminite; +Luminite; ; #Moon Lord | (@calamity & (Exodium Cluster | Asteroid Staff)) | Luminite Bar; +Luminite Bar; ; (Ancient Manipulator & Luminite) | (@calamity & (Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman)); Luminite Hamaxe; Hammer(100); Ancient Manipulator & Fragment & Luminite Bar; Luminite Pickaxe; Pickaxe(225); Ancient Manipulator & Fragment & Luminite Bar; Genesis Pickaxe; Calamity | Pickaxe(225); Ancient Manipulator & Meld Construct & Luminite Bar; -Stardust Armor; ArmorMinions(5); Ancient Manipulator & Fragment & Luminite Bar; +Stardust Armor; Armor Minions(5); Ancient Manipulator & Fragment & Luminite Bar; +Asteroid Staff; Calamity; (Ancient Manipulator & Meteor Staff & Luminite Bar) | (@getfixedboi & #Astrum Aureus); +Moonstone Crown; Calamity; (Ancient Manipulator & Feather Crown & Luminite Bar & Galactica Singularity) | Nanotech; Terrarian; ; #Moon Lord; Sick Throw; Achievement; Terrarian; Meowmere; ; #Moon Lord; Star Wrath; ; #Moon Lord; -Exodium Cluster; Calamity; Moon Lord & @pickaxe(225); +Exodium Cluster; Calamity; Moon Lord | Uelibloom Ore; // No pick needed; can be fished Normality Relocator; Calamity; Ancient Manipulator & Rod of Discord & Exodium Cluster & Fragment; -Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess; -Phantoplasm; Calamity; Moon Lord & (Wall of Flesh | Dungeon); // TODO Check -Eldritch Soul Artifact; Calamity; Exodium Cluster & Navyplate & Phantoplasm; +Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess | (Hallow & Providence, the Profaned Goddess) | (@getfixedboi & Plantera); +Polterplasm; Calamity; (Moon Lord & Wall of Flesh) | (Dungeon & (Polterghast | Moon Lord)) | #Polterghast; +Eldritch Soul Artifact; Calamity | Minions(1); Exodium Cluster & Navyplate & Polterplasm; // Profaned Guardians Profaned Guardians; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; // Dragonfolly -The Dragonfolly; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; -Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly; +The Dragonfolly; Calamity | Location | Item; (Ancient Manipulator & Unholy Essence & Luminite Bar) | (@getfixedboi & #Supreme Alchemist, Cirrus); +Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly | (@getfixedboi & #Yharon, Dragon of Rebirth); // Providence, the Profaned Goddess -Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians; +Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians | (@getfixedboi & #Supreme Alchemist, Cirrus); # providence_the_profaned_goddess -Divine Geode; Calamity; #Providence, the Profaned Goddess; +Divine Geode; Calamity; #Providence, the Profaned Goddess | (@getfixedboi & #Profaned Guardians); Profaned Soul Artifact; Calamity | Minions(1); Exodium Cluster & Havocplate & Divine Geode; Rune of Kos; Calamity; #Providence, the Profaned Goddess; -Uelibloom Ore; Calamity; Providence, the Profaned Goddess; -Uelibloom Bar; Calamity; Hardmode Forge & Uelibloom Ore; +Uelibloom Ore; Calamity; Providence, the Profaned Goddess | Auric Ore | Uelibloom Bar; +Uelibloom Bar; Calamity; (Hardmode Forge & Uelibloom Ore) | Providence, the Profaned Goddess; Grax; Calamity | Hammer(110); Ancient Manipulator & Inferna Cutter & Luminite Hamaxe & Uelibloom Bar; Blossom Pickaxe; Calamity | Pickaxe(250); Ancient Manipulator & Uelibloom Bar; Voltage Regulation System; Calamity; Ancient Manipulator & Mysterious Circuitry & Dubious Plating & Uelibloom Bar & Luminite Bar & Advanced Display; +Tarragon Armor; Calamity | Armor Minions(3); Ancient Manipulator & Uelibloom Bar & Divine Geode; Necromantic Geode; Calamity; #Ravager & Providence, the Profaned Goddess; +Bloodstone; Calamity; Providence, the Profaned Goddess; +Bloodstone Core; Calamity; Hardmode Forge & Bloodstone & Polterplasm; // Sentinels of the Devourer Storm Weaver; Calamity | Location | Item; Rune of Kos; Armored Shell; Calamity; #Storm Weaver; -Ceaseless Void; Calamity | Location | Item; Rune of Kos; +Ceaseless Void; Calamity | Location | Item; Dungeon & Rune of Kos; Dark Plasma; Calamity; #Ceaseless Void; Signus, Envoy of the Devourer; Calamity | Location | Item; Rune of Kos; Twisting Nether; Calamity; #Signus, Envoy of the Devourer; // Polterghast -Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Phantoplasm) | Moon Lord); -Colossal Squid; Calamity | Location | Item; -Reaper Shark; Calamity | Location | Item; -Eidolon Wyrm; Calamity | Location | Item; +Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Polterplasm) | Moon Lord); +Ruinous Soul; Calamity; #Polterghast; +Bloodflare Armor; Calamity | Armor Minions(3); Ancient Manipulator & Bloodstone Core & Ruinous Soul; +Reaper Tooth; Calamity; Polterghast; +Omega Blue Armor; Calamity | Armor Minions(2); Ancient Manipulator & Reaper Tooth & Depth Cells & Ruinous Soul; // The Old Duke -Mauler; Calamity | Location | Item; #Acid Rain Tier 3; -Nuclear Terror; Calamity | Location | Item; #Acid Rain Tier 3; -Acid Rain Tier 3; Calamity | Location | Item; #Acid Rain Tier 1 & Polterghast; // TODO Check -The Old Duke; Calamity | Location | Item; #Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke); +Mauler; Calamity | Location | Item; Acid Rain Tier 3; +Nuclear Terror; Calamity | Location | Item; Acid Rain Tier 3; +Acid Rain Tier 3; Calamity; #Acid Rain Tier 1 & Polterghast; +The Old Duke; Calamity | Location | Item; Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke) | (@getfixedboi & #The Destroyer); // The Devourer of Gods -The Devourer of Gods; Calamity | Location | Item | Goal; Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Phantoplasm)); +The Devourer of Gods; Calamity | Location | Item | Goal; (Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Polterplasm))) | (@getfixedboi & #Supreme Alchemist, Cirrus); # the_devourer_of_gods Cosmilite Bar; Calamity; #The Devourer of Gods; Cosmic Anvil; Calamity; Ancient Manipulator & Hardmode Anvil & Cosmilite Bar & Luminite Bar & Galactica Singularity & Exodium Cluster; -Nightmare Fuel; Calamity; Pumpkin Moon & The Devourer of Gods; +Nightmare Fuel; Calamity; (Pumpkin Moon & The Devourer of Gods) | Occult Skull Crown; +Occult Skull Crown; Calamity | Getfixedboi; @getfixedboi & #Evil Boss; // Revengeance or getfixedboi Endothermic Energy; Calamity; Frost Moon & The Devourer of Gods; -Darksun Fragment; Calamity; Solar Eclipse & The Devourer of Gods; +Darksun Fragment; Calamity; (Solar Eclipse & The Devourer of Gods) | Eclipse Mirror; Dark Sun Ring; Calamity; Cosmic Anvil & Uelibloom Bar & Darksun Fragment; -Ascendant Spirit Essence; Calamity; Ancient Manipulator & Phantoplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment; +Eclipse Mirror; Calamity; (Cosmic Anvil & Abyssal Mirror & Dark Matter Sheath & Darksun Fragment) | (@getfixedboi & #Ceaseless Void); +Ascendant Spirit Essence; Calamity; (Ancient Manipulator & Polterplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment) | (@getfixedboi & #Providence, the Profaned Goddess) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Nanotech | Ethereal Talisman; +Fearmonger Armor; Calamity | Armor Minions(2); Cosmic Anvil & Spooky Armor & Cosmilite Bar & Soul of Fright & Ascendant Spirit Essence; +Silva Armor; Calamity | Armor Minions(5); Cosmic Anvil & Effulgent Feather & Ascendant Spirit Essence; +Elemental Gauntlet; Calamity; (Cosmic Anvil & Fire Gauntlet & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver); +Elemental Quiver; Calamity; (Cosmic Anvil & Magic Quiver & Deadshot Brooch & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver); +Nucleogenesis; Calamity; (Cosmic Anvil & Star-Tainted Generator & Statis' Curse & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Ceaseless Void); +Nanotech; Calamity; (Emblem & Raider's Talisman & Moonstone Crown & Electrician's Glove & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer); +Ethereal Talisman; Calamity; (Cosmic Anvil & Sigil of Calamitas & Mana Flower & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer); // Yharon, Dragon of Rebirth Yharon, Dragon of Rebirth; Calamity | Location | Item | Goal; Ancient Manipulator & Effulgent Feather & Life Alloy; # yharon_dragon_of_rebirth -Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth; -Auric Ore; Calamity; Yharon, Dragon of Rebirth & @pickaxe(250); -Auric Bar; Calamity; Cosmic Anvil & Auric Ore & Yharon Soul Fragment; -Zenith; Location | Item(Has Zenith) | Goal; Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar); +Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth | The Wand | Auric Bar; +The Wand; Calamity; (Cosmic Anvil & Wand of Sparking & Yharon Soul Fragment) | (@getfixedboi & #The Devourer of Gods); +Auric Ore; Calamity; (Yharon, Dragon of Rebirth & (@pickaxe(250) | Wall of Flesh)) | Auric Bar; +Auric Bar; Calamity; (Cosmic Anvil & Auric Ore & Yharon Soul Fragment) | Shadowspec Bar; +Auric Tesla Armor; Calamity | Armor Minions(6); Cosmic Anvil & Silva Armor & Bloodflare Armor & Tarragon Armor & Auric Bar; +Infinity +1 Sword; Achievement | Grindy | Item(Has Zenith) | Goal(zenith); Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar); # zenith // Exo Mechs Auric Quantum Cooling Cell; Calamity; Cosmic Anvil & Auric Bar & Mysterious Circuitry & Dubious Plating & Endothermic Energy & Core of Eleum & Voltage Regulation System; Exo Mechs; Calamity | Location | Item | Final Boss; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell; -Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity; +// XB-Infinity Hekate; Getfixedboi | Calamity; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell & Blood Sample; // Currently, this boss doesn't affect logic at all +Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; (Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity) | (@getfixedboi & #Supreme Alchemist, Cirrus); +Supreme Alchemist, Cirrus; Getfixedboi | Calamity; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Fabsol's Vodka; +THE LORDE; Getfixedboi | Calamity; Lihzahrd Temple; # calamity_final_bosses -Exo Prism; Calamity; #Exo Mechs; +Exo Prism; Calamity; #Exo Mechs | Shadowspec Bar; Draedon's Forge; Calamity; Cosmic Anvil & Hardmode Forge & Tinkerer's Workshop & Ancient Manipulator & Auric Bar & Exo Prism & Ascendant Spirit Essence; // Supreme Witch, Calamitas -Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas; +Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas | (@getfixedboi & #Calamitas Clone) | Shadowspec Bar; Shadowspec Bar; Calamity; Draedon's Forge & Auric Bar & Exo Prism & Ashes of Annihilation; Crystyl Crusher; Calamity | Pickaxe(1000); Draedon's Forge & Luminite Pickaxe & Blossom Pickaxe & Shadowspec Bar; Angelic Alliance; Calamity | Minions(2); Draedon's Forge & Hallowed Armor & Paladin's Shield & True Excalibur & Cross Necklace & Shadowspec Bar; +Demonshade Armor; Calamity | Armor Minions(10); Draedon's Forge & Shadowspec Bar; -// Adult Eidolon Wyrm; -Adult Eidolon Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator; -# adult_eidolon_wyrm +// Primordial Wyrm +Primordial Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator; +# primordial_wyrm + +// Boss Rush +Boss Rush; Calamity | Location | Item | Goal; Diving Gear | Neptune's Shell | (Aquatic Heart & Skeletron); // Might be obtainable earlier with Midas' Blessing +# boss_rush diff --git a/worlds/terraria/__init__.py b/worlds/terraria/__init__.py index abc10a7bb3..20f56c8f63 100644 --- a/worlds/terraria/__init__.py +++ b/worlds/terraria/__init__.py @@ -1,11 +1,13 @@ # Look at `Rules.dsv` first to get an idea for how this works +import logging from typing import Union, Tuple, List, Dict, Set from worlds.AutoWorld import WebWorld, World from BaseClasses import Region, ItemClassification, Tutorial, CollectionState from .Checks import ( TerrariaItem, TerrariaLocation, + Condition, goals, rules, rule_indices, @@ -25,7 +27,7 @@ from .Checks import ( armor_minions, accessory_minions, ) -from .Options import TerrariaOptions +from .Options import TerrariaOptions, Goal class TerrariaWeb(WebWorld): @@ -55,8 +57,8 @@ class TerrariaWorld(World): item_name_to_id = item_name_to_id location_name_to_id = location_name_to_id - # Turn into an option when calamity is supported in the mod calamity = False + getfixedboi = False ter_items: List[str] ter_locations: List[str] @@ -70,72 +72,100 @@ class TerrariaWorld(World): ter_goals = {} goal_items = set() for location in goal_locations: - _, flags, _, _ = rules[rule_indices[location]] + flags = rules[rule_indices[location]].flags + if not self.options.calamity.value and "Calamity" in flags: + logging.warning( + f"Terraria goal `{Goal.name_lookup[self.options.goal.value]}`, which requires Calamity, was selected with Calamity disabled; enabling Calamity" + ) + self.options.calamity.value = True + item = flags.get("Item") or f"Post-{location}" ter_goals[item] = location goal_items.add(item) - achievements = self.options.achievements.value location_count = 0 locations = [] - for rule, flags, _, _ in rules[:goal]: - if ( - (not self.calamity and "Calamity" in flags) - or (achievements < 1 and "Achievement" in flags) - or (achievements < 2 and "Grindy" in flags) - or (achievements < 3 and "Fishing" in flags) - or ( - rule == "Zenith" and self.options.goal.value != 11 - ) # Bad hardcoding - ): - continue - if "Location" in flags or ("Achievement" in flags and achievements >= 1): - # Location - location_count += 1 - locations.append(rule) - elif ( - "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags - ): - # Event - locations.append(rule) - item_count = 0 items = [] - for rule, flags, _, _ in rules[:goal]: - if not self.calamity and "Calamity" in flags: + for rule in rules[:goal]: + early = "Early" in rule.flags + grindy = "Grindy" in rule.flags + fishing = "Fishing" in rule.flags + + if ( + (not self.options.getfixedboi.value and "Getfixedboi" in rule.flags) + or (self.options.getfixedboi.value and "Not Getfixedboi" in rule.flags) + or (not self.options.calamity.value and "Calamity" in rule.flags) + or (self.options.calamity.value and "Not Calamity" in rule.flags) + or ( + self.options.getfixedboi.value + and self.options.calamity.value + and "Not Calamity Getfixedboi" in rule.flags + ) + or (not self.options.early_achievements.value and early) + or ( + not self.options.normal_achievements.value + and "Achievement" in rule.flags + and not early + and not grindy + and not fishing + ) + or (not self.options.grindy_achievements.value and grindy) + or (not self.options.fishing_achievements.value and fishing) + ) and rule.name not in goal_locations: continue - if "Item" in flags: - # Item - item_count += 1 - if rule not in goal_locations: - items.append(rule) + + if "Location" in rule.flags or "Achievement" in rule.flags: + # Location + location_count += 1 + locations.append(rule.name) elif ( - "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags + "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags ): # Event - items.append(rule) + locations.append(rule.name) + + if "Item" in rule.flags and not ( + "Achievement" in rule.flags and rule.name not in goal_locations + ): + # Item + item_count += 1 + if rule.name not in goal_locations: + items.append(rule.name) + elif ( + "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags + ): + # Event + items.append(rule.name) - extra_checks = self.options.fill_extra_checks_with.value ordered_rewards = [ reward for reward in labels["ordered"] - if self.calamity or "Calamity" not in rewards[reward] + if self.options.calamity.value or "Calamity" not in rewards[reward] ] - while extra_checks == 1 and item_count < location_count and ordered_rewards: + while ( + self.options.fill_extra_checks_with.value == 1 + and item_count < location_count + and ordered_rewards + ): items.append(ordered_rewards.pop(0)) item_count += 1 random_rewards = [ reward for reward in labels["random"] - if self.calamity or "Calamity" not in rewards[reward] + if self.options.calamity.value or "Calamity" not in rewards[reward] ] self.multiworld.random.shuffle(random_rewards) - while extra_checks == 1 and item_count < location_count and random_rewards: + while ( + self.options.fill_extra_checks_with.value == 1 + and item_count < location_count + and random_rewards + ): items.append(random_rewards.pop(0)) item_count += 1 @@ -173,9 +203,9 @@ class TerrariaWorld(World): def create_items(self) -> None: for item in self.ter_items: if (rule_index := rule_indices.get(item)) is not None: - _, flags, _, _ = rules[rule_index] - if "Item" in flags: - name = flags.get("Item") or f"Post-{item}" + rule = rules[rule_index] + if "Item" in rule.flags: + name = rule.flags.get("Item") or f"Post-{item}" else: continue else: @@ -186,8 +216,8 @@ class TerrariaWorld(World): locked_items = {} for location in self.ter_locations: - _, flags, _, _ = rules[rule_indices[location]] - if "Location" not in flags and "Achievement" not in flags: + rule = rules[rule_indices[location]] + if "Location" not in rule.flags and "Achievement" not in rule.flags: if location in progression: classification = ItemClassification.progression else: @@ -202,95 +232,92 @@ class TerrariaWorld(World): for location, item in locked_items.items(): self.multiworld.get_location(location, self.player).place_locked_item(item) - def check_condition( - self, - state, - sign: bool, - ty: int, - condition: Union[str, Tuple[Union[bool, None], list]], - arg: Union[str, int, None], - ) -> bool: - if ty == COND_ITEM: - _, flags, _, _ = rules[rule_indices[condition]] - if "Item" in flags: - name = flags.get("Item") or f"Post-{condition}" + def check_condition(self, state, condition: Condition) -> bool: + if condition.type == COND_ITEM: + rule = rules[rule_indices[condition.condition]] + if "Item" in rule.flags: + name = rule.flags.get("Item") or f"Post-{condition.condition}" else: - name = condition + name = condition.condition - return sign == state.has(name, self.player) - elif ty == COND_LOC: - _, _, operator, conditions = rules[rule_indices[condition]] - return sign == self.check_conditions(state, operator, conditions) - elif ty == COND_FN: - if condition == "npc": - if type(arg) is not int: + return condition.sign == state.has(name, self.player) + elif condition.type == COND_LOC: + rule = rules[rule_indices[condition.condition]] + return condition.sign == self.check_conditions( + state, rule.operator, rule.conditions + ) + elif condition.type == COND_FN: + if condition.condition == "npc": + if type(condition.argument) is not int: raise Exception("@npc requires an integer argument") npc_count = 0 for npc in npcs: if state.has(npc, self.player): npc_count += 1 - if npc_count >= arg: - return sign + if npc_count >= condition.argument: + return condition.sign - return not sign - elif condition == "calamity": - return sign == self.calamity - elif condition == "grindy": - return sign == (self.options.achievements.value >= 2) - elif condition == "pickaxe": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "calamity": + return condition.sign == self.options.calamity.value + elif condition.condition == "grindy": + return condition.sign == self.options.grindy_achievements.value + elif condition.condition == "pickaxe": + if type(condition.argument) is not int: raise Exception("@pickaxe requires an integer argument") for pickaxe, power in pickaxes.items(): - if power >= arg and state.has(pickaxe, self.player): - return sign + if power >= condition.argument and state.has(pickaxe, self.player): + return condition.sign - return not sign - elif condition == "hammer": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "hammer": + if type(condition.argument) is not int: raise Exception("@hammer requires an integer argument") for hammer, power in hammers.items(): - if power >= arg and state.has(hammer, self.player): - return sign + if power >= condition.argument and state.has(hammer, self.player): + return condition.sign - return not sign - elif condition == "mech_boss": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "mech_boss": + if type(condition.argument) is not int: raise Exception("@mech_boss requires an integer argument") boss_count = 0 for boss in mech_bosses: if state.has(boss, self.player): boss_count += 1 - if boss_count >= arg: - return sign + if boss_count >= condition.argument: + return condition.sign - return not sign - elif condition == "minions": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "minions": + if type(condition.argument) is not int: raise Exception("@minions requires an integer argument") minion_count = 1 for armor, minions in armor_minions.items(): if state.has(armor, self.player) and minions + 1 > minion_count: minion_count = minions + 1 - if minion_count >= arg: - return sign + if minion_count >= condition.argument: + return condition.sign for accessory, minions in accessory_minions.items(): if state.has(accessory, self.player): minion_count += minions - if minion_count >= arg: - return sign + if minion_count >= condition.argument: + return condition.sign - return not sign + return not condition.sign + elif condition.condition == "getfixedboi": + return condition.sign == self.options.getfixedboi.value else: - raise Exception(f"Unknown function {condition}") - elif ty == COND_GROUP: - operator, conditions = condition - return sign == self.check_conditions(state, operator, conditions) + raise Exception(f"Unknown function {condition.condition}") + elif condition.type == COND_GROUP: + operator, conditions = condition.condition + return condition.sign == self.check_conditions(state, operator, conditions) def check_conditions( self, @@ -310,22 +337,22 @@ class TerrariaWorld(World): return True if len(conditions) > 1: raise Exception("Found multiple conditions without an operator") - return self.check_condition(state, *conditions[0]) + return self.check_condition(state, conditions[0]) elif operator: return any( - self.check_condition(state, *condition) for condition in conditions + self.check_condition(state, condition) for condition in conditions ) else: return all( - self.check_condition(state, *condition) for condition in conditions + self.check_condition(state, condition) for condition in conditions ) def set_rules(self) -> None: for location in self.ter_locations: def check(state: CollectionState, location=location): - _, _, operator, conditions = rules[rule_indices[location]] - return self.check_conditions(state, operator, conditions) + rule = rules[rule_indices[location]] + return self.check_conditions(state, rule.operator, rule.conditions) self.multiworld.get_location(location, self.player).access_rule = check @@ -336,6 +363,12 @@ class TerrariaWorld(World): def fill_slot_data(self) -> Dict[str, object]: return { "goal": list(self.goal_locations), - "achievements": self.options.achievements.value, "deathlink": bool(self.options.death_link), + # The rest of these are included for trackers + "calamity": self.options.calamity.value, + "getfixedboi": self.options.getfixedboi.value, + "early_achievements": self.options.early_achievements.value, + "normal_achievements": self.options.normal_achievements.value, + "grindy_achievements": self.options.grindy_achievements.value, + "fishing_achievements": self.options.fishing_achievements.value, } From 125bf6f2702d9e7e8348c58dea639125a7778213 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:09:27 -0500 Subject: [PATCH 034/199] Core: Post-KivyMD cleanup 2 and enhancements (#4876) * Adds a new class allowing TextFields to be resized * Resizes most CommonClient components to be more in-line with pre-KivyMD * Change the color of SelectableLabels and TooltipLabels to white * Fixed ClientTabs not correctly showing the current tab indicator * The server label now features a (i) icon to indicate that it can be hovered over. * Changed the default `primary_palette` to `Lightsteelblue` and the default `dynamic_scheme_name` to `VIBRANT` * Properly set attributes on `KivyJSONToTextParser.TextColors` so that proper typing can be utilized if an individual value is needed * Fixed some buttons being discolored permanently once pressed * Sped up the animations of button ripples and tab switching * Added the ability to insert a new tab to `GameManager.add_client_tab` * Hovering over the "Command" button in CommonClient will now display the contents of `/help` as a popup (note: this popup can be too large on default height for adequately large /help (SC2 Client), but should always fit fine on fullscreen). * Fixed invalid sizing of MessageBox errors, and changed their text color to white --- Launcher.py | 5 ++ data/client.kv | 41 ++++++++-- data/launcher.kv | 7 +- kvui.py | 197 ++++++++++++++++++++++++++++++++++++----------- 4 files changed, 198 insertions(+), 52 deletions(-) diff --git a/Launcher.py b/Launcher.py index d636ceab74..29bd71764e 100644 --- a/Launcher.py +++ b/Launcher.py @@ -359,6 +359,11 @@ def run_gui(path: str, args: Any) -> None: self._refresh_components(self.current_filter) + # Uncomment to re-enable the Kivy console/live editor + # Ctrl-E to enable it, make sure numlock/capslock is disabled + # from kivy.modules.console import create_console + # create_console(Window, self.top_screen) + return self.top_screen def on_start(self): diff --git a/data/client.kv b/data/client.kv index ac0a45023c..562986cd17 100644 --- a/data/client.kv +++ b/data/client.kv @@ -16,21 +16,30 @@ orange: "FF7700" # Used for command echo # KivyMD theming parameters theme_style: "Dark" # Light/Dark - primary_palette: "Green" # Many options - dynamic_scheme_name: "TONAL_SPOT" + primary_palette: "Lightsteelblue" # Many options + dynamic_scheme_name: "VIBRANT" dynamic_scheme_contrast: 0.0 : color: self.theme_cls.primaryColor +: + ripple_color: app.theme_cls.primaryColor + ripple_duration_in_fast: 0.2 +: + ripple_color: app.theme_cls.primaryColor + ripple_duration_in_fast: 0.2 : adaptive_height: True - font_size: dp(20) + theme_font_size: "Custom" + font_size: "20dp" markup: True halign: "left" : size_hint: 1, None + theme_text_color: "Custom" + text_color: 1, 1, 1, 1 canvas.before: Color: - rgba: (.0, 0.9, .1, .3) if self.selected else self.theme_cls.surfaceContainerLowColor + rgba: (self.theme_cls.primaryColor[0], self.theme_cls.primaryColor[1], self.theme_cls.primaryColor[2], .3) if self.selected else self.theme_cls.surfaceContainerLowestColor Rectangle: size: self.size pos: self.pos @@ -154,9 +163,12 @@ : size: self.texture_size size_hint: None, None + theme_font_size: "Custom" font_size: dp(18) pos_hint: {'center_y': 0.5, 'center_x': 0.5} halign: "left" + theme_text_color: "Custom" + text_color: (1, 1, 1, 1) canvas.before: Color: rgba: 0.2, 0.2, 0.2, 1 @@ -175,11 +187,28 @@ rectangle: self.x-2, self.y-2, self.width+4, self.height+4 : pos_hint: {'center_y': 0.5, 'center_x': 0.5} - +: size_hint_y: None - height: dp(30) + height: "30dp" multiline: False write_tab: False + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + height: "30dp" + multiline: False + write_tab: False + role: "medium" + size_hint_y: None + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + size_hint_y: None + height: "30dp" + multiline: False + write_tab: False + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + theme_text_color: "Custom" + text_color: 1, 1, 1, 1 : layout: layout bar_width: "12dp" diff --git a/data/launcher.kv b/data/launcher.kv index 03e1c3e078..8c6a8288e4 100644 --- a/data/launcher.kv +++ b/data/launcher.kv @@ -5,12 +5,13 @@ size_hint: 1, None height: "75dp" context_button: context + focus_behavior: False MDRelativeLayout: ApAsyncImage: source: main.image size: (48, 48) - size_hint_y: None + size_hint: None, None pos_hint: {"center_x": 0.1, "center_y": 0.5} MDLabel: @@ -37,6 +38,7 @@ pos_hint:{"center_x": 0.85, "center_y": 0.8} theme_text_color: "Custom" text_color: app.theme_cls.primaryColor + detect_visible: False on_release: app.set_favorite(self) MDIconButton: @@ -46,6 +48,7 @@ pos_hint:{"center_x": 0.95, "center_y": 0.8} theme_text_color: "Custom" text_color: app.theme_cls.primaryColor + detect_visible: False MDButton: pos_hint:{"center_x": 0.9, "center_y": 0.25} @@ -53,7 +56,7 @@ height: "25dp" component: main.component on_release: app.component_action(self) - + detect_visible: False MDButtonText: text: "Open" diff --git a/kvui.py b/kvui.py index 81e3876fe5..9a8b7109fa 100644 --- a/kvui.py +++ b/kvui.py @@ -43,8 +43,8 @@ from kivy.core.image import ImageLoader, ImageLoaderBase, ImageData from kivy.base import ExceptionHandler, ExceptionManager from kivy.clock import Clock from kivy.factory import Factory -from kivy.properties import BooleanProperty, ObjectProperty, NumericProperty -from kivy.metrics import dp +from kivy.properties import BooleanProperty, ObjectProperty, NumericProperty, StringProperty +from kivy.metrics import dp, sp from kivy.uix.widget import Widget from kivy.uix.layout import Layout from kivy.utils import escape_markup @@ -60,7 +60,7 @@ from kivymd.app import MDApp from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.boxlayout import MDBoxLayout -from kivymd.uix.tab.tab import MDTabsPrimary, MDTabsItem, MDTabsItemText, MDTabsCarousel +from kivymd.uix.tab.tab import MDTabsSecondary, MDTabsItem, MDTabsItemText, MDTabsCarousel from kivymd.uix.menu import MDDropdownMenu from kivymd.uix.menu.menu import MDDropdownTextItem from kivymd.uix.dropdownitem import MDDropDownItem, MDDropDownItemText @@ -90,10 +90,10 @@ remove_between_brackets = re.compile(r"\[.*?]") class ThemedApp(MDApp): def set_colors(self): text_colors = KivyJSONtoTextParser.TextColors() - self.theme_cls.theme_style = getattr(text_colors, "theme_style", "Dark") - self.theme_cls.primary_palette = getattr(text_colors, "primary_palette", "Green") - self.theme_cls.dynamic_scheme_name = getattr(text_colors, "dynamic_scheme_name", "TONAL_SPOT") - self.theme_cls.dynamic_scheme_contrast = getattr(text_colors, "dynamic_scheme_contrast", 0.0) + self.theme_cls.theme_style = text_colors.theme_style + self.theme_cls.primary_palette = text_colors.primary_palette + self.theme_cls.dynamic_scheme_name = text_colors.dynamic_scheme_name + self.theme_cls.dynamic_scheme_contrast = text_colors.dynamic_scheme_contrast class ImageIcon(MDButtonIcon, AsyncImage): @@ -166,6 +166,32 @@ class ToggleButton(MDButton, ToggleButtonBehavior): child.icon_color = self.theme_cls.primaryColor +# thanks kivymd +class ResizableTextField(MDTextField): + """ + Resizable MDTextField that manually overrides the builtin sizing. + + Note that in order to use this, the sizing must be specified from within a .kv rule. + """ + def __init__(self, *args, **kwargs): + # cursed rules override + rules = Builder.match(self) + textfield = next((rule for rule in rules if rule.name == f""), None) + if textfield: + subclasses = rules[rules.index(textfield) + 1:] + for subclass in subclasses: + height_rule = subclass.properties.get("height", None) + if height_rule: + height_rule.ignore_prev = True + super().__init__(args, kwargs) + + +def on_release(self: MDButton, *args): + super(MDButton, self).on_release(args) + self.on_leave() + +MDButton.on_release = on_release + # I was surprised to find this didn't already exist in kivy :( class HoverBehavior(object): """originally from https://stackoverflow.com/a/605348110""" @@ -266,11 +292,15 @@ class TooltipLabel(HovererableLabel, MDTooltip): self._tooltip = None -class ServerLabel(HovererableLabel, MDTooltip): +class ServerLabel(HoverBehavior, MDTooltip, MDBoxLayout): tooltip_display_delay = 0.1 + text: str = StringProperty("Server:") def __init__(self, *args, **kwargs): - super(HovererableLabel, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) + self.add_widget(MDIcon(icon="information", font_size=sp(15))) + self.add_widget(TooltipLabel(text=self.text, pos_hint={"center_x": 0.5, "center_y": 0.5}, + font_size=sp(15))) self._tooltip = ServerToolTip(text="Test") def on_enter(self): @@ -383,7 +413,6 @@ class MarkupDropdownTextItem(MDDropdownTextItem): for child in self.children: if child.__class__ == MDLabel: child.markup = True - print(self.text) # Currently, this only lets us do markup on text that does not have any icons # Create new TextItems as needed @@ -461,14 +490,13 @@ class MarkupDropdown(MDDropdownMenu): self.menu.data = self._items -class AutocompleteHintInput(MDTextField): +class AutocompleteHintInput(ResizableTextField): min_chars = NumericProperty(3) def __init__(self, **kwargs): super().__init__(**kwargs) - self.dropdown = MarkupDropdown(caller=self, position="bottom", border_margin=dp(24), width=self.width) - self.dropdown.bind(on_select=lambda instance, x: setattr(self, 'text', x)) + self.dropdown = MarkupDropdown(caller=self, position="bottom", border_margin=dp(2), width=self.width) self.bind(on_text_validate=self.on_message) self.bind(width=lambda instance, x: setattr(self.dropdown, "width", x)) @@ -485,8 +513,11 @@ class AutocompleteHintInput(MDTextField): def on_press(text): split_text = MarkupLabel(text=text).markup - return self.dropdown.select("".join(text_frag for text_frag in split_text - if not text_frag.startswith("["))) + self.set_text(self, "".join(text_frag for text_frag in split_text + if not text_frag.startswith("["))) + self.dropdown.dismiss() + self.focus = True + lowered = value.lower() for item_name in item_names: try: @@ -498,7 +529,7 @@ class AutocompleteHintInput(MDTextField): text = text[:index] + "[b]" + text[index:index+len(value)]+"[/b]"+text[index+len(value):] self.dropdown.items.append({ "text": text, - "on_release": lambda: on_press(text), + "on_release": lambda txt=text: on_press(txt), "markup": True }) if not self.dropdown.parent: @@ -620,7 +651,7 @@ class HintLabel(RecycleDataViewBehavior, MDBoxLayout): self.selected = is_selected -class ConnectBarTextInput(MDTextField): +class ConnectBarTextInput(ResizableTextField): def insert_text(self, substring, from_undo=False): s = substring.replace("\n", "").replace("\r", "") return super(ConnectBarTextInput, self).insert_text(s, from_undo=from_undo) @@ -630,14 +661,14 @@ def is_command_input(string: str) -> bool: return len(string) > 0 and string[0] in "/!" -class CommandPromptTextInput(MDTextField): +class CommandPromptTextInput(ResizableTextField): MAXIMUM_HISTORY_MESSAGES = 50 def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._command_history_index = -1 self._command_history: typing.Deque[str] = deque(maxlen=CommandPromptTextInput.MAXIMUM_HISTORY_MESSAGES) - + def update_history(self, new_entry: str) -> None: self._command_history_index = -1 if is_command_input(new_entry): @@ -664,7 +695,7 @@ class CommandPromptTextInput(MDTextField): self._change_to_history_text_if_available(self._command_history_index - 1) return True return super().keyboard_on_key_down(window, keycode, text, modifiers) - + def _change_to_history_text_if_available(self, new_index: int) -> None: if new_index < -1: return @@ -682,29 +713,61 @@ class MessageBox(Popup): def __init__(self, **kwargs): super().__init__(**kwargs) self._label.refresh() - self.size = self._label.texture.size - if self.width + 50 > Window.width: - self.text_size[0] = Window.width - 50 - self._label.refresh() - self.size = self._label.texture.size def __init__(self, title, text, error=False, **kwargs): label = MessageBox.MessageBoxLabel(text=text) separator_color = [217 / 255, 129 / 255, 122 / 255, 1.] if error else [47 / 255., 167 / 255., 212 / 255, 1.] - super().__init__(title=title, content=label, size_hint=(None, None), width=max(100, int(label.width) + 40), + super().__init__(title=title, content=label, size_hint=(0.5, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) self.height += max(0, label.height - 18) -class ClientTabs(MDTabsPrimary): +class ClientTabs(MDTabsSecondary): carousel: MDTabsCarousel lock_swiping = True def __init__(self, *args, **kwargs): - self.carousel = MDTabsCarousel(lock_swiping=True) - super().__init__(*args, MDDivider(size_hint_y=None, height=dp(4)), self.carousel, **kwargs) + self.carousel = MDTabsCarousel(lock_swiping=True, anim_move_duration=0.2) + super().__init__(*args, MDDivider(size_hint_y=None, height=dp(1)), self.carousel, **kwargs) self.size_hint_y = 1 + def _check_panel_height(self, *args): + self.ids.tab_scroll.height = dp(38) + + def update_indicator( + self, x: float = 0.0, w: float = 0.0, instance: MDTabsItem = None + ) -> None: + def update_indicator(*args): + indicator_pos = (0, 0) + indicator_size = (0, 0) + + item_text_object = self._get_tab_item_text_icon_object() + + if item_text_object: + indicator_pos = ( + instance.x + dp(12), + self.indicator.pos[1] + if not self._tabs_carousel + else self._tabs_carousel.height, + ) + indicator_size = ( + instance.width - dp(24), + self.indicator_height, + ) + + Animation( + pos=indicator_pos, + size=indicator_size, + d=0 if not self.indicator_anim else self.indicator_duration, + t=self.indicator_transition, + ).start(self.indicator) + + if not instance: + self.indicator.pos = (x, self.indicator.pos[1]) + self.indicator.size = (w, self.indicator_height) + else: + Clock.schedule_once(update_indicator) + def remove_tab(self, tab, content=None): if content is None: content = tab.content @@ -713,6 +776,21 @@ class ClientTabs(MDTabsPrimary): self.on_size(self, self.size) +class CommandButton(MDButton, MDTooltip): + def __init__(self, *args, manager: "GameManager", **kwargs): + super().__init__(*args, **kwargs) + self.manager = manager + self._tooltip = ToolTip(text="Test") + + def on_enter(self): + self._tooltip.text = self.manager.commandprocessor.get_help_text() + self._tooltip.font_size = dp(20 - (len(self._tooltip.text) // 400)) # mostly guessing on the numbers here + self.display_tooltip() + + def on_leave(self): + self.animation_tooltip_dismiss() + + class GameManager(ThemedApp): logging_pairs = [ ("Client", "Archipelago"), @@ -767,19 +845,19 @@ class GameManager(ThemedApp): self.grid = MainLayout() self.grid.cols = 1 - self.connect_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(70), + self.connect_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40), spacing=5, padding=(5, 10)) # top part - server_label = ServerLabel(halign="center") + server_label = ServerLabel(width=dp(75)) self.connect_layout.add_widget(server_label) self.server_connect_bar = ConnectBarTextInput(text=self.ctx.suggested_address or "archipelago.gg:", - size_hint_y=None, role="medium", - height=dp(70), multiline=False, write_tab=False) + pos_hint={"center_x": 0.5, "center_y": 0.5}) def connect_bar_validate(sender): if not self.ctx.server: self.connect_button_action(sender) + self.server_connect_bar.height = dp(30) self.server_connect_bar.bind(on_text_validate=connect_bar_validate) self.connect_layout.add_widget(self.server_connect_bar) self.server_connect_button = MDButton(MDButtonText(text="Connect"), style="filled", size=(dp(100), dp(70)), @@ -792,7 +870,7 @@ class GameManager(ThemedApp): self.grid.add_widget(self.progressbar) # middle part - self.tabs = ClientTabs() + self.tabs = ClientTabs(pos_hint={"center_x": 0.5, "center_y": 0.5}) self.tabs.add_widget(MDTabsItem(MDTabsItemText(text="All" if len(self.logging_pairs) > 1 else "Archipelago"))) self.log_panels["All"] = self.tabs.default_tab_content = UILog(*(logging.getLogger(logger_name) for logger_name, name in @@ -820,9 +898,10 @@ class GameManager(ThemedApp): self.grid.add_widget(self.main_area_container) # bottom part - bottom_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(70), spacing=5, padding=(5, 10)) - info_button = MDButton(MDButtonText(text="Command:"), radius=5, style="filled", size=(dp(100), dp(70)), - size_hint_x=None, size_hint_y=None, pos_hint={"center_y": 0.575}) + bottom_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40), spacing=5, padding=(5, 10)) + info_button = CommandButton(MDButtonText(text="Command:", halign="left"), manager=self, radius=5, + style="filled", size=(dp(100), dp(70)), size_hint_x=None, size_hint_y=None, + pos_hint={"center_y": 0.575}) info_button.bind(on_release=self.command_button_action) bottom_layout.add_widget(info_button) self.textinput = CommandPromptTextInput(size_hint_y=None, height=dp(30), multiline=False, write_tab=False) @@ -843,15 +922,27 @@ class GameManager(ThemedApp): self.server_connect_bar.focus = True self.server_connect_bar.select_text(port_start if port_start > 0 else host_start, len(s)) + # Uncomment to enable the kivy live editor console + # Press Ctrl-E (with numlock/capslock) disabled to open + # from kivy.core.window import Window + # from kivy.modules import console + # console.create_console(Window, self.container) + return self.container - def add_client_tab(self, title: str, content: Widget) -> Widget: + def add_client_tab(self, title: str, content: Widget, index: int = -1) -> Widget: """Adds a new tab to the client window with a given title, and provides a given Widget as its content. Returns the new tab widget, with the provided content being placed on the tab as content.""" new_tab = MDTabsItem(MDTabsItemText(text=title)) new_tab.content = content - self.tabs.add_widget(new_tab) - self.tabs.carousel.add_widget(new_tab.content) + if -1 < index <= len(self.tabs.carousel.slides): + new_tab.bind(on_release=self.tabs.set_active_item) + new_tab._tabs = self.tabs + self.tabs.ids.container.add_widget(new_tab, index=index) + self.tabs.carousel.add_widget(new_tab.content, index=len(self.tabs.carousel.slides) - index) + else: + self.tabs.add_widget(new_tab) + self.tabs.carousel.add_widget(new_tab.content) return new_tab def update_texts(self, dt): @@ -1001,8 +1092,9 @@ class HintLayout(MDBoxLayout): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - boxlayout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(55)) - boxlayout.add_widget(MDLabel(text="New Hint:", size_hint_x=None, size_hint_y=None, height=dp(55))) + boxlayout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40)) + boxlayout.add_widget(MDLabel(text="New Hint:", size_hint_x=None, size_hint_y=None, + height=dp(40), width=dp(75), halign="center", valign="center")) boxlayout.add_widget(AutocompleteHintInput()) self.add_widget(boxlayout) @@ -1012,7 +1104,7 @@ class HintLayout(MDBoxLayout): if fix_func: fix_func() - + status_names: typing.Dict[HintStatus, str] = { HintStatus.HINT_FOUND: "Found", HintStatus.HINT_UNSPECIFIED: "Unspecified", @@ -1109,6 +1201,7 @@ class HintLog(MDRecycleView): class ApAsyncImage(AsyncImage): + def is_uri(self, filename: str) -> bool: if filename.startswith("ap:"): return True @@ -1154,7 +1247,23 @@ class E(ExceptionHandler): class KivyJSONtoTextParser(JSONtoTextParser): # dummy class to absorb kvlang definitions class TextColors(Widget): - pass + white: str = StringProperty("FFFFFF") + black: str = StringProperty("000000") + red: str = StringProperty("EE0000") + green: str = StringProperty("00FF7F") + yellow: str = StringProperty("FAFAD2") + blue: str = StringProperty("6495ED") + magenta: str = StringProperty("EE00EE") + cyan: str = StringProperty("00EEEE") + slateblue: str = StringProperty("6D8BE8") + plum: str = StringProperty("AF99EF") + salmon: str = StringProperty("FA8072") + orange: str = StringProperty("FF7700") + # KivyMD parameters + theme_style: str = StringProperty("Dark") + primary_palette: str = StringProperty("Lightsteelblue") + dynamic_scheme_name: str = StringProperty("VIBRANT") + dynamic_scheme_contrast: int = NumericProperty(0) def __init__(self, *args, **kwargs): # we grab the color definitions from the .kv file, then overwrite the JSONtoTextParser default entries From 4b1898bfaf6522478ff738a3e99c5257903061f2 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 17 Apr 2025 17:57:17 -0500 Subject: [PATCH 035/199] HK: fix docs whitespace (#4885) --- worlds/hk/docs/setup_en.md | 46 +++++++++++++++++------------------ worlds/hk/docs/setup_pt_br.md | 34 +++++++++++++------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index 25f7c78075..0375867d40 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -3,34 +3,34 @@ ## Required Software * Download and unzip the Lumafly Mod Manager from the [Lumafly website](https://themulhima.github.io/Lumafly/). * A legal copy of Hollow Knight. - * Steam, Gog, and Xbox Game Pass versions of the game are supported. - * Windows, Mac, and Linux (including Steam Deck) are supported. + * Steam, Gog, and Xbox Game Pass versions of the game are supported. + * Windows, Mac, and Linux (including Steam Deck) are supported. ## Installing the Archipelago Mod using Lumafly 1. Launch Lumafly and ensure it locates your Hollow Knight installation directory. 2. Install the Archipelago mods by doing either of the following: - * Click one of the links below to allow Lumafly to install the mods. Lumafly will prompt for confirmation. - * [Archipelago and dependencies only](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago) - * [Archipelago with rando essentials](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago/Archipelago%20Map%20Mod/RecentItemsDisplay/DebugMod/RandoStats/Additional%20Timelines/CompassAlwaysOn/AdditionalMaps/) - (includes Archipelago Map Mod, RecentItemsDisplay, DebugMod, RandoStats, AdditionalTimelines, CompassAlwaysOn, - and AdditionalMaps). - * Click the "Install" button near the "Archipelago" mod entry. If desired, also install "Archipelago Map Mod" - to use as an in-game tracker. + * Click one of the links below to allow Lumafly to install the mods. Lumafly will prompt for confirmation. + * [Archipelago and dependencies only](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago) + * [Archipelago with rando essentials](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago/Archipelago%20Map%20Mod/RecentItemsDisplay/DebugMod/RandoStats/Additional%20Timelines/CompassAlwaysOn/AdditionalMaps/) + (includes Archipelago Map Mod, RecentItemsDisplay, DebugMod, RandoStats, AdditionalTimelines, CompassAlwaysOn, + and AdditionalMaps). + * Click the "Install" button near the "Archipelago" mod entry. If desired, also install "Archipelago Map Mod" + to use as an in-game tracker. 3. Launch the game, you're all set! ### What to do if Lumafly fails to find your installation directory 1. Find the directory manually. - * Xbox Game Pass: - 1. Enter the Xbox app and move your mouse over "Hollow Knight" on the left sidebar. - 2. Click the three points then click "Manage". - 3. Go to the "Files" tab and select "Browse...". - 4. Click "Hollow Knight", then "Content", then click the path bar and copy it. - * Steam: - 1. You likely put your Steam library in a non-standard place. If this is the case, you probably know where - it is. Find your steam library and then find the Hollow Knight folder and copy the path. - * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` - * Linux/Steam Deck - ~/.local/share/Steam/steamapps/common/Hollow Knight - * Mac - ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app + * Xbox Game Pass: + 1. Enter the Xbox app and move your mouse over "Hollow Knight" on the left sidebar. + 2. Click the three points then click "Manage". + 3. Go to the "Files" tab and select "Browse...". + 4. Click "Hollow Knight", then "Content", then click the path bar and copy it. + * Steam: + 1. You likely put your Steam library in a non-standard place. If this is the case, you probably know where + it is. Find your steam library and then find the Hollow Knight folder and copy the path. + * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * Linux/Steam Deck - ~/.local/share/Steam/steamapps/common/Hollow Knight + * Mac - ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app 2. Run Lumafly as an administrator and, when it asks you for the path, paste the path you copied. ## Configuring your YAML File @@ -49,9 +49,9 @@ website to generate a YAML using a graphical interface. 4. Enter the correct settings for your Archipelago server. 5. Hit **Start** to begin the game. The game will stall for a few seconds while it does all item placements. 6. The game will immediately drop you into the randomized game. - * If you are waiting for a countdown then wait for it to lapse before hitting Start. - * Or hit Start then pause the game once you're in it. - + * If you are waiting for a countdown then wait for it to lapse before hitting Start. + * Or hit Start then pause the game once you're in it. + ## Hints and other commands While playing in a multiworld, you can interact with the server using various commands listed in the [commands guide](/tutorial/Archipelago/commands/en). You can use the Archipelago Text Client to do this, diff --git a/worlds/hk/docs/setup_pt_br.md b/worlds/hk/docs/setup_pt_br.md index 9ae1ea89d5..511ee0d552 100644 --- a/worlds/hk/docs/setup_pt_br.md +++ b/worlds/hk/docs/setup_pt_br.md @@ -3,28 +3,28 @@ ## Programas obrigatórios * Baixe e extraia o Lumafly Mod Manager (gerenciador de mods Lumafly) do [Site Lumafly](https://themulhima.github.io/Lumafly/). * Uma cópia legal de Hollow Knight. - * Versões Steam, Gog, e Xbox Game Pass do jogo são suportadas. - * Windows, Mac, e Linux (incluindo Steam Deck) são suportados. + * Versões Steam, Gog, e Xbox Game Pass do jogo são suportadas. + * Windows, Mac, e Linux (incluindo Steam Deck) são suportados. ## Instalando o mod Archipelago Mod usando Lumafly 1. Abra o Lumafly e confirme que ele localizou sua pasta de instalação do Hollow Knight. 2. Clique em "Install (instalar)" perto da opção "Archipelago" mod. - * Se quiser, instale também o "Archipelago Map Mod (mod do mapa do archipelago)" para usá-lo como rastreador dentro do jogo. + * Se quiser, instale também o "Archipelago Map Mod (mod do mapa do archipelago)" para usá-lo como rastreador dentro do jogo. 3. Abra o jogo, tudo preparado! ### O que fazer se o Lumafly falha em encontrar a sua pasta de instalação 1. Encontre a pasta manualmente. - * Xbox Game Pass: - 1. Entre no seu aplicativo Xbox e mova seu mouse em cima de "Hollow Knight" na sua barra da esquerda. - 2. Clique nos 3 pontos depois clique gerenciar. - 3. Vá nos arquivos e selecione procurar. - 4. Clique em "Hollow Knight", depois em "Content (Conteúdo)", depois clique na barra com o endereço e a copie. - * Steam: - 1. Você provavelmente colocou sua biblioteca Steam num local não padrão. Se esse for o caso você provavelmente sabe onde está. - . Encontre sua biblioteca Steam, depois encontre a pasta do Hollow Knight e copie seu endereço. - * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` - * Linux/Steam Deck - `~/.local/share/Steam/steamapps/common/Hollow Knight` - * Mac - `~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app` + * Xbox Game Pass: + 1. Entre no seu aplicativo Xbox e mova seu mouse em cima de "Hollow Knight" na sua barra da esquerda. + 2. Clique nos 3 pontos depois clique gerenciar. + 3. Vá nos arquivos e selecione procurar. + 4. Clique em "Hollow Knight", depois em "Content (Conteúdo)", depois clique na barra com o endereço e a copie. + * Steam: + 1. Você provavelmente colocou sua biblioteca Steam num local não padrão. Se esse for o caso você provavelmente sabe onde está. + Encontre sua biblioteca Steam, depois encontre a pasta do Hollow Knight e copie seu endereço. + * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * Linux/Steam Deck - `~/.local/share/Steam/steamapps/common/Hollow Knight` + * Mac - `~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app` 2. Rode o Lumafly como administrador e, quando ele perguntar pelo endereço do arquivo, cole o endereço do arquivo que você copiou. ## Configurando seu arquivo YAML @@ -43,9 +43,9 @@ para gerar o YAML usando a interface gráfica. 4. Coloque as configurações corretas do seu servidor Archipelago. 5. Aperte em **Começar**. O jogo vai travar por uns segundos enquanto ele coloca todos itens. 6. O jogo vai te colocar imediatamente numa partida randomizada. - * Se você está esperando uma contagem então espere ele cair antes de apertar começar. - * Ou clique em começar e pause o jogo enquanto estiver nele. - + * Se você está esperando uma contagem então espere ele cair antes de apertar começar. + * Ou clique em começar e pause o jogo enquanto estiver nele. + ## Dicas e outros comandos Enquanto jogar um multiworld, você pode interagir com o servidor usando vários comandos listados no [Guia de comandos](/tutorial/Archipelago/commands/en). Você pode usar o cliente de texto do Archipelago para isso, From 2dc55873f015f96ac0db361bd9495b66592715bc Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 17 Apr 2025 21:57:41 -0500 Subject: [PATCH 036/199] Webhost: add link to new session page (#4857) Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> --- WebHostLib/templates/userContent.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WebHostLib/templates/userContent.html b/WebHostLib/templates/userContent.html index 4e3747f4f9..fa60deacd8 100644 --- a/WebHostLib/templates/userContent.html +++ b/WebHostLib/templates/userContent.html @@ -29,7 +29,8 @@

User Content

- Below is a list of all the content you have generated on this site. Rooms and seeds are listed separately. + Below is a list of all the content you have generated on this site. Rooms and seeds are listed separately.
+ Sessions can be saved or synced across devices using the Sessions Page.

Your Rooms

{% if rooms %} From 38bfb1087b6cda27cfe36d303012cde6d9dbd27a Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 18 Apr 2025 11:15:59 -0500 Subject: [PATCH 037/199] Webhost: fix get_seeds api endpoint (#4889) --- WebHostLib/api/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/api/user.py b/WebHostLib/api/user.py index 0ddb6fe83e..2524cc40a6 100644 --- a/WebHostLib/api/user.py +++ b/WebHostLib/api/user.py @@ -28,6 +28,6 @@ def get_seeds(): response.append({ "seed_id": seed.id, "creation_time": seed.creation_time, - "players": get_players(seed.slots), + "players": get_players(seed), }) return jsonify(response) From 552a6e7f1c6cac89f7d6766122eaf20717764351 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Fri, 18 Apr 2025 17:41:46 +0100 Subject: [PATCH 038/199] Stardew Valley: Precollect building items in deterministic order (#4883) #4239 refactored buildings, but introduced iteration of a set when precollecting the building items into start inventory. The iteration order of sets varies between separate Python processes due to set order being partially based on the hashes of the objects in the set and because Python processes each have a random hash seed by default. --- worlds/stardew_valley/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index bf900742b9..bad0ab9e68 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -206,7 +206,8 @@ class StardewValleyWorld(World): if not building_progression.is_progressive: return - for building in building_progression.starting_buildings: + # starting_buildings is a set, so sort for deterministic order. + for building in sorted(building_progression.starting_buildings): item, quantity = building_progression.to_progressive_item(building) for _ in range(quantity): self.multiworld.push_precollected(self.create_item(item)) From 1b3ee0e94fdcc604c246bacedab4d60b9f0eb6cb Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 18 Apr 2025 20:41:09 +0200 Subject: [PATCH 039/199] Core: require clients to support overlapping IDs (#4451) --- MultiServer.py | 3 ++- test/hosting/client.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 05e93e678d..c9e0ad8bfa 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -46,7 +46,8 @@ from NetUtils import Endpoint, ClientStatus, NetworkItem, decode, encode, Networ SlotType, LocationStore, Hint, HintStatus from BaseClasses import ItemClassification -min_client_version = Version(0, 1, 6) + +min_client_version = Version(0, 5, 0) colorama.just_fix_windows_console() diff --git a/test/hosting/client.py b/test/hosting/client.py index b805bb6a26..01572c442c 100644 --- a/test/hosting/client.py +++ b/test/hosting/client.py @@ -80,8 +80,8 @@ class Client: "version": { "class": "Version", "major": 0, - "minor": 4, - "build": 6, + "minor": 6, + "build": 0, }, "items_handling": 0, "tags": [], From a0c83b48547d0e170de2324ce0a2a851adb2dee6 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 18 Apr 2025 20:49:08 +0200 Subject: [PATCH 040/199] Core: no longer log ID ranges on generate (#4013) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- Main.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/Main.py b/Main.py index 528db10c64..6f6a09619d 100644 --- a/Main.py +++ b/Main.py @@ -56,29 +56,15 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No logger.info(f"Found {len(AutoWorld.AutoWorldRegister.world_types)} World Types:") longest_name = max(len(text) for text in AutoWorld.AutoWorldRegister.world_types) - max_item = 0 - max_location = 0 - for cls in AutoWorld.AutoWorldRegister.world_types.values(): - if cls.item_id_to_name: - max_item = max(max_item, max(cls.item_id_to_name)) - max_location = max(max_location, max(cls.location_id_to_name)) - - item_digits = len(str(max_item)) - location_digits = len(str(max_location)) item_count = len(str(max(len(cls.item_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) location_count = len(str(max(len(cls.location_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) - del max_item, max_location for name, cls in AutoWorld.AutoWorldRegister.world_types.items(): if not cls.hidden and len(cls.item_names) > 0: - logger.info(f" {name:{longest_name}}: {len(cls.item_names):{item_count}} " - f"Items (IDs: {min(cls.item_id_to_name):{item_digits}} - " - f"{max(cls.item_id_to_name):{item_digits}}) | " - f"{len(cls.location_names):{location_count}} " - f"Locations (IDs: {min(cls.location_id_to_name):{location_digits}} - " - f"{max(cls.location_id_to_name):{location_digits}})") + logger.info(f" {name:{longest_name}}: Items: {len(cls.item_names):{item_count}} | " + f"Locations: {len(cls.location_names):{location_count}}") - del item_digits, location_digits, item_count, location_count + del item_count, location_count # This assertion method should not be necessary to run if we are not outputting any multidata. if not args.skip_output and not args.spoiler_only: From cb3d35faf9c08b1900b310343c5c406eae501bcc Mon Sep 17 00:00:00 2001 From: ScootyPuffJr1 <77215594+ScootyPuffJr1@users.noreply.github.com> Date: Fri, 18 Apr 2025 14:50:51 -0400 Subject: [PATCH 041/199] LttP: Add keydrop locations to location groups (#4465) --- worlds/alttp/__init__.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index e4a04fe67e..4a026f109b 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -141,7 +141,7 @@ class ALTTPWorld(World): item_name_groups = item_name_groups location_name_groups = { "Blind's Hideout": {"Blind's Hideout - Top", "Blind's Hideout - Left", "Blind's Hideout - Right", - "Blind's Hideout - Far Left", "Blind's Hideout - Far Right"}, + "Blind's Hideout - Far Left", "Blind's Hideout - Far Right"}, "Kakariko Well": {"Kakariko Well - Top", "Kakariko Well - Left", "Kakariko Well - Middle", "Kakariko Well - Right", "Kakariko Well - Bottom"}, "Mini Moldorm Cave": {"Mini Moldorm Cave - Far Left", "Mini Moldorm Cave - Left", "Mini Moldorm Cave - Right", @@ -154,15 +154,23 @@ class ALTTPWorld(World): "Hookshot Cave": {"Hookshot Cave - Top Right", "Hookshot Cave - Top Left", "Hookshot Cave - Bottom Right", "Hookshot Cave - Bottom Left"}, "Hyrule Castle": {"Hyrule Castle - Boomerang Chest", "Hyrule Castle - Map Chest", - "Hyrule Castle - Zelda's Chest", "Sewers - Dark Cross", "Sewers - Secret Room - Left", - "Sewers - Secret Room - Middle", "Sewers - Secret Room - Right"}, + "Hyrule Castle - Zelda's Chest", "Hyrule Castle - Big Key Drop", + "Hyrule Castle - Boomerang Guard Key Drop", "Hyrule Castle - Map Guard Key Drop", + "Sewers - Dark Cross", "Sewers - Secret Room - Left", + "Sewers - Secret Room - Middle", "Sewers - Secret Room - Right", + "Sewers - Key Rat Key Drop"}, "Eastern Palace": {"Eastern Palace - Compass Chest", "Eastern Palace - Big Chest", "Eastern Palace - Cannonball Chest", "Eastern Palace - Big Key Chest", + "Eastern Palace - Dark Eyegore Key Drop", "Eastern Palace - Dark Square Pot Key", "Eastern Palace - Map Chest", "Eastern Palace - Boss"}, "Desert Palace": {"Desert Palace - Big Chest", "Desert Palace - Torch", "Desert Palace - Map Chest", - "Desert Palace - Compass Chest", "Desert Palace - Big Key Chest", "Desert Palace - Boss"}, + "Desert Palace - Beamos Hall Pot Key", "Desert Palace - Desert Tiles 1 Pot Key", + "Desert Palace - Desert Tiles 2 Pot Key", "Desert Palace - Compass Chest", + "Desert Palace - Big Key Chest", "Desert Palace - Boss"}, "Tower of Hera": {"Tower of Hera - Basement Cage", "Tower of Hera - Map Chest", "Tower of Hera - Big Key Chest", "Tower of Hera - Compass Chest", "Tower of Hera - Big Chest", "Tower of Hera - Boss"}, + "Castle Tower": {"Castle Tower - Room 03", "Castle Tower - Dark Maze", + "Castle Tower - Dark Archer Key Drop", "Castle Tower - Circle of Pots Key Drop"}, "Palace of Darkness": {"Palace of Darkness - Shooter Room", "Palace of Darkness - The Arena - Bridge", "Palace of Darkness - Stalfos Basement", "Palace of Darkness - Big Key Chest", "Palace of Darkness - The Arena - Ledge", "Palace of Darkness - Map Chest", @@ -173,25 +181,33 @@ class ALTTPWorld(World): "Swamp Palace": {"Swamp Palace - Entrance", "Swamp Palace - Map Chest", "Swamp Palace - Big Chest", "Swamp Palace - Compass Chest", "Swamp Palace - Big Key Chest", "Swamp Palace - West Chest", "Swamp Palace - Flooded Room - Left", "Swamp Palace - Flooded Room - Right", - "Swamp Palace - Waterfall Room", "Swamp Palace - Boss"}, + "Swamp Palace - Hookshot Pot Key", "Swamp Palace - Pot Row Pot Key", + "Swamp Palace - Trench 1 Pot Key", "Swamp Palace - Trench 2 Pot Key", + "Swamp Palace - Waterway Pot Key", "Swamp Palace - Waterfall Room", "Swamp Palace - Boss"}, "Thieves' Town": {"Thieves' Town - Big Key Chest", "Thieves' Town - Map Chest", "Thieves' Town - Compass Chest", "Thieves' Town - Ambush Chest", "Thieves' Town - Attic", "Thieves' Town - Big Chest", + "Thieves' Town - Hallway Pot Key", "Thieves' Town - Spike Switch Pot Key", "Thieves' Town - Blind's Cell", "Thieves' Town - Boss"}, "Skull Woods": {"Skull Woods - Map Chest", "Skull Woods - Pinball Room", "Skull Woods - Compass Chest", "Skull Woods - Pot Prison", "Skull Woods - Big Chest", "Skull Woods - Big Key Chest", + "Skull Woods - Spike Corner Key Drop", "Skull Woods - West Lobby Pot Key", "Skull Woods - Bridge Room", "Skull Woods - Boss"}, "Ice Palace": {"Ice Palace - Compass Chest", "Ice Palace - Freezor Chest", "Ice Palace - Big Chest", "Ice Palace - Freezor Chest", "Ice Palace - Big Chest", "Ice Palace - Iced T Room", "Ice Palace - Spike Room", "Ice Palace - Big Key Chest", "Ice Palace - Map Chest", + "Ice Palace - Conveyor Key Drop", "Ice Palace - Hammer Block Key Drop", + "Ice Palace - Jelly Key Drop", "Ice Palace - Many Pots Pot Key", "Ice Palace - Boss"}, "Misery Mire": {"Misery Mire - Big Chest", "Misery Mire - Map Chest", "Misery Mire - Main Lobby", "Misery Mire - Bridge Chest", "Misery Mire - Spike Chest", "Misery Mire - Compass Chest", - "Misery Mire - Big Key Chest", "Misery Mire - Boss"}, + "Misery Mire - Conveyor Crystal Key Drop", "Misery Mire - Fishbone Pot Key", + "Misery Mire - Spikes Pot Key", "Misery Mire - Big Key Chest", "Misery Mire - Boss"}, "Turtle Rock": {"Turtle Rock - Compass Chest", "Turtle Rock - Roller Room - Left", "Turtle Rock - Roller Room - Right", "Turtle Rock - Chain Chomps", "Turtle Rock - Big Key Chest", "Turtle Rock - Big Chest", "Turtle Rock - Crystaroller Room", "Turtle Rock - Eye Bridge - Bottom Left", "Turtle Rock - Eye Bridge - Bottom Right", "Turtle Rock - Eye Bridge - Top Left", "Turtle Rock - Eye Bridge - Top Right", + "Turtle Rock - Pokey 1 Key Drop", "Turtle Rock - Pokey 2 Key Drop", "Turtle Rock - Boss"}, "Ganons Tower": {"Ganons Tower - Bob's Torch", "Ganons Tower - Hope Room - Left", "Ganons Tower - Hope Room - Right", "Ganons Tower - Tile Room", @@ -204,10 +220,13 @@ class ALTTPWorld(World): "Ganons Tower - Randomizer Room - Bottom Left", "Ganons Tower - Randomizer Room - Bottom Right", "Ganons Tower - Bob's Chest", "Ganons Tower - Big Chest", "Ganons Tower - Big Key Room - Left", "Ganons Tower - Big Key Room - Right", "Ganons Tower - Big Key Chest", - "Ganons Tower - Mini Helmasaur Room - Left", "Ganons Tower - Mini Helmasaur Room - Right", - "Ganons Tower - Pre-Moldorm Chest", "Ganons Tower - Validation Chest"}, + "Ganons Tower - Conveyor Cross Pot Key", "Ganons Tower - Conveyor Star Pits Pot Key", + "Ganons Tower - Double Switch Pot Key", "Ganons Tower - Mini Helmasaur Room - Left", + "Ganons Tower - Mini Helmasaur Room - Right", "Ganons Tower - Pre-Moldorm Chest", + "Ganons Tower - Mini Helmasaur Key Drop", "Ganons Tower - Validation Chest"}, "Ganons Tower Climb": {"Ganons Tower - Mini Helmasaur Room - Left", "Ganons Tower - Mini Helmasaur Room - Right", - "Ganons Tower - Pre-Moldorm Chest", "Ganons Tower - Validation Chest"}, + "Ganons Tower - Mini Helmasaur Key Drop", "Ganons Tower - Pre-Moldorm Chest", + "Ganons Tower - Validation Chest"}, } hint_blacklist = {"Triforce"} From 1b51714f3b734d0c43e6fdffa006c692b12f8c50 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Fri, 18 Apr 2025 16:34:34 -0500 Subject: [PATCH 042/199] LTTP: Rip Lttp specific entrance code out of core and use Region helpers (#1960) --- BaseClasses.py | 7 +------ worlds/alttp/OverworldGlitchRules.py | 10 ++-------- worlds/alttp/Regions.py | 8 ++++---- worlds/alttp/Rules.py | 8 ++++---- worlds/alttp/SubClasses.py | 17 +++++++++++++++-- worlds/alttp/UnderworldGlitchRules.py | 14 ++++++-------- worlds/pokemon_rb/regions.py | 6 +++++- 7 files changed, 37 insertions(+), 33 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4074108b4b..ec3fa9cef1 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1022,9 +1022,6 @@ class Entrance: connected_region: Optional[Region] = None randomization_group: int randomization_type: EntranceType - # LttP specific, TODO: should make a LttPEntrance - addresses = None - target = None def __init__(self, player: int, name: str = "", parent: Optional[Region] = None, randomization_group: int = 0, randomization_type: EntranceType = EntranceType.ONE_WAY) -> None: @@ -1043,10 +1040,8 @@ class Entrance: return False - def connect(self, region: Region, addresses: Any = None, target: Any = None) -> None: + def connect(self, region: Region) -> None: self.connected_region = region - self.target = target - self.addresses = addresses region.entrances.append(self) def is_valid_source_transition(self, er_state: "ERPlacementState") -> bool: diff --git a/worlds/alttp/OverworldGlitchRules.py b/worlds/alttp/OverworldGlitchRules.py index 2da76234bd..1a1c01525d 100644 --- a/worlds/alttp/OverworldGlitchRules.py +++ b/worlds/alttp/OverworldGlitchRules.py @@ -2,8 +2,6 @@ Helper functions to deliver entrance/exit/region sets to OWG rules. """ -from BaseClasses import Entrance - from .StateHelpers import can_lift_heavy_rocks, can_boots_clip_lw, can_boots_clip_dw, can_get_glitched_speed_dw @@ -279,18 +277,14 @@ def create_no_logic_connections(player, world, connections): for entrance, parent_region, target_region, *rule_override in connections: parent = world.get_region(parent_region, player) target = world.get_region(target_region, player) - connection = Entrance(player, entrance, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance) def create_owg_connections(player, world, connections): for entrance, parent_region, target_region, *rule_override in connections: parent = world.get_region(parent_region, player) target = world.get_region(target_region, player) - connection = Entrance(player, entrance, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance) def set_owg_connection_rules(player, world, connections, default_rule): diff --git a/worlds/alttp/Regions.py b/worlds/alttp/Regions.py index f3dbbdc059..c2af795637 100644 --- a/worlds/alttp/Regions.py +++ b/worlds/alttp/Regions.py @@ -1,11 +1,11 @@ import collections import typing -from BaseClasses import Entrance, MultiWorld -from .SubClasses import LTTPRegion, LTTPRegionType +from BaseClasses import MultiWorld +from .SubClasses import LTTPEntrance, LTTPRegion, LTTPRegionType -def is_main_entrance(entrance: Entrance) -> bool: +def is_main_entrance(entrance: LTTPEntrance) -> bool: return entrance.parent_region.type in {LTTPRegionType.DarkWorld, LTTPRegionType.LightWorld} if entrance.parent_region.type else True @@ -410,7 +410,7 @@ def _create_region(world: MultiWorld, player: int, name: str, type: LTTPRegionTy ret = LTTPRegion(name, type, hint, player, world) if exits: for exit in exits: - ret.exits.append(Entrance(player, exit, ret)) + ret.create_exit(exit) if locations: for location in locations: if location in key_drop_data: diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 47992947ac..3f5081129a 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -3,7 +3,7 @@ import logging from typing import Iterator, Set from Options import ItemsAccessibility -from BaseClasses import Entrance, MultiWorld +from BaseClasses import MultiWorld from worlds.generic.Rules import (add_item_rule, add_rule, forbid_item, item_name_in_location_names, location_item_name, set_rule, allow_self_locking_items) @@ -1071,9 +1071,8 @@ def swordless_rules(world, player): def add_connection(parent_name, target_name, entrance_name, world, player): parent = world.get_region(parent_name, player) target = world.get_region(target_name, player) - connection = Entrance(player, entrance_name, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance_name) + def standard_rules(world, player): @@ -1108,6 +1107,7 @@ def standard_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state.has('Big Key (Hyrule Castle)', player)) + def toss_junk_item(world, player): items = ['Rupees (20)', 'Bombs (3)', 'Arrows (10)', 'Rupees (5)', 'Rupee (1)', 'Bombs (10)', 'Single Arrow', 'Rupees (50)', 'Rupees (100)', 'Single Bomb', 'Bee', 'Bee Trap', diff --git a/worlds/alttp/SubClasses.py b/worlds/alttp/SubClasses.py index 328e28da93..a3b1d778d6 100644 --- a/worlds/alttp/SubClasses.py +++ b/worlds/alttp/SubClasses.py @@ -2,11 +2,10 @@ from typing import Optional, TYPE_CHECKING from enum import IntEnum -from BaseClasses import Location, Item, ItemClassification, Region, MultiWorld +from BaseClasses import Entrance, Location, Item, ItemClassification, Region, MultiWorld if TYPE_CHECKING: from .Dungeons import Dungeon - from .Regions import LTTPRegion class ALttPLocation(Location): @@ -77,6 +76,19 @@ class ALttPItem(Item): return self.type +Addresses = int | list[int] | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int] + + +class LTTPEntrance(Entrance): + addresses: Addresses | None = None + target: int | None = None + + def connect(self, region: Region, addresses: Addresses | None = None, target: int | None = None) -> None: + super().connect(region) + self.addresses = addresses + self.target = target + + class LTTPRegionType(IntEnum): LightWorld = 1 DarkWorld = 2 @@ -90,6 +102,7 @@ class LTTPRegionType(IntEnum): class LTTPRegion(Region): + entrance_type = LTTPEntrance type: LTTPRegionType # will be set after making connections. diff --git a/worlds/alttp/UnderworldGlitchRules.py b/worlds/alttp/UnderworldGlitchRules.py index 50397dea16..2b18f67ed9 100644 --- a/worlds/alttp/UnderworldGlitchRules.py +++ b/worlds/alttp/UnderworldGlitchRules.py @@ -1,6 +1,6 @@ -from BaseClasses import Entrance from worlds.generic.Rules import set_rule, add_rule from .StateHelpers import can_bomb_clip, has_sword, has_beam_sword, has_fire_source, can_melt_things, has_misery_mire_medallion +from .SubClasses import LTTPEntrance # We actually need the logic to properly "mark" these regions as Light or Dark world. @@ -9,17 +9,15 @@ def underworld_glitch_connections(world, player): specrock = world.get_region('Spectacle Rock Cave (Bottom)', player) mire = world.get_region('Misery Mire (West)', player) - kikiskip = Entrance(player, 'Kiki Skip', specrock) - mire_to_hera = Entrance(player, 'Mire to Hera Clip', mire) - mire_to_swamp = Entrance(player, 'Hera to Swamp Clip', mire) - specrock.exits.append(kikiskip) - mire.exits.extend([mire_to_hera, mire_to_swamp]) + kikiskip = specrock.create_exit('Kiki Skip') + mire_to_hera = mire.create_exit('Mire to Hera Clip') + mire_to_swamp = mire.create_exit('Hera to Swamp Clip') if world.worlds[player].fix_fake_world: kikiskip.connect(world.get_entrance('Palace of Darkness Exit', player).connected_region) mire_to_hera.connect(world.get_entrance('Tower of Hera Exit', player).connected_region) mire_to_swamp.connect(world.get_entrance('Swamp Palace Exit', player).connected_region) - else: + else: kikiskip.connect(world.get_region('Palace of Darkness (Entrance)', player)) mire_to_hera.connect(world.get_region('Tower of Hera (Bottom)', player)) mire_to_swamp.connect(world.get_region('Swamp Palace (Entrance)', player)) @@ -37,7 +35,7 @@ def fake_pearl_state(state, player): # Sets the rules on where we can actually go using this clip. # Behavior differs based on what type of ER shuffle we're playing. -def dungeon_reentry_rules(world, player, clip: Entrance, dungeon_region: str, dungeon_exit: str): +def dungeon_reentry_rules(world, player, clip: LTTPEntrance, dungeon_region: str, dungeon_exit: str): fix_dungeon_exits = world.worlds[player].fix_palaceofdarkness_exit fix_fake_worlds = world.worlds[player].fix_fake_world diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index 84c9b25735..5aa6243514 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -2640,9 +2640,13 @@ class PokemonRBWarp(Entrance): self.warp_id = warp_id self.address = address self.flags = flags + self.addresses = None + self.target = None def connect(self, entrance): - super().connect(entrance.parent_region, None, target=entrance.warp_id) + super().connect(entrance.parent_region) + self.addresses = None + self.target = entrance.warp_id def access_rule(self, state): if self.connected_region is None: From 57a716b57a7df9a6ca3ad2c4d2d7e5169bde7021 Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:41:38 -0400 Subject: [PATCH 043/199] LTTP: Update to options API (#4134) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/alttp/Bosses.py | 13 +- worlds/alttp/Dungeons.py | 4 +- worlds/alttp/EntranceShuffle.py | 100 +++--- worlds/alttp/ItemPool.py | 168 ++++----- worlds/alttp/Items.py | 4 +- worlds/alttp/Options.py | 6 +- worlds/alttp/OverworldGlitchRules.py | 20 +- worlds/alttp/Rom.py | 339 +++++++++--------- worlds/alttp/Rules.py | 155 ++++---- worlds/alttp/Shops.py | 56 +-- worlds/alttp/StateHelpers.py | 26 +- worlds/alttp/UnderworldGlitchRules.py | 6 +- worlds/alttp/__init__.py | 141 ++++---- worlds/alttp/test/dungeons/TestDungeon.py | 4 +- worlds/alttp/test/inverted/TestInverted.py | 6 +- .../test/inverted/TestInvertedBombRules.py | 2 +- .../TestInvertedMinor.py | 8 +- .../test/inverted_owg/TestInvertedOWG.py | 8 +- worlds/alttp/test/minor_glitches/TestMinor.py | 6 +- worlds/alttp/test/options/TestOpenPyramid.py | 2 +- worlds/alttp/test/owg/TestVanillaOWG.py | 6 +- worlds/alttp/test/vanilla/TestVanilla.py | 6 +- 22 files changed, 532 insertions(+), 554 deletions(-) diff --git a/worlds/alttp/Bosses.py b/worlds/alttp/Bosses.py index 02970edb9f..54686f45ad 100644 --- a/worlds/alttp/Bosses.py +++ b/worlds/alttp/Bosses.py @@ -102,7 +102,7 @@ def KholdstareDefeatRule(state, player: int) -> bool: state.has('Fire Rod', player) or ( state.has('Bombos', player) and - (has_sword(state, player) or state.multiworld.swordless[player]) + (has_sword(state, player) or state.multiworld.worlds[player].options.swordless) ) ) and ( @@ -111,7 +111,7 @@ def KholdstareDefeatRule(state, player: int) -> bool: ( state.has('Fire Rod', player) and state.has('Bombos', player) and - state.multiworld.swordless[player] and + state.multiworld.worlds[player].options.swordless and can_extend_magic(state, player, 16) ) ) @@ -137,7 +137,7 @@ def AgahnimDefeatRule(state, player: int) -> bool: def GanonDefeatRule(state, player: int) -> bool: - if state.multiworld.swordless[player]: + if state.multiworld.worlds[player].options.swordless: return state.has('Hammer', player) and \ has_fire_source(state, player) and \ state.has('Silver Bow', player) and \ @@ -146,7 +146,7 @@ def GanonDefeatRule(state, player: int) -> bool: can_hurt = has_beam_sword(state, player) common = can_hurt and has_fire_source(state, player) # silverless ganon may be needed in anything higher than no glitches - if state.multiworld.glitches_required[player] != 'no_glitches': + if state.multiworld.worlds[player].options.glitches_required != 'no_glitches': # need to light torch a sufficient amount of times return common and (state.has('Tempered Sword', player) or state.has('Golden Sword', player) or ( state.has('Silver Bow', player) and can_shoot_arrows(state, player)) or @@ -248,7 +248,7 @@ for location in boss_location_table: def place_boss(world: "ALTTPWorld", boss: str, location: str, level: Optional[str]) -> None: player = world.player - if location == 'Ganons Tower' and world.multiworld.mode[player] == 'inverted': + if location == 'Ganons Tower' and world.options.mode == 'inverted': location = 'Inverted Ganons Tower' logging.debug('Placing boss %s at %s', boss, location + (' (' + level + ')' if level else '')) world.dungeons[location].bosses[level] = BossFactory(boss, player) @@ -260,9 +260,8 @@ def format_boss_location(location_name: str, level: str) -> str: def place_bosses(world: "ALTTPWorld") -> None: multiworld = world.multiworld - player = world.player # will either be an int or a lower case string with ';' between options - boss_shuffle: Union[str, int] = multiworld.boss_shuffle[player].value + boss_shuffle: Union[str, int] = world.options.boss_shuffle.value already_placed_bosses: List[str] = [] remaining_locations: List[Tuple[str, str]] = [] # handle plando diff --git a/worlds/alttp/Dungeons.py b/worlds/alttp/Dungeons.py index 8405fc4480..39e8d7072b 100644 --- a/worlds/alttp/Dungeons.py +++ b/worlds/alttp/Dungeons.py @@ -66,7 +66,7 @@ def create_dungeons(world: "ALTTPWorld"): def make_dungeon(name, default_boss, dungeon_regions, big_key, small_keys, dungeon_items): dungeon = Dungeon(name, dungeon_regions, big_key, - [] if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal else small_keys, + [] if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal else small_keys, dungeon_items, player) for item in dungeon.all_items: item.dungeon = dungeon @@ -143,7 +143,7 @@ def create_dungeons(world: "ALTTPWorld"): item_factory(['Small Key (Turtle Rock)'] * 6, world), item_factory(['Map (Turtle Rock)', 'Compass (Turtle Rock)'], world)) - if multiworld.mode[player] != 'inverted': + if multiworld.worlds[player].options.mode != 'inverted': AT = make_dungeon('Agahnims Tower', 'Agahnim', ['Agahnims Tower', 'Agahnim 1'], None, item_factory(['Small Key (Agahnims Tower)'] * 4, world), []) GT = make_dungeon('Ganons Tower', 'Agahnim2', diff --git a/worlds/alttp/EntranceShuffle.py b/worlds/alttp/EntranceShuffle.py index d0487494aa..c062a17ea6 100644 --- a/worlds/alttp/EntranceShuffle.py +++ b/worlds/alttp/EntranceShuffle.py @@ -23,17 +23,17 @@ def link_entrances(world, player): connect_simple(world, exitname, regionname, player) # if we do not shuffle, set default connections - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) for exitname, regionname in default_dungeon_connections: connect_simple(world, exitname, regionname, player) - elif world.entrance_shuffle[player] == 'dungeons_simple': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_simple': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) simple_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'dungeons_full': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_full': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) @@ -43,7 +43,7 @@ def link_entrances(world, player): lw_entrances = list(LW_Dungeon_Entrances) dw_entrances = list(DW_Dungeon_Entrances) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -56,7 +56,7 @@ def link_entrances(world, player): dw_entrances.append('Ganons Tower') dungeon_exits.append('Ganons Tower Exit') - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be in light world, so it has to be the one connected to east exit of desert hyrule_castle_exits = [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')] connect_mandatory_exits(world, lw_entrances, hyrule_castle_exits, list(LW_Dungeon_Entrances_Must_Exit), player) @@ -65,9 +65,9 @@ def link_entrances(world, player): connect_mandatory_exits(world, lw_entrances, dungeon_exits, list(LW_Dungeon_Entrances_Must_Exit), player) connect_mandatory_exits(world, dw_entrances, dungeon_exits, list(DW_Dungeon_Entrances_Must_Exit), player) connect_caves(world, lw_entrances, dw_entrances, dungeon_exits, player) - elif world.entrance_shuffle[player] == 'dungeons_crossed': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_crossed': crossed_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'simple': + elif world.worlds[player].options.entrance_shuffle == 'simple': simple_shuffle_dungeons(world, player) old_man_entrances = list(Old_Man_Entrances) @@ -138,7 +138,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, single_doors, door_targets, player) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': simple_shuffle_dungeons(world, player) lw_entrances = list(LW_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances) @@ -210,7 +210,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'full': + elif world.worlds[player].options.entrance_shuffle == 'full': skull_woods_shuffle(world, player) lw_entrances = list(LW_Entrances + LW_Dungeon_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances) @@ -227,7 +227,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -264,7 +264,7 @@ def link_entrances(world, player): pass else: #if the cave wasn't placed we get here connect_caves(world, lw_entrances, [], old_man_house, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be in light world connect_caves(world, lw_entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) @@ -316,7 +316,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'crossed': + elif world.worlds[player].options.entrance_shuffle == 'crossed': skull_woods_shuffle(world, player) entrances = list(LW_Entrances + LW_Dungeon_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances + DW_Entrances + DW_Dungeon_Entrances + DW_Single_Cave_Doors) @@ -331,7 +331,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -348,7 +348,7 @@ def link_entrances(world, player): #place must-exit caves connect_mandatory_exits(world, entrances, caves, must_exits, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be dealt with connect_caves(world, entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) @@ -394,7 +394,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, entrances, door_targets, player) - elif world.entrance_shuffle[player] == 'insanity': + elif world.worlds[player].options.entrance_shuffle == 'insanity': # beware ye who enter here entrances = LW_Entrances + LW_Dungeon_Entrances + DW_Entrances + DW_Dungeon_Entrances + Old_Man_Entrances + ['Skull Woods Second Section Door (East)', 'Skull Woods First Section Door', 'Kakariko Well Cave', 'Bat Cave Cave', 'North Fairy Cave', 'Sanctuary', 'Lost Woods Hideout Stump', 'Lumberjack Tree Cave'] @@ -431,7 +431,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # cannot move uncle cave connect_entrance(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', player) connect_exit(world, 'Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance Stairs', player) @@ -464,7 +464,7 @@ def link_entrances(world, player): connect_entrance(world, hole, hole_targets.pop(), player) # hyrule castle handling - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_entrance(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) connect_exit(world, 'Hyrule Castle Exit (South)', 'Hyrule Castle Entrance (South)', player) @@ -544,12 +544,12 @@ def link_entrances(world, player): else: raise NotImplementedError( - f'{world.entrance_shuffle[player]} Shuffling not supported yet. Player {world.get_player_name(player)}') + f'{world.worlds[player].options.entrance_shuffle} Shuffling not supported yet. Player {world.get_player_name(player)}') - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: overworld_glitch_connections(world, player) # mandatory hybrid major glitches connections - if world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: underworld_glitch_connections(world, player) # check for swamp palace fix @@ -584,17 +584,17 @@ def link_inverted_entrances(world, player): connect_simple(world, exitname, regionname, player) # if we do not shuffle, set default connections - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) for exitname, regionname in inverted_default_dungeon_connections: connect_simple(world, exitname, regionname, player) - elif world.entrance_shuffle[player] == 'dungeons_simple': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_simple': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) simple_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'dungeons_full': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_full': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) @@ -649,9 +649,9 @@ def link_inverted_entrances(world, player): connect_mandatory_exits(world, lw_entrances, dungeon_exits, lw_dungeon_entrances_must_exit, player) connect_caves(world, lw_entrances, dw_entrances, dungeon_exits, player) - elif world.entrance_shuffle[player] == 'dungeons_crossed': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_crossed': inverted_crossed_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'simple': + elif world.worlds[player].options.entrance_shuffle == 'simple': simple_shuffle_dungeons(world, player) old_man_entrances = list(Inverted_Old_Man_Entrances) @@ -748,7 +748,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, single_doors, door_targets, player) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': simple_shuffle_dungeons(world, player) lw_entrances = list(Inverted_LW_Entrances + Inverted_LW_Single_Cave_Doors) @@ -833,7 +833,7 @@ def link_inverted_entrances(world, player): doors = lw_entrances + dw_entrances # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'full': + elif world.worlds[player].options.entrance_shuffle == 'full': skull_woods_shuffle(world, player) lw_entrances = list(Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_LW_Single_Cave_Doors) @@ -984,7 +984,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'crossed': + elif world.worlds[player].options.entrance_shuffle == 'crossed': skull_woods_shuffle(world, player) entrances = list(Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_LW_Single_Cave_Doors + Inverted_Old_Man_Entrances + Inverted_DW_Entrances + Inverted_DW_Dungeon_Entrances + Inverted_DW_Single_Cave_Doors) @@ -1095,7 +1095,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, entrances, door_targets, player) - elif world.entrance_shuffle[player] == 'insanity': + elif world.worlds[player].options.entrance_shuffle == 'insanity': # beware ye who enter here entrances = Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_DW_Entrances + Inverted_DW_Dungeon_Entrances + Inverted_Old_Man_Entrances + Old_Man_Entrances + ['Skull Woods Second Section Door (East)', 'Skull Woods Second Section Door (West)', 'Skull Woods First Section Door', 'Kakariko Well Cave', 'Bat Cave Cave', 'North Fairy Cave', 'Sanctuary', 'Lost Woods Hideout Stump', 'Lumberjack Tree Cave', 'Hyrule Castle Entrance (South)'] @@ -1254,10 +1254,10 @@ def link_inverted_entrances(world, player): else: raise NotImplementedError('Shuffling not supported yet') - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: overworld_glitch_connections(world, player) # mandatory hybrid major glitches connections - if world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: underworld_glitch_connections(world, player) # patch swamp drain @@ -1349,7 +1349,7 @@ def scramble_holes(world, player): else: hole_targets.append(('Pyramid Exit', 'Pyramid')) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # cannot move uncle cave connect_two_way(world, 'Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Exit', player) connect_entrance(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', player) @@ -1358,14 +1358,14 @@ def scramble_holes(world, player): hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance')) # do not shuffle sanctuary into pyramid hole unless shuffle is crossed - if world.entrance_shuffle[player] == 'crossed': + if world.worlds[player].options.entrance_shuffle == 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) if world.shuffle_ganon: world.random.shuffle(hole_targets) exit, target = hole_targets.pop() connect_two_way(world, 'Pyramid Entrance', exit, player) connect_entrance(world, 'Pyramid Hole', target, player) - if world.entrance_shuffle[player] != 'crossed': + if world.worlds[player].options.entrance_shuffle != 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) world.random.shuffle(hole_targets) @@ -1400,14 +1400,14 @@ def scramble_inverted_holes(world, player): hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance')) # do not shuffle sanctuary into pyramid hole unless shuffle is crossed - if world.entrance_shuffle[player] == 'crossed': + if world.worlds[player].options.entrance_shuffle == 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) if world.shuffle_ganon: world.random.shuffle(hole_targets) exit, target = hole_targets.pop() connect_two_way(world, 'Inverted Pyramid Entrance', exit, player) connect_entrance(world, 'Inverted Pyramid Hole', target, player) - if world.entrance_shuffle[player] != 'crossed': + if world.worlds[player].options.entrance_shuffle != 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) world.random.shuffle(hole_targets) @@ -1430,15 +1430,15 @@ def connect_random(world, exitlist, targetlist, player, two_way=False): def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): # Keeps track of entrances that cannot be used to access each exit / cave - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': invalid_connections = Inverted_Must_Exit_Invalid_Connections.copy() else: invalid_connections = Must_Exit_Invalid_Connections.copy() invalid_cave_connections = defaultdict(set) - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: from . import OverworldGlitchRules - for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.mode[player] == 'inverted'): + for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.worlds[player].options.mode == 'inverted'): invalid_connections[entrance] = set() if entrance in must_be_exits: must_be_exits.remove(entrance) @@ -1449,7 +1449,7 @@ def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): world.random.shuffle(caves) # Handle inverted Aga Tower - if it depends on connections, then so does Hyrule Castle Ledge - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': for entrance in invalid_connections: if world.get_entrance(entrance, player).connected_region == world.get_region('Inverted Agahnims Tower', player): @@ -1490,7 +1490,7 @@ def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): entrance = next(e for e in entrances[::-1] if e not in invalid_connections[exit]) cave_entrances.append(entrance) entrances.remove(entrance) - connect_two_way(world,entrance,cave_exit, player) + connect_two_way(world, entrance, cave_exit, player) if entrance not in invalid_connections: invalid_connections[exit] = set() if all(entrance in invalid_connections for entrance in cave_entrances): @@ -1564,7 +1564,7 @@ def simple_shuffle_dungeons(world, player): dungeon_entrances = ['Eastern Palace', 'Tower of Hera', 'Thieves Town', 'Skull Woods Final Section', 'Palace of Darkness', 'Ice Palace', 'Misery Mire', 'Swamp Palace'] dungeon_exits = ['Eastern Palace Exit', 'Tower of Hera Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Palace of Darkness Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Swamp Palace Exit'] - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': if not world.shuffle_ganon: connect_two_way(world, 'Ganons Tower', 'Ganons Tower Exit', player) else: @@ -1579,13 +1579,13 @@ def simple_shuffle_dungeons(world, player): # mix up 4 door dungeons multi_dungeons = ['Desert', 'Turtle Rock'] - if world.mode[player] == 'open' or (world.mode[player] == 'inverted' and world.shuffle_ganon): + if world.worlds[player].options.mode == 'open' or (world.worlds[player].options.mode == 'inverted' and world.shuffle_ganon): multi_dungeons.append('Hyrule Castle') world.random.shuffle(multi_dungeons) dp_target = multi_dungeons[0] tr_target = multi_dungeons[1] - if world.mode[player] not in ['open', 'inverted'] or (world.mode[player] == 'inverted' and world.shuffle_ganon is False): + if world.worlds[player].options.mode not in ['open', 'inverted'] or (world.worlds[player].options.mode == 'inverted' and world.shuffle_ganon is False): # place hyrule castle as intended hc_target = 'Hyrule Castle' else: @@ -1593,7 +1593,7 @@ def simple_shuffle_dungeons(world, player): # ToDo improve this? - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': if hc_target == 'Hyrule Castle': connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) connect_two_way(world, 'Hyrule Castle Entrance (East)', 'Hyrule Castle Exit (East)', player) @@ -1708,7 +1708,7 @@ def crossed_shuffle_dungeons(world, player: int): dungeon_entrances.append('Ganons Tower') dungeon_exits.append('Ganons Tower Exit') - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -1718,7 +1718,7 @@ def crossed_shuffle_dungeons(world, player: int): connect_mandatory_exits(world, dungeon_entrances, dungeon_exits, LW_Dungeon_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': connect_caves(world, dungeon_entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) connect_caves(world, dungeon_entrances, [], dungeon_exits, player) @@ -1823,14 +1823,14 @@ lookup = { def plando_connect(world, player: int): - if world.plando_connections[player]: - for connection in world.plando_connections[player]: + if world.worlds[player].options.plando_connections: + for connection in world.worlds[player].options.plando_connections: func = lookup[connection.direction] try: func(world, connection.entrance, connection.exit, player) except Exception as e: raise Exception(f"Could not connect using {connection}") from e - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': mark_light_world_regions(world, player) else: mark_dark_world_regions(world, player) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 77d02f9770..2b99ef8a73 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -226,25 +226,25 @@ def generate_itempool(world): player = world.player multiworld = world.multiworld - if multiworld.item_pool[player].current_key not in difficulties: - raise NotImplementedError(f"Diffulty {multiworld.item_pool[player]}") - if multiworld.goal[player] not in ('ganon', 'pedestal', 'bosses', 'triforce_hunt', 'local_triforce_hunt', - 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'crystals', - 'ganon_pedestal'): - raise NotImplementedError(f"Goal {multiworld.goal[player]} for player {player}") - if multiworld.mode[player] not in ('open', 'standard', 'inverted'): - raise NotImplementedError(f"Mode {multiworld.mode[player]} for player {player}") - if multiworld.timer[player] not in (False, 'display', 'timed', 'timed_ohko', 'ohko', 'timed_countdown'): - raise NotImplementedError(f"Timer {multiworld.timer[player]} for player {player}") + if world.options.item_pool.current_key not in difficulties: + raise NotImplementedError(f"Diffulty {world.options.item_pool}") + if world.options.goal not in ('ganon', 'pedestal', 'bosses', 'triforce_hunt', 'local_triforce_hunt', + 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'crystals', + 'ganon_pedestal'): + raise NotImplementedError(f"Goal {world.options.goal} for player {player}") + if world.options.mode not in ('open', 'standard', 'inverted'): + raise NotImplementedError(f"Mode {world.options.mode} for player {player}") + if world.options.timer not in (False, 'display', 'timed', 'timed_ohko', 'ohko', 'timed_countdown'): + raise NotImplementedError(f"Timer {world.options.timer} for player {player}") - if multiworld.timer[player] in ['ohko', 'timed_ohko']: + if world.options.timer in ['ohko', 'timed_ohko']: world.can_take_damage = False - if multiworld.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: + if world.options.goal in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Nothing', world), False) else: multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Triforce', world), False) - if multiworld.goal[player] in ['triforce_hunt', 'local_triforce_hunt']: + if world.options.goal in ['triforce_hunt', 'local_triforce_hunt']: region = multiworld.get_region('Light World', player) loc = ALttPLocation(player, "Murahdahla", parent=region) @@ -288,7 +288,7 @@ def generate_itempool(world): for item in precollected_items: multiworld.push_precollected(item_factory(item, world)) - if multiworld.mode[player] == 'standard' and not has_melee_weapon(multiworld.state, player): + if world.options.mode == 'standard' and not has_melee_weapon(multiworld.state, player): if "Link's Uncle" not in placed_items: found_sword = False found_bow = False @@ -304,10 +304,10 @@ def generate_itempool(world): elif item in ['Hammer', 'Fire Rod', 'Cane of Somaria', 'Cane of Byrna']: if item not in possible_weapons: possible_weapons.append(item) - elif (item == 'Bombs (10)' and (not multiworld.bombless_start[player]) and item not in + elif (item == 'Bombs (10)' and (not world.options.bombless_start) and item not in possible_weapons): possible_weapons.append(item) - elif (item in ['Bomb Upgrade (+10)', 'Bomb Upgrade (50)'] and multiworld.bombless_start[player] and item + elif (item in ['Bomb Upgrade (+10)', 'Bomb Upgrade (50)'] and world.options.bombless_start and item not in possible_weapons): possible_weapons.append(item) @@ -315,21 +315,21 @@ def generate_itempool(world): placed_items["Link's Uncle"] = starting_weapon pool.remove(starting_weapon) if (placed_items["Link's Uncle"] in ['Bow', 'Progressive Bow', 'Bombs (10)', 'Bomb Upgrade (+10)', - 'Bomb Upgrade (50)', 'Cane of Somaria', 'Cane of Byrna'] and multiworld.enemy_health[player] not in ['default', 'easy']): - if multiworld.bombless_start[player] and "Bomb Upgrade" not in placed_items["Link's Uncle"]: + 'Bomb Upgrade (50)', 'Cane of Somaria', 'Cane of Byrna'] and world.options.enemy_health not in ['default', 'easy']): + if world.options.bombless_start and "Bomb Upgrade" not in placed_items["Link's Uncle"]: if 'Bow' in placed_items["Link's Uncle"]: - multiworld.worlds[player].escape_assist.append('arrows') + world.escape_assist.append('arrows') elif 'Cane' in placed_items["Link's Uncle"]: - multiworld.worlds[player].escape_assist.append('magic') + world.escape_assist.append('magic') else: - multiworld.worlds[player].escape_assist.append('bombs') + world.escape_assist.append('bombs') for (location, item) in placed_items.items(): multiworld.get_location(location, player).place_locked_item(item_factory(item, world)) items = item_factory(pool, world) # convert one Progressive Bow into Progressive Bow (Alt), in ID only, for ganon silvers hint text - if multiworld.worlds[player].has_progressive_bows: + if world.has_progressive_bows: for item in items: if item.code == 0x64: # Progressive Bow item.code = 0x65 # Progressive Bow (Alt) @@ -338,21 +338,21 @@ def generate_itempool(world): if clock_mode: world.clock_mode = clock_mode - multiworld.worlds[player].treasure_hunt_required = treasure_hunt_required % 999 - multiworld.worlds[player].treasure_hunt_total = treasure_hunt_total + world.treasure_hunt_required = treasure_hunt_required % 999 + world.treasure_hunt_total = treasure_hunt_total dungeon_items = [item for item in get_dungeon_item_pool_player(world) - if item.name not in multiworld.worlds[player].dungeon_local_item_names] + if item.name not in world.dungeon_local_item_names] for key_loc in key_drop_data: key_data = key_drop_data[key_loc] drop_item = item_factory(key_data[3], world) - if not multiworld.key_drop_shuffle[player]: + if not world.options.key_drop_shuffle: if drop_item in dungeon_items: dungeon_items.remove(drop_item) else: dungeon = drop_item.name.split("(")[1].split(")")[0] - if multiworld.mode[player] == 'inverted': + if world.options.mode == 'inverted': if dungeon == "Agahnims Tower": dungeon = "Inverted Agahnims Tower" if dungeon == "Ganons Tower": @@ -365,7 +365,7 @@ def generate_itempool(world): loc = multiworld.get_location(key_loc, player) loc.place_locked_item(drop_item) loc.address = None - elif "Small" in key_data[3] and multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + elif "Small" in key_data[3] and world.options.small_key_shuffle == small_key_shuffle.option_universal: # key drop shuffle and universal keys are on. Add universal keys in place of key drop keys. multiworld.itempool.append(item_factory(GetBeemizerItem(multiworld, player, 'Small Key (Universal)'), world)) dungeon_item_replacements = sum(difficulties[world.options.item_pool.current_key].extras, []) * 2 @@ -373,10 +373,10 @@ def generate_itempool(world): for x in range(len(dungeon_items)-1, -1, -1): item = dungeon_items[x] - if ((multiworld.small_key_shuffle[player] == small_key_shuffle.option_start_with and item.type == 'SmallKey') - or (multiworld.big_key_shuffle[player] == big_key_shuffle.option_start_with and item.type == 'BigKey') - or (multiworld.compass_shuffle[player] == compass_shuffle.option_start_with and item.type == 'Compass') - or (multiworld.map_shuffle[player] == map_shuffle.option_start_with and item.type == 'Map')): + if ((world.options.small_key_shuffle == small_key_shuffle.option_start_with and item.type == 'SmallKey') + or (world.options.big_key_shuffle == big_key_shuffle.option_start_with and item.type == 'BigKey') + or (world.options.compass_shuffle == compass_shuffle.option_start_with and item.type == 'Compass') + or (world.options.map_shuffle == map_shuffle.option_start_with and item.type == 'Map')): dungeon_items.pop(x) multiworld.push_precollected(item) multiworld.itempool.append(item_factory(dungeon_item_replacements.pop(), world)) @@ -384,7 +384,7 @@ def generate_itempool(world): set_up_shops(multiworld, player) - if multiworld.retro_bow[player]: + if world.options.retro_bow: shop_items = 0 shop_locations = [location for shop_locations in (shop.region.locations for shop in multiworld.shops if shop.type == ShopType.Shop and shop.region.player == player) for location in shop_locations if @@ -395,12 +395,12 @@ def generate_itempool(world): else: shop_items += 1 else: - shop_items = min(multiworld.shop_item_slots[player], 30 if multiworld.include_witch_hut[player] else 27) + shop_items = min(world.options.shop_item_slots, 30 if world.options.include_witch_hut else 27) - if multiworld.shuffle_capacity_upgrades[player]: + if world.options.shuffle_capacity_upgrades: shop_items += 2 - chance_100 = int(multiworld.retro_bow[player]) * 0.25 + int( - multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal) * 0.5 + chance_100 = int(world.options.retro_bow) * 0.25 + int( + world.options.small_key_shuffle == small_key_shuffle.option_universal) * 0.5 for _ in range(shop_items): if multiworld.random.random() < chance_100: items.append(item_factory(GetBeemizerItem(multiworld, player, "Rupees (100)"), world)) @@ -410,19 +410,19 @@ def generate_itempool(world): multiworld.random.shuffle(items) pool_count = len(items) new_items = ["Triforce Piece" for _ in range(additional_triforce_pieces)] - if multiworld.shuffle_capacity_upgrades[player] or multiworld.bombless_start[player]: - progressive = multiworld.progressive[player] + if world.options.shuffle_capacity_upgrades or world.options.bombless_start: + progressive = world.options.progressive progressive = multiworld.random.choice([True, False]) if progressive == 'grouped_random' else progressive == 'on' - if multiworld.shuffle_capacity_upgrades[player] == "on_combined": + if world.options.shuffle_capacity_upgrades == "on_combined": new_items.append("Bomb Upgrade (50)") - elif multiworld.shuffle_capacity_upgrades[player] == "on": + elif world.options.shuffle_capacity_upgrades == "on": new_items += ["Bomb Upgrade (+5)"] * 6 new_items.append("Bomb Upgrade (+5)" if progressive else "Bomb Upgrade (+10)") - if multiworld.shuffle_capacity_upgrades[player] != "on_combined" and multiworld.bombless_start[player]: + if world.options.shuffle_capacity_upgrades != "on_combined" and world.options.bombless_start: new_items.append("Bomb Upgrade (+5)" if progressive else "Bomb Upgrade (+10)") - if multiworld.shuffle_capacity_upgrades[player] and not multiworld.retro_bow[player]: - if multiworld.shuffle_capacity_upgrades[player] == "on_combined": + if world.options.shuffle_capacity_upgrades and not world.options.retro_bow: + if world.options.shuffle_capacity_upgrades == "on_combined": new_items += ["Arrow Upgrade (70)"] else: new_items += ["Arrow Upgrade (+5)"] * 6 @@ -481,7 +481,7 @@ def generate_itempool(world): if len(items) < pool_count: items += removed_filler[len(items) - pool_count:] - if multiworld.randomize_cost_types[player]: + if world.options.randomize_cost_types: # Heart and Arrow costs require all Heart Container/Pieces and Arrow Upgrades to be advancement items for logic for item in items: if item.name in ("Boss Heart Container", "Sanctuary Heart Container", "Piece of Heart"): @@ -490,21 +490,21 @@ def generate_itempool(world): # Otherwise, logic has some branches where having 4 hearts is one possible requirement (of several alternatives) # rather than making all hearts/heart pieces progression items (which slows down generation considerably) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) - if multiworld.item_pool[player] in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0): + if world.options.item_pool in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0): next(item for item in items if item.name == 'Boss Heart Container').classification = ItemClassification.progression - elif multiworld.item_pool[player] in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4): + elif world.options.item_pool in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4): adv_heart_pieces = (item for item in items if item.name == 'Piece of Heart') for i in range(4): next(adv_heart_pieces).classification = ItemClassification.progression - world.required_medallions = (multiworld.misery_mire_medallion[player].current_key.title(), - multiworld.turtle_rock_medallion[player].current_key.title()) + world.required_medallions = (world.options.misery_mire_medallion.current_key.title(), + world.options.turtle_rock_medallion.current_key.title()) place_bosses(world) multiworld.itempool += items - if multiworld.retro_caves[player]: + if world.options.retro_caves: set_up_take_anys(multiworld, world, player) # depends on world.itempool to be set @@ -527,7 +527,7 @@ take_any_locations.sort() def set_up_take_anys(multiworld, world, player): # these are references, do not modify these lists in-place - if multiworld.mode[player] == 'inverted': + if world.options.mode == 'inverted': take_any_locs = take_any_locations_inverted else: take_any_locs = take_any_locations @@ -578,14 +578,14 @@ def set_up_take_anys(multiworld, world, player): def get_pool_core(world, player: int): - shuffle = world.entrance_shuffle[player].current_key - difficulty = world.item_pool[player].current_key - timer = world.timer[player].current_key - goal = world.goal[player].current_key - mode = world.mode[player].current_key - swordless = world.swordless[player] - retro_bow = world.retro_bow[player] - logic = world.glitches_required[player] + shuffle = world.worlds[player].options.entrance_shuffle.current_key + difficulty = world.worlds[player].options.item_pool.current_key + timer = world.worlds[player].options.timer.current_key + goal = world.worlds[player].options.goal.current_key + mode = world.worlds[player].options.mode.current_key + swordless = world.worlds[player].options.swordless + retro_bow = world.worlds[player].options.retro_bow + logic = world.worlds[player].options.glitches_required pool = [] placed_items = {} @@ -602,11 +602,11 @@ def get_pool_core(world, player: int): placed_items[loc] = item # provide boots to major glitch dependent seeds - if logic.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.glitch_boots[player]: + if logic.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.worlds[player].options.glitch_boots: precollected_items.append('Pegasus Boots') pool.remove('Pegasus Boots') pool.append('Rupees (20)') - want_progressives = world.progressive[player].want_progressives + want_progressives = world.worlds[player].options.progressive.want_progressives if want_progressives(world.random): pool.extend(diff.progressiveglove) @@ -680,22 +680,22 @@ def get_pool_core(world, player: int): additional_pieces_to_place = 0 if 'triforce_hunt' in goal: - if world.triforce_pieces_mode[player].value == TriforcePiecesMode.option_extra: - treasure_hunt_total = (world.triforce_pieces_required[player].value - + world.triforce_pieces_extra[player].value) - elif world.triforce_pieces_mode[player].value == TriforcePiecesMode.option_percentage: - percentage = float(world.triforce_pieces_percentage[player].value) / 100 - treasure_hunt_total = int(round(world.triforce_pieces_required[player].value * percentage, 0)) + if world.worlds[player].options.triforce_pieces_mode.value == TriforcePiecesMode.option_extra: + treasure_hunt_total = (world.worlds[player].options.triforce_pieces_required.value + + world.worlds[player].options.triforce_pieces_extra.value) + elif world.worlds[player].options.triforce_pieces_mode.value == TriforcePiecesMode.option_percentage: + percentage = float(world.worlds[player].options.triforce_pieces_percentage.value) / 100 + treasure_hunt_total = int(round(world.worlds[player].options.triforce_pieces_required.value * percentage, 0)) else: # available - treasure_hunt_total = world.triforce_pieces_available[player].value + treasure_hunt_total = world.worlds[player].options.triforce_pieces_available.value - triforce_pieces = min(90, max(treasure_hunt_total, world.triforce_pieces_required[player].value)) + triforce_pieces = min(90, max(treasure_hunt_total, world.worlds[player].options.triforce_pieces_required.value)) pieces_in_core = min(extraitems, triforce_pieces) additional_pieces_to_place = triforce_pieces - pieces_in_core pool.extend(["Triforce Piece"] * pieces_in_core) extraitems -= pieces_in_core - treasure_hunt_required = world.triforce_pieces_required[player].value + treasure_hunt_required = world.worlds[player].options.triforce_pieces_required.value for extra in diff.extras: if extraitems >= len(extra): @@ -714,10 +714,10 @@ def get_pool_core(world, player: int): if retro_bow: replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)', 'Arrow Upgrade (70)'} pool = ['Rupees (5)' if item in replace else item for item in pool] - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: pool.extend(diff.universal_keys) if mode == 'standard': - if world.key_drop_shuffle[player]: + if world.worlds[player].options.key_drop_shuffle: key_locations = ['Secret Passage', 'Hyrule Castle - Map Guard Key Drop'] key_location = world.random.choice(key_locations) key_locations.remove(key_location) @@ -741,11 +741,11 @@ def get_pool_core(world, player: int): def make_custom_item_pool(world, player): - shuffle = world.entrance_shuffle[player] - difficulty = world.item_pool[player] - timer = world.timer[player] - goal = world.goal[player] - mode = world.mode[player] + shuffle = world.worlds[player].options.entrance_shuffle + difficulty = world.worlds[player].options.item_pool + timer = world.worlds[player].options.timer + goal = world.worlds[player].options.goal + mode = world.worlds[player].options.mode customitemarray = world.customitemarray pool = [] @@ -845,10 +845,10 @@ def make_custom_item_pool(world, player): thisbottle = world.random.choice(diff.bottles) pool.append(thisbottle) - if "triforce" in world.goal[player]: - pool.extend(["Triforce Piece"] * world.triforce_pieces_available[player]) - itemtotal += world.triforce_pieces_available[player] - treasure_hunt_required = world.triforce_pieces_required[player] + if "triforce" in world.worlds[player].options.goal: + pool.extend(["Triforce Piece"] * world.worlds[player].options.triforce_pieces_available) + itemtotal += world.worlds[player].options.triforce_pieces_available + treasure_hunt_required = world.worlds[player].options.triforce_pieces_required if timer in ['display', 'timed', 'timed_countdown']: clock_mode = 'countdown' if timer == 'timed_countdown' else 'stopwatch' @@ -862,7 +862,7 @@ def make_custom_item_pool(world, player): itemtotal = itemtotal + 1 if mode == 'standard': - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: key_location = world.random.choice( ['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) @@ -885,9 +885,9 @@ def make_custom_item_pool(world, player): pool.extend(['Magic Mirror'] * customitemarray[22]) pool.extend(['Moon Pearl'] * customitemarray[28]) - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: itemtotal = itemtotal - 28 # Corrects for small keys not being in item pool in universal Mode - if world.key_drop_shuffle[player]: + if world.worlds[player].options.key_drop_shuffle: itemtotal = itemtotal - (len(key_drop_data) - 1) if itemtotal < total_items_to_place: pool.extend(['Nothing'] * (total_items_to_place - itemtotal)) diff --git a/worlds/alttp/Items.py b/worlds/alttp/Items.py index 5f081e65fc..cbe6e99642 100644 --- a/worlds/alttp/Items.py +++ b/worlds/alttp/Items.py @@ -11,11 +11,11 @@ def GetBeemizerItem(world, player: int, item): return item # first roll - replaceable item should be replaced, within beemizer_total_chance - if not world.beemizer_total_chance[player] or world.random.random() > (world.beemizer_total_chance[player] / 100): + if not world.worlds[player].options.beemizer_total_chance or world.random.random() > (world.worlds[player].options.beemizer_total_chance / 100): return item # second roll - bee replacement should be trap, within beemizer_trap_chance - if not world.beemizer_trap_chance[player] or world.random.random() > (world.beemizer_trap_chance[player] / 100): + if not world.worlds[player].options.beemizer_trap_chance or world.random.random() > (world.worlds[player].options.beemizer_trap_chance / 100): return "Bee" if isinstance(item, str) else world.create_item("Bee", player) else: return "Bee Trap" if isinstance(item, str) else world.create_item("Bee Trap", player) diff --git a/worlds/alttp/Options.py b/worlds/alttp/Options.py index 0974586117..519241d7f4 100644 --- a/worlds/alttp/Options.py +++ b/worlds/alttp/Options.py @@ -156,10 +156,10 @@ class OpenPyramid(Choice): def to_bool(self, world: MultiWorld, player: int) -> bool: if self.value == self.option_goal: - return world.goal[player].current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} + return world.worlds[player].options.goal.current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} elif self.value == self.option_auto: - return world.goal[player].current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} \ - and (world.entrance_shuffle[player].current_key in {'vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'} or not + return world.worlds[player].options.goal.current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} \ + and (world.worlds[player].options.entrance_shuffle.current_key in {'vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'} or not world.shuffle_ganon) elif self.value == self.option_open: return True diff --git a/worlds/alttp/OverworldGlitchRules.py b/worlds/alttp/OverworldGlitchRules.py index 1a1c01525d..aeff9cb88e 100644 --- a/worlds/alttp/OverworldGlitchRules.py +++ b/worlds/alttp/OverworldGlitchRules.py @@ -220,14 +220,14 @@ def get_invalid_bunny_revival_dungeons(): def overworld_glitch_connections(world, player): # Boots-accessible locations. - create_owg_connections(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted')) - create_owg_connections(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted', player)) + create_owg_connections(player, world, get_boots_clip_exits_lw(world.worlds[player].options.mode == 'inverted')) + create_owg_connections(player, world, get_boots_clip_exits_dw(world.worlds[player].options.mode == 'inverted', player)) # Glitched speed drops. - create_owg_connections(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted')) + create_owg_connections(player, world, get_glitched_speed_drops_dw(world.worlds[player].options.mode == 'inverted')) # Mirror clip spots. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': create_owg_connections(player, world, get_mirror_clip_spots_dw()) create_owg_connections(player, world, get_mirror_offset_spots_dw()) else: @@ -237,24 +237,24 @@ def overworld_glitch_connections(world, player): def overworld_glitches_rules(world, player): # Boots-accessible locations. - set_owg_connection_rules(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'), lambda state: can_boots_clip_lw(state, player)) - set_owg_connection_rules(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted', player), lambda state: can_boots_clip_dw(state, player)) + set_owg_connection_rules(player, world, get_boots_clip_exits_lw(world.worlds[player].options.mode == 'inverted'), lambda state: can_boots_clip_lw(state, player)) + set_owg_connection_rules(player, world, get_boots_clip_exits_dw(world.worlds[player].options.mode == 'inverted', player), lambda state: can_boots_clip_dw(state, player)) # Glitched speed drops. - set_owg_connection_rules(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'), lambda state: can_get_glitched_speed_dw(state, player)) + set_owg_connection_rules(player, world, get_glitched_speed_drops_dw(world.worlds[player].options.mode == 'inverted'), lambda state: can_get_glitched_speed_dw(state, player)) # Dark Death Mountain Ledge Clip Spot also accessible with mirror. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': add_alternate_rule(world.get_entrance('Dark Death Mountain Ledge Clip Spot', player), lambda state: state.has('Magic Mirror', player)) # Mirror clip spots. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_owg_connection_rules(player, world, get_mirror_clip_spots_dw(), lambda state: state.has('Magic Mirror', player)) set_owg_connection_rules(player, world, get_mirror_offset_spots_dw(), lambda state: state.has('Magic Mirror', player) and can_boots_clip_lw(state, player)) else: set_owg_connection_rules(player, world, get_mirror_offset_spots_lw(player), lambda state: state.has('Magic Mirror', player) and can_boots_clip_dw(state, player)) # Regions that require the boots and some other stuff. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': world.get_entrance('Turtle Rock Teleporter', player).access_rule = lambda state: (can_boots_clip_lw(state, player) or can_lift_heavy_rocks(state, player)) and state.has('Hammer', player) add_alternate_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Moon Pearl', player) or state.has('Pegasus Boots', player)) else: diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 5ed048e881..f69e6bb955 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -92,7 +92,7 @@ class LocalRom: # cause crash to provide traceback import xxtea - local_random = world.per_slot_randoms[player] + local_random = world.worlds[player].random key = bytes(local_random.getrandbits(8 * 16).to_bytes(16, 'big')) self.write_bytes(0x1800B0, bytearray(key)) self.write_int16(0x180087, 1) @@ -281,7 +281,6 @@ def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_rand def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): player = world.player - multiworld = world.multiworld check_enemizer(enemizercli) randopatch_path = os.path.abspath(os.path.join(output_directory, f'enemizer_randopatch_{player}.sfc')) options_path = os.path.abspath(os.path.join(output_directory, f'enemizer_options_{player}.json')) @@ -289,18 +288,18 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): # write options file for enemizer options = { - 'RandomizeEnemies': multiworld.enemy_shuffle[player].value, + 'RandomizeEnemies': world.options.enemy_shuffle.value, 'RandomizeEnemiesType': 3, - 'RandomizeBushEnemyChance': multiworld.bush_shuffle[player].value, - 'RandomizeEnemyHealthRange': multiworld.enemy_health[player] != 'default', + 'RandomizeBushEnemyChance': world.options.bush_shuffle.value, + 'RandomizeEnemyHealthRange': world.options.enemy_health != 'default', 'RandomizeEnemyHealthType': {'default': 0, 'easy': 0, 'normal': 1, 'hard': 2, 'expert': 3}[ - multiworld.enemy_health[player].current_key], + world.options.enemy_health.current_key], 'OHKO': False, - 'RandomizeEnemyDamage': multiworld.enemy_damage[player] != 'default', + 'RandomizeEnemyDamage': world.options.enemy_damage != 'default', 'AllowEnemyZeroDamage': True, - 'ShuffleEnemyDamageGroups': multiworld.enemy_damage[player] != 'default', - 'EnemyDamageChaosMode': multiworld.enemy_damage[player] == 'chaos', - 'EasyModeEscape': multiworld.mode[player] == "standard", + 'ShuffleEnemyDamageGroups': world.options.enemy_damage != 'default', + 'EnemyDamageChaosMode': world.options.enemy_damage == 'chaos', + 'EasyModeEscape': world.options.mode == "standard", 'EnemiesAbsorbable': False, 'AbsorbableSpawnRate': 10, 'AbsorbableTypes': { @@ -329,7 +328,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'GrayscaleMode': False, 'GenerateSpoilers': False, 'RandomizeLinkSpritePalette': False, - 'RandomizePots': multiworld.pot_shuffle[player].value, + 'RandomizePots': world.options.pot_shuffle.value, 'ShuffleMusic': False, 'BootlegMagic': True, 'CustomBosses': False, @@ -342,7 +341,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'BeesLevel': 0, 'RandomizeTileTrapPattern': False, 'RandomizeTileTrapFloorTile': False, - 'AllowKillableThief': multiworld.killable_thieves[player].value, + 'AllowKillableThief': world.options.killable_thieves.value, 'RandomizeSpriteOnHit': False, 'DebugMode': False, 'DebugForceEnemy': False, @@ -366,13 +365,13 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'MiseryMire': world.dungeons["Misery Mire"].boss.enemizer_name, 'TurtleRock': world.dungeons["Turtle Rock"].boss.enemizer_name, 'GanonsTower1': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['bottom'].enemizer_name, 'GanonsTower2': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['middle'].enemizer_name, 'GanonsTower3': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['top'].enemizer_name, 'GanonsTower4': 'Agahnim2', 'Ganon': 'Ganon', @@ -386,7 +385,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): max_enemizer_tries = 5 for i in range(max_enemizer_tries): - enemizer_seed = str(multiworld.per_slot_randoms[player].randint(0, 999999999)) + enemizer_seed = str(world.random.randint(0, 999999999)) enemizer_command = [os.path.abspath(enemizercli), '--rom', randopatch_path, '--seed', enemizer_seed, @@ -416,7 +415,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): continue for j in range(i + 1, max_enemizer_tries): - multiworld.per_slot_randoms[player].randint(0, 999999999) + world.random.randint(0, 999999999) # Sacrifice all remaining random numbers that would have been used for unused enemizer tries. # This allows for future enemizer bug fixes to NOT affect the rest of the seed's randomness break @@ -430,7 +429,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): # Moblins attached to "key drop" locations crash the game when dropping their item when Key Drop Shuffle is on. # Replace them with a Slime enemy if they are placed. - if multiworld.key_drop_shuffle[player]: + if world.options.key_drop_shuffle: key_drop_enemies = { 0x4DA20, 0x4DA5C, 0x4DB7F, 0x4DD73, 0x4DDC3, 0x4DE07, 0x4E201, 0x4E20A, 0x4E326, 0x4E4F7, 0x4E687, 0x4E70C, 0x4E7C8, 0x4E7FA @@ -792,8 +791,8 @@ def get_nonnative_item_sprite(code: int) -> int: def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): + local_random = world.worlds[player].random local_world = world.worlds[player] - local_random = local_world.random # patch items @@ -840,14 +839,14 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # patch music music_addresses = dungeon_music_addresses[location.name] - if world.map_shuffle[player]: + if local_world.options.map_shuffle: music = local_random.choice([0x11, 0x16]) else: music = 0x11 if 'Pendant' in location.item.name else 0x16 for music_address in music_addresses: rom.write_byte(music_address, music) - if world.map_shuffle[player]: + if local_world.options.map_shuffle: rom.write_byte(0x155C9, local_random.choice([0x11, 0x16])) # Randomize GT music too with map shuffle # patch entrance/exits/holes @@ -868,15 +867,15 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Thanks to Zarby89 for originally finding these values # todo fix screen scrolling - if world.entrance_shuffle[player] != 'insanity' and \ + if local_world.options.entrance_shuffle != 'insanity' and \ exit.name in {'Eastern Palace Exit', 'Tower of Hera Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Palace of Darkness Exit', 'Swamp Palace Exit', 'Ganons Tower Exit', 'Desert Palace Exit (North)', 'Agahnims Tower Exit', 'Spiral Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)', 'Turtle Rock Ledge Exit (East)'} and \ - (world.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic'] or - exit.name not in {'Palace of Darkness Exit', 'Tower of Hera Exit', 'Swamp Palace Exit'}): - # For exits that connot be reached from another, no need to apply offset fixes. + (local_world.options.glitches_required not in ['hybrid_major_glitches', 'no_logic'] or + exit.name not in {'Palace of Darkness Exit', 'Tower of Hera Exit', 'Swamp Palace Exit'}): + # For exits that cannot be reached from another, no need to apply offset fixes. rom.write_int16(0x15DB5 + 2 * offset, link_y) # same as final else elif room_id == 0x0059 and local_world.fix_skullwoods_exit: rom.write_int16(0x15DB5 + 2 * offset, 0x00F8) @@ -903,7 +902,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): else: # patch door table rom.write_byte(0xDBB73 + exit.addresses, exit.target) - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': patch_shuffled_dark_sanc(world, rom, player) write_custom_shops(rom, world, player) @@ -914,16 +913,16 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): return 0x53 + int(num), 0x79 + int(num) credits_total = 216 - if world.retro_caves[player]: # Old man cave and Take any caves will count towards collection rate. + if local_world.options.retro_caves: # Old man cave and Take any caves will count towards collection rate. credits_total += 5 - if world.shop_item_slots[player]: # Potion shop only counts towards collection rate if included in the shuffle. - credits_total += 30 if world.include_witch_hut[player] else 27 - if world.shuffle_capacity_upgrades[player]: + if local_world.options.shop_item_slots: # Potion shop only counts towards collection rate if included in the shuffle. + credits_total += 30 if local_world.options.include_witch_hut else 27 + if local_world.options.shuffle_capacity_upgrades: credits_total += 2 rom.write_byte(0x187010, credits_total) # dynamic credits - if world.key_drop_shuffle[player]: + if local_world.options.key_drop_shuffle: rom.write_byte(0x140000, 1) # enable key drop shuffle credits_total += len(key_drop_data) # update dungeon counters @@ -977,11 +976,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x51DE, 0x00) # set open mode: - if world.mode[player] in ['open', 'inverted']: + if local_world.options.mode in ['open', 'inverted']: rom.write_byte(0x180032, 0x01) # open mode - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': set_inverted_mode(world, player, rom) - elif world.mode[player] == 'standard': + elif local_world.options.mode == 'standard': rom.write_byte(0x180032, 0x00) # standard mode uncle_location = world.get_location('Link\'s Uncle', player) @@ -1001,7 +1000,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E]) # set light cones - rom.write_byte(0x180038, 0x01 if world.mode[player] == "standard" else 0x00) + rom.write_byte(0x180038, 0x01 if local_world.options.mode == "standard" else 0x00) rom.write_byte(0x180039, 0x01 if world.light_world_light_cone else 0x00) rom.write_byte(0x18003A, 0x01 if world.dark_world_light_cone else 0x00) @@ -1011,7 +1010,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on # handle item_functionality - if world.item_functionality[player] == 'hard': + if local_world.options.item_functionality == 'hard': rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup # Powdered Fairies Prize @@ -1031,7 +1030,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_int16(0x180036, world.rupoor_cost) # Set stun items rom.write_byte(0x180180, 0x02) # Hookshot only - elif world.item_functionality[player] == 'expert': + elif local_world.options.item_functionality == 'expert': rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup # Powdered Fairies Prize @@ -1071,7 +1070,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set stun items rom.write_byte(0x180180, 0x03) # All standard items # Set overflow items for progressive equipment - if world.timer[player] in ['timed', 'timed_countdown', 'timed_ohko']: + if local_world.options.timer in ['timed', 'timed_countdown', 'timed_ohko']: overflow_replacement = GREEN_CLOCK else: overflow_replacement = GREEN_TWENTY_RUPEES @@ -1083,7 +1082,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set overflow items for progressive equipment rom.write_bytes(0x180090, - [difficulty.progressive_sword_limit if not world.swordless[player] else 0, + [difficulty.progressive_sword_limit if not local_world.options.swordless else 0, item_table[difficulty.basicsword[-1]].item_code, difficulty.progressive_shield_limit, item_table[difficulty.basicshield[-1]].item_code, difficulty.progressive_armor_limit, item_table[difficulty.basicarmor[-1]].item_code, @@ -1091,7 +1090,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): difficulty.progressive_bow_limit, item_table[difficulty.basicbow[-1]].item_code]) if difficulty.progressive_bow_limit < 2 and ( - world.swordless[player] or world.glitches_required[player] == 'no_glitches'): + local_world.options.swordless or local_world.options.glitches_required == 'no_glitches'): rom.write_bytes(0x180098, [2, item_table["Silver Bow"].item_code]) rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup @@ -1099,15 +1098,15 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # set up game internal RNG seed rom.write_bytes(0x178000, local_random.getrandbits(8 * 1024).to_bytes(1024, 'big')) prize_replacements = {} - if world.item_functionality[player] in ['hard', 'expert']: + if local_world.options.item_functionality in ['hard', 'expert']: prize_replacements[0xE0] = 0xDF # Fairy -> heart prize_replacements[0xE3] = 0xD8 # Big magic -> small magic - if world.retro_bow[player]: + if local_world.options.retro_bow: prize_replacements[0xE1] = 0xDA # 5 Arrows -> Blue Rupee prize_replacements[0xE2] = 0xDB # 10 Arrows -> Red Rupee - if world.shuffle_prizes[player] in ("general", "both"): + if local_world.options.shuffle_prizes in ("general", "both"): # shuffle prize packs prizes = [0xD8, 0xD8, 0xD8, 0xD8, 0xD9, 0xD8, 0xD8, 0xD9, 0xDA, 0xD9, 0xDA, 0xDB, 0xDA, 0xD9, 0xDA, 0xDA, 0xE0, 0xDF, 0xDF, 0xDA, 0xE0, 0xDF, 0xD8, 0xDF, @@ -1169,7 +1168,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): byte = int(rom.read_byte(address)) rom.write_byte(address, prize_replacements.get(byte, byte)) - if world.shuffle_prizes[player] in ("bonk", "both"): + if local_world.options.shuffle_prizes in ("bonk", "both"): # set bonk prizes bonk_prizes = [0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xAC, 0xE3, 0xE3, 0xDA, 0xE3, 0xDA, 0xD8, 0xAC, 0xAC, 0xE3, 0xD8, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xDC, 0xDB, 0xE3, 0xDA, 0x79, 0x79, @@ -1196,7 +1195,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): 0x12, 0x01, 0x35, 0xFF, # lamp -> 5 rupees 0x51, 0x06, 0x52, 0xFF, # 6 +5 bomb upgrades -> +10 bomb upgrade 0x53, 0x06, 0x54, 0xFF, # 6 +5 arrow upgrades -> +10 arrow upgrade - 0x58, 0x01, 0x36 if world.retro_bow[player] else 0x43, 0xFF, # silver arrows -> single arrow (red 20 in retro mode) + 0x58, 0x01, 0x36 if local_world.options.retro_bow else 0x43, 0xFF, # silver arrows -> single arrow (red 20 in retro mode) 0x3E, difficulty.boss_heart_container_limit, 0x47, 0xff, # boss heart -> green 20 0x17, difficulty.heart_piece_limit, 0x47, 0xff, # piece of heart -> green 20 0xFF, 0xFF, 0xFF, 0xFF, # end of table sentinel @@ -1238,13 +1237,13 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x180029, 0x01) # Smithy quick item give # set swordless mode settings - rom.write_byte(0x18003F, 0x01 if world.swordless[player] else 0x00) # hammer can harm ganon - rom.write_byte(0x180040, 0x01 if world.swordless[player] else 0x00) # open curtains - rom.write_byte(0x180041, 0x01 if world.swordless[player] else 0x00) # swordless medallions - rom.write_byte(0x180043, 0xFF if world.swordless[player] else 0x00) # starting sword for link - rom.write_byte(0x180044, 0x01 if world.swordless[player] else 0x00) # hammer activates tablets + rom.write_byte(0x18003F, 0x01 if local_world.options.swordless else 0x00) # hammer can harm ganon + rom.write_byte(0x180040, 0x01 if local_world.options.swordless else 0x00) # open curtains + rom.write_byte(0x180041, 0x01 if local_world.options.swordless else 0x00) # swordless medallions + rom.write_byte(0x180043, 0xFF if local_world.options.swordless else 0x00) # starting sword for link + rom.write_byte(0x180044, 0x01 if local_world.options.swordless else 0x00) # hammer activates tablets - if world.item_functionality[player] == 'easy': + if local_world.options.item_functionality == 'easy': rom.write_byte(0x18003F, 0x01) # hammer can harm ganon rom.write_byte(0x180041, 0x02) # Allow swordless medallion use EVERYWHERE. rom.write_byte(0x180044, 0x01) # hammer activates tablets @@ -1262,11 +1261,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set up requested clock settings if local_world.clock_mode in ['countdown-ohko', 'stopwatch', 'countdown']: rom.write_int32(0x180200, - world.red_clock_time[player] * 60 * 60) # red clock adjustment time (in frames, sint32) + local_world.options.red_clock_time * 60 * 60) # red clock adjustment time (in frames, sint32) rom.write_int32(0x180204, - world.blue_clock_time[player] * 60 * 60) # blue clock adjustment time (in frames, sint32) + local_world.options.blue_clock_time * 60 * 60) # blue clock adjustment time (in frames, sint32) rom.write_int32(0x180208, - world.green_clock_time[player] * 60 * 60) # green clock adjustment time (in frames, sint32) + local_world.options.green_clock_time * 60 * 60) # green clock adjustment time (in frames, sint32) else: rom.write_int32(0x180200, 0) # red clock adjustment time (in frames, sint32) rom.write_int32(0x180204, 0) # blue clock adjustment time (in frames, sint32) @@ -1274,20 +1273,20 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set up requested start time for countdown modes if local_world.clock_mode in ['countdown-ohko', 'countdown']: - rom.write_int32(0x18020C, world.countdown_start_time[player] * 60 * 60) # starting time (in frames, sint32) + rom.write_int32(0x18020C, local_world.options.countdown_start_time * 60 * 60) # starting time (in frames, sint32) else: rom.write_int32(0x18020C, 0) # starting time (in frames, sint32) # set up goals for treasure hunt rom.write_int16(0x180163, max(0, local_world.treasure_hunt_required - - sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece"))) + sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece"))) rom.write_bytes(0x180165, [0x0E, 0x28]) # Triforce Piece Sprite rom.write_byte(0x180194, 1) # Must turn in triforced pieces (instant win not enabled) rom.write_bytes(0x180213, [0x00, 0x01]) # Not a Tournament Seed gametype = 0x04 # item - if world.entrance_shuffle[player] != 'vanilla': + if local_world.options.entrance_shuffle != 'vanilla': gametype |= 0x02 # entrance if enemized: gametype |= 0x01 # enemizer @@ -1298,7 +1297,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x1800A2, 0x01 if local_world.fix_fake_world else 0x00) # Lock or unlock aga tower door during escape sequence. rom.write_byte(0x180169, 0x00) - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': rom.write_byte(0x180169, 0x02) # lock aga/ganon tower door with crystals in inverted rom.write_byte(0x180171, 0x01 if local_world.ganon_at_pyramid else 0x00) # Enable respawning on pyramid after ganon death @@ -1309,9 +1308,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x50563, [0x3F, 0x14]) # disable below ganon chest rom.write_byte(0x50599, 0x00) # disable below ganon chest rom.write_bytes(0xE9A5, [0x7E, 0x00, 0x24]) # disable below ganon chest - rom.write_byte(0x18008B, 0x01 if world.open_pyramid[player].to_bool(world, player) else 0x00) # pre-open Pyramid Hole - rom.write_byte(0x18008C, 0x01 if world.crystals_needed_for_gt[ - player] == 0 else 0x00) # GT pre-opened if crystal requirement is 0 + rom.write_byte(0x18008B, 0x01 if local_world.options.open_pyramid.to_bool(world, player) else 0x00) # pre-open Pyramid Hole + rom.write_byte(0x18008C, 0x01 if local_world.options.crystals_needed_for_gt == 0 else 0x00) # GT pre-opened if crystal requirement is 0 rom.write_byte(0xF5D73, 0xF0) # bees are catchable rom.write_byte(0xF5F10, 0xF0) # bees are catchable rom.write_byte(0x180086, 0x00 if world.aga_randomness else 0x01) # set blue ball and ganon warp randomness @@ -1325,7 +1323,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): equip[0x36C] = 0x18 equip[0x36D] = 0x18 equip[0x379] = 0x68 - starting_max_bombs = 0 if world.bombless_start[player] else 10 + starting_max_bombs = 0 if local_world.options.bombless_start else 10 starting_max_arrows = 30 startingstate = CollectionState(world) @@ -1333,12 +1331,12 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): if startingstate.has('Silver Bow', player): equip[0x340] = 1 equip[0x38E] |= 0x60 - if not world.retro_bow[player]: + if not local_world.options.retro_bow: equip[0x38E] |= 0x80 elif startingstate.has('Bow', player): equip[0x340] = 1 equip[0x38E] |= 0x20 # progressive flag to get the correct hint in all cases - if not world.retro_bow[player]: + if not local_world.options.retro_bow: equip[0x38E] |= 0x80 if startingstate.has('Silver Arrows', player): equip[0x38E] |= 0x40 @@ -1476,7 +1474,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): elif item.name in bombs: equip[0x343] += bombs[item.name] elif item.name in arrows: - if world.retro_bow[player]: + if local_world.options.retro_bow: equip[0x38E] |= 0x80 equip[0x377] = 1 else: @@ -1502,16 +1500,13 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x183000, equip[0x340:]) rom.write_bytes(0x271A6, equip[0x340:0x340 + 60]) - rom.write_byte(0x18004A, 0x00 if world.mode[player] != 'inverted' else 0x01) # Inverted mode + rom.write_byte(0x18004A, 0x00 if local_world.options.mode != 'inverted' else 0x01) # Inverted mode rom.write_byte(0x18005D, 0x00) # Hammer always breaks barrier - rom.write_byte(0x2AF79, 0xD0 if world.mode[ - player] != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) - rom.write_byte(0x3A943, 0xD0 if world.mode[ - player] != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) - rom.write_byte(0x3A96D, 0xF0 if world.mode[ - player] != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) + rom.write_byte(0x2AF79, 0xD0 if local_world.options.mode != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) + rom.write_byte(0x3A943, 0xD0 if local_world.options.mode != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) + rom.write_byte(0x3A96D, 0xF0 if local_world.options.mode != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) rom.write_byte(0x3A9A7, 0xD0) # Residual Portal: Normal (D0= Light Side, F0=Dark Side, 42 = both (Darth Vader)) - if world.shuffle_capacity_upgrades[player]: + if local_world.options.shuffle_capacity_upgrades: rom.write_bytes(0x180080, [5, 10, 5, 10]) # values to fill for Capacity Upgrades (Bomb5, Bomb10, Arrow5, Arrow10) else: @@ -1522,21 +1517,21 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): (0x02 if 'bombs' in local_world.escape_assist else 0x00) | (0x04 if 'magic' in local_world.escape_assist else 0x00))) # Escape assist - if world.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: + if local_world.options.goal in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: rom.write_byte(0x18003E, 0x01) # make ganon invincible - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif local_world.options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: rom.write_byte(0x18003E, 0x05) # make ganon invincible until enough triforce pieces are collected - elif world.goal[player] in ['ganon_pedestal']: + elif local_world.options.goal in ['ganon_pedestal']: rom.write_byte(0x18003E, 0x06) - elif world.goal[player] in ['bosses']: + elif local_world.options.goal in ['bosses']: rom.write_byte(0x18003E, 0x02) # make ganon invincible until all bosses are beat - elif world.goal[player] in ['crystals']: + elif local_world.options.goal in ['crystals']: rom.write_byte(0x18003E, 0x04) # make ganon invincible until all crystals else: rom.write_byte(0x18003E, 0x03) # make ganon invincible until all crystals and aga 2 are collected - rom.write_byte(0x18005E, world.crystals_needed_for_gt[player]) - rom.write_byte(0x18005F, world.crystals_needed_for_ganon[player]) + rom.write_byte(0x18005E, local_world.options.crystals_needed_for_gt) + rom.write_byte(0x18005F, local_world.options.crystals_needed_for_ganon) # Bitfield - enable text box to show with free roaming items # @@ -1547,21 +1542,20 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # c - enabled for inside compasses # s - enabled for inside small keys # block HC upstairs doors in rain state in standard mode - rom.write_byte(0x18008A, 0x01 if world.mode[player] == "standard" and world.entrance_shuffle[player] != 'vanilla' else 0x00) + rom.write_byte(0x18008A, 0x01 if local_world.options.mode == "standard" and local_world.options.entrance_shuffle != 'vanilla' else 0x00) - rom.write_byte(0x18016A, 0x10 | ((0x01 if world.small_key_shuffle[player] else 0x00) - | (0x02 if world.compass_shuffle[player] else 0x00) - | (0x04 if world.map_shuffle[player] else 0x00) - | (0x08 if world.big_key_shuffle[ - player] else 0x00))) # free roaming item text boxes - rom.write_byte(0x18003B, 0x01 if world.map_shuffle[player] else 0x00) # maps showing crystals on overworld + rom.write_byte(0x18016A, 0x10 | ((0x01 if local_world.options.small_key_shuffle else 0x00) + | (0x02 if local_world.options.compass_shuffle else 0x00) + | (0x04 if local_world.options.map_shuffle else 0x00) + | (0x08 if local_world.options.big_key_shuffle else 0x00))) # free roaming item text boxes + rom.write_byte(0x18003B, 0x01 if local_world.options.map_shuffle else 0x00) # maps showing crystals on overworld # compasses showing dungeon count - if local_world.clock_mode or world.dungeon_counters[player] == 'off': + if local_world.clock_mode or local_world.options.dungeon_counters == 'off': rom.write_byte(0x18003C, 0x00) # Currently must be off if timer is on, because they use same HUD location - elif world.dungeon_counters[player] == 'on': + elif local_world.options.dungeon_counters == 'on': rom.write_byte(0x18003C, 0x02) # always on - elif world.compass_shuffle[player] or world.dungeon_counters[player] == 'pickup': + elif local_world.options.compass_shuffle or local_world.options.dungeon_counters == 'pickup': rom.write_byte(0x18003C, 0x01) # show on pickup else: rom.write_byte(0x18003C, 0x00) @@ -1574,11 +1568,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # b - Big Key # a - Small Key # - rom.write_byte(0x180045, ((0x00 if (world.small_key_shuffle[player] == small_key_shuffle.option_original_dungeon or - world.small_key_shuffle[player] == small_key_shuffle.option_universal) else 0x01) - | (0x02 if world.big_key_shuffle[player] else 0x00) - | (0x04 if world.map_shuffle[player] else 0x00) - | (0x08 if world.compass_shuffle[player] else 0x00))) # free roaming items in menu + rom.write_byte(0x180045, ((0x00 if (local_world.options.small_key_shuffle == small_key_shuffle.option_original_dungeon or + local_world.options.small_key_shuffle == small_key_shuffle.option_universal) else 0x01) + | (0x02 if local_world.options.big_key_shuffle else 0x00) + | (0x04 if local_world.options.map_shuffle else 0x00) + | (0x08 if local_world.options.compass_shuffle else 0x00))) # free roaming items in menu # Map reveals reveal_bytes = { @@ -1604,31 +1598,25 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): return 0x0000 rom.write_int16(0x18017A, - get_reveal_bytes('Green Pendant') if world.map_shuffle[player] else 0x0000) # Sahasrahla reveal - rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if world.map_shuffle[ - player] else 0x0000) # Bomb Shop Reveal + get_reveal_bytes('Green Pendant') if local_world.options.map_shuffle else 0x0000) # Sahasrahla reveal + rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if local_world.options.map_shuffle else 0x0000) # Bomb Shop Reveal - rom.write_byte(0x180172, 0x01 if world.small_key_shuffle[ - player] == small_key_shuffle.option_universal else 0x00) # universal keys - rom.write_byte(0x18637E, 0x01 if world.retro_bow[player] else 0x00) # Skip quiver in item shops once bought - rom.write_byte(0x180175, 0x01 if world.retro_bow[player] else 0x00) # rupee bow - rom.write_byte(0x180176, 0x0A if world.retro_bow[player] else 0x00) # wood arrow cost - rom.write_byte(0x180178, 0x32 if world.retro_bow[player] else 0x00) # silver arrow cost - rom.write_byte(0x301FC, 0xDA if world.retro_bow[player] else 0xE1) # rupees replace arrows under pots - rom.write_byte(0x30052, 0xDB if world.retro_bow[player] else 0xE2) # replace arrows in fish prize from bottle merchant - rom.write_bytes(0xECB4E, [0xA9, 0x00, 0xEA, 0xEA] if world.retro_bow[player] else [0xAF, 0x77, 0xF3, - 0x7E]) # Thief steals rupees instead of arrows - rom.write_bytes(0xF0D96, [0xA9, 0x00, 0xEA, 0xEA] if world.retro_bow[player] else [0xAF, 0x77, 0xF3, - 0x7E]) # Pikit steals rupees instead of arrows - rom.write_bytes(0xEDA5, - [0x35, 0x41] if world.retro_bow[player] else [0x43, 0x44]) # Chest game gives rupees instead of arrows + rom.write_byte(0x180172, 0x01 if local_world.options.small_key_shuffle == small_key_shuffle.option_universal else 0x00) # universal keys + rom.write_byte(0x18637E, 0x01 if local_world.options.retro_bow else 0x00) # Skip quiver in item shops once bought + rom.write_byte(0x180175, 0x01 if local_world.options.retro_bow else 0x00) # rupee bow + rom.write_byte(0x180176, 0x0A if local_world.options.retro_bow else 0x00) # wood arrow cost + rom.write_byte(0x180178, 0x32 if local_world.options.retro_bow else 0x00) # silver arrow cost + rom.write_byte(0x301FC, 0xDA if local_world.options.retro_bow else 0xE1) # rupees replace arrows under pots + rom.write_byte(0x30052, 0xDB if local_world.options.retro_bow else 0xE2) # replace arrows in fish prize from bottle merchant + rom.write_bytes(0xECB4E, [0xA9, 0x00, 0xEA, 0xEA] if local_world.options.retro_bow else [0xAF, 0x77, 0xF3, 0x7E]) # Thief steals rupees instead of arrows + rom.write_bytes(0xF0D96, [0xA9, 0x00, 0xEA, 0xEA] if local_world.options.retro_bow else [0xAF, 0x77, 0xF3, 0x7E]) # Pikit steals rupees instead of arrows + rom.write_bytes(0xEDA5, [0x35, 0x41] if local_world.options.retro_bow else [0x43, 0x44]) # Chest game gives rupees instead of arrows digging_game_rng = local_random.randint(1, 30) # set rng for digging game rom.write_byte(0x180020, digging_game_rng) rom.write_byte(0xEFD95, digging_game_rng) rom.write_byte(0x1800A3, 0x01) # enable correct world setting behaviour after agahnim kills - rom.write_byte(0x1800A4, 0x01 if world.glitches_required[player] != 'no_logic' else 0x00) # enable POD EG fix - rom.write_byte(0x186383, 0x01 if world.glitches_required[ - player] == 'no_logic' else 0x00) # disable glitching to Triforce from Ganons Room + rom.write_byte(0x1800A4, 0x01 if local_world.options.glitches_required != 'no_logic' else 0x00) # enable POD EG fix + rom.write_byte(0x186383, 0x01 if local_world.options.glitches_required == 'no_logic' else 0x00) # disable glitching to Triforce from Ganons Room rom.write_byte(0x180042, 0x01 if world.save_and_quit_from_boss else 0x00) # Allow Save and Quit after boss kill # remove shield from uncle @@ -1645,7 +1633,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x180185, [0, 0, 0]) # Uncle respawn refills (magic, bombs, arrows) rom.write_bytes(0x180188, [0, 0, 0]) # Zelda respawn refills (magic, bombs, arrows) rom.write_bytes(0x18018B, [0, 0, 0]) # Mantle respawn refills (magic, bombs, arrows) - if world.mode[player] == 'standard' and uncle_location.item and uncle_location.item.player == player: + if local_world.options.mode == 'standard' and uncle_location.item and uncle_location.item.player == player: if uncle_location.item.name in {'Bow', 'Progressive Bow'}: rom.write_byte(0x18004E, 1) # Escape Fill (arrows) rom.write_int16(0x180183, 300) # Escape fill rupee bow @@ -1673,8 +1661,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): 0xAD, 0xBF, 0x0A, 0xF0, 0x4F]) # allow smith into multi-entrance caves in appropriate shuffles - if world.entrance_shuffle[player] in ['restricted', 'full', 'crossed', 'insanity'] or ( - world.entrance_shuffle[player] == 'simple' and world.mode[player] == 'inverted'): + if local_world.options.entrance_shuffle in ['restricted', 'full', 'crossed', 'insanity'] or ( + local_world.options.entrance_shuffle == 'simple' and local_world.options.mode == 'inverted'): rom.write_byte(0x18004C, 0x01) # set correct flag for hera basement item @@ -1694,8 +1682,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0xFED31, 0x2A) # bombable exit rom.write_byte(0xFEE41, 0x2A) # bombable exit - if world.tile_shuffle[player]: - tile_set = TileSet.get_random_tile_set(world.per_slot_randoms[player]) + if local_world.options.tile_shuffle: + tile_set = TileSet.get_random_tile_set(world.worlds[player].random) rom.write_byte(0x4BA21, tile_set.get_speed()) rom.write_byte(0x4BA1D, tile_set.get_len()) rom.write_bytes(0x4BA2A, tile_set.get_bytes()) @@ -1770,9 +1758,9 @@ def write_custom_shops(rom, world, player): slot = 0 if shop.type == ShopType.TakeAny else index if item is None: break - if world.shop_item_slots[player] or shop.type == ShopType.TakeAny: - count_shop = (shop.region.name != 'Potion Shop' or world.include_witch_hut[player]) and \ - (shop.region.name != 'Capacity Upgrade' or world.shuffle_capacity_upgrades[player]) + if world.worlds[player].options.shop_item_slots or shop.type == ShopType.TakeAny: + count_shop = (shop.region.name != 'Potion Shop' or world.worlds[player].options.include_witch_hut) and \ + (shop.region.name != 'Capacity Upgrade' or world.worlds[player].options.shuffle_capacity_upgrades) rom.write_byte(0x186560 + shop.sram_offset + slot, 1 if count_shop else 0) if item['item'] == 'Single Arrow' and item['player'] == 0: arrow_mask |= 1 << index @@ -1789,7 +1777,7 @@ def write_custom_shops(rom, world, player): item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']]) else: item_code = item_table[item["item"]].item_code - if item['item'] == 'Single Arrow' and item['player'] == 0 and world.retro_bow[player]: + if item['item'] == 'Single Arrow' and item['player'] == 0 and world.worlds[player].options.retro_bow: rom.write_byte(0x186500 + shop.sram_offset + slot, arrow_mask) item_data = [shop_id, item_code] + price_data + \ @@ -1802,7 +1790,7 @@ def write_custom_shops(rom, world, player): items_data.extend([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) rom.write_bytes(0x184900, items_data) - if world.retro_bow[player]: + if world.worlds[player].options.retro_bow: retro_shop_slots.append(0xFF) rom.write_bytes(0x186540, retro_shop_slots) @@ -2207,19 +2195,18 @@ def write_string_to_rom(rom, target, string): def write_strings(rom, world, player): from . import ALTTPWorld - + local_random = world.worlds[player].random w: ALTTPWorld = world.worlds[player] - local_random = w.random tt = TextTable() tt.removeUnwantedText() # Let's keep this guy's text accurate to the shuffle setting. - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: tt['kakariko_flophouse_man_no_flippers'] = 'I really hate mowing my yard.\n{PAGEBREAK}\nI should move.' tt['kakariko_flophouse_man'] = 'I really hate mowing my yard.\n{PAGEBREAK}\nI should move.' - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': tt['sign_village_of_outcasts'] = 'attention\nferal ducks sighted\nhiding in statues\n\nflute players beware\n' def hint_text(dest, ped_hint=False): @@ -2238,21 +2225,21 @@ def write_strings(rom, world, player): hint += f" for {world.player_name[dest.player]}" return hint - if world.scams[player].gives_king_zora_hint: + if world.worlds[player].options.scams.gives_king_zora_hint: # Zora hint zora_location = world.get_location("King Zora", player) tt['zora_tells_cost'] = f"You got 500 rupees to buy {hint_text(zora_location.item)}" \ f"\n ≥ Duh\n Oh carp\n{{CHOICE}}" - if world.scams[player].gives_bottle_merchant_hint: + if world.worlds[player].options.scams.gives_bottle_merchant_hint: # Bottle Vendor hint vendor_location = world.get_location("Bottle Merchant", player) tt['bottle_vendor_choice'] = f"I gots {hint_text(vendor_location.item)}\nYous gots 100 rupees?" \ f"\n ≥ I want\n no way!\n{{CHOICE}}" # First we write hints about entrances, some from the inconvenient list others from all reasonable entrances. - if world.hints[player]: - if world.hints[player].value >= 2: - if world.hints[player] == "full": + if world.worlds[player].options.hints: + if world.worlds[player].options.hints.value >= 2: + if world.worlds[player].options.hints == "full": tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles have hints!' else: tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!' @@ -2265,11 +2252,11 @@ def write_strings(rom, world, player): entrances_to_hint = {} entrances_to_hint.update(InconvenientDungeonEntrances) if world.shuffle_ganon: - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Ganons Tower': 'The sealed castle door'}) else: entrances_to_hint.update({'Ganons Tower': 'Ganon\'s Tower'}) - if world.entrance_shuffle[player] in ['simple', 'restricted']: + if world.worlds[player].options.entrance_shuffle in ['simple', 'restricted']: for entrance in all_entrances: if entrance.name in entrances_to_hint: this_hint = entrances_to_hint[entrance.name] + ' leads to ' + hint_text( @@ -2279,9 +2266,9 @@ def write_strings(rom, world, player): break # Now we write inconvenient locations for most shuffles and finish taking care of the less chaotic ones. entrances_to_hint.update(InconvenientOtherEntrances) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: hint_count = 0 - elif world.entrance_shuffle[player] in ['simple', 'restricted']: + elif world.worlds[player].options.entrance_shuffle in ['simple', 'restricted']: hint_count = 2 else: hint_count = 4 @@ -2298,31 +2285,31 @@ def write_strings(rom, world, player): # Next we handle hints for randomly selected other entrances, # curating the selection intelligently based on shuffle. - if world.entrance_shuffle[player] not in ['simple', 'restricted']: + if world.worlds[player].options.entrance_shuffle not in ['simple', 'restricted']: entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(DungeonEntrances) - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Agahnims Tower': 'The dark mountain tower'}) else: entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'}) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(OtherEntrances) - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Dark Sanctuary': 'The dark sanctuary cave'}) entrances_to_hint.update({'Inverted Big Bomb Shop': 'The old hero\'s dark home'}) entrances_to_hint.update({'Inverted Links House': 'The old hero\'s light home'}) else: entrances_to_hint.update({'Dark Sanctuary Hint': 'The dark sanctuary cave'}) entrances_to_hint.update({'Big Bomb Shop': 'The old bomb shop'}) - if world.entrance_shuffle[player] != 'insanity': + if world.worlds[player].options.entrance_shuffle != 'insanity': entrances_to_hint.update(InsanityEntrances) if world.shuffle_ganon: - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Pyramid Entrance': 'The extra castle passage'}) else: entrances_to_hint.update({'Pyramid Ledge': 'The pyramid ledge'}) - hint_count = 4 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 4 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 0 for entrance in all_entrances: if entrance.name in entrances_to_hint: @@ -2337,10 +2324,10 @@ def write_strings(rom, world, player): # Next we write a few hints for specific inconvenient locations. We don't make many because in entrance this is highly unpredictable. locations_to_hint = InconvenientLocations.copy() - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: locations_to_hint.extend(InconvenientVanillaLocations) local_random.shuffle(locations_to_hint) - hint_count = 3 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 3 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 5 for location in locations_to_hint[:hint_count]: if location == 'Swamp Left': @@ -2395,15 +2382,15 @@ def write_strings(rom, world, player): # Lastly we write hints to show where certain interesting items are. items_to_hint = RelevantItems.copy() - if world.small_key_shuffle[player].hints_useful: + if world.worlds[player].options.small_key_shuffle.hints_useful: items_to_hint |= item_name_groups["Small Keys"] - if world.big_key_shuffle[player].hints_useful: + if world.worlds[player].options.big_key_shuffle.hints_useful: items_to_hint |= item_name_groups["Big Keys"] - if world.hints[player] == "full": + if world.worlds[player].options.hints == "full": hint_count = len(hint_locations) # fill all remaining hint locations with Item hints. else: - hint_count = 5 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 5 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 8 hint_count = min(hint_count, len(items_to_hint), len(hint_locations)) if hint_count: @@ -2434,7 +2421,7 @@ def write_strings(rom, world, player): tt['ganon_phase_3_no_silvers'] = 'Did you find the silver arrows%s' % silverarrow_hint tt['ganon_phase_3_no_silvers_alt'] = 'Did you find the silver arrows%s' % silverarrow_hint if world.worlds[player].has_progressive_bows and (w.difficulty_requirements.progressive_bow_limit >= 2 or ( - world.swordless[player] or world.glitches_required[player] == 'no_glitches')): + world.worlds[player].options.swordless or world.worlds[player].options.glitches_required == 'no_glitches')): prog_bow_locs = world.find_item_locations('Progressive Bow', player, True) local_random.shuffle(prog_bow_locs) found_bow = False @@ -2458,26 +2445,26 @@ def write_strings(rom, world, player): greenpendant = world.find_item('Green Pendant', player) tt['sahasrahla_bring_courage'] = 'I lost my family heirloom in %s' % greenpendant.hint_text - if world.crystals_needed_for_gt[player] == 1: + if world.worlds[player].options.crystals_needed_for_gt == 1: tt['sign_ganons_tower'] = 'You need a crystal to enter.' else: - tt['sign_ganons_tower'] = f'You need {world.crystals_needed_for_gt[player]} crystals to enter.' + tt['sign_ganons_tower'] = f'You need {world.worlds[player].options.crystals_needed_for_gt} crystals to enter.' - if world.goal[player] == 'bosses': + if world.worlds[player].options.goal == 'bosses': tt['sign_ganon'] = 'You need to kill all bosses, Ganon last.' - elif world.goal[player] == 'ganon_pedestal': + elif world.worlds[player].options.goal == 'ganon_pedestal': tt['sign_ganon'] = 'You need to pull the pedestal to defeat Ganon.' - elif world.goal[player] == "ganon": - if world.crystals_needed_for_ganon[player] == 1: + elif world.worlds[player].options.goal == "ganon": + if world.worlds[player].options.crystals_needed_for_ganon == 1: tt['sign_ganon'] = 'You need a crystal to beat Ganon and have beaten Agahnim atop Ganons Tower.' else: - tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon and ' \ + tt['sign_ganon'] = f'You need {world.worlds[player].options.crystals_needed_for_ganon} crystals to beat Ganon and ' \ f'have beaten Agahnim atop Ganons Tower' else: - if world.crystals_needed_for_ganon[player] == 1: + if world.worlds[player].options.crystals_needed_for_ganon == 1: tt['sign_ganon'] = 'You need a crystal to beat Ganon.' else: - tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon.' + tt['sign_ganon'] = f'You need {world.worlds[player].options.crystals_needed_for_ganon} crystals to beat Ganon.' tt['uncle_leaving_text'] = Uncle_texts[local_random.randint(0, len(Uncle_texts) - 1)] tt['end_triforce'] = "{NOBORDER}\n" + Triforce_texts[local_random.randint(0, len(Triforce_texts) - 1)] @@ -2490,10 +2477,10 @@ def write_strings(rom, world, player): triforce_pieces_required = max(0, w.treasure_hunt_required - sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece")) - if world.goal[player] in ['triforce_hunt', 'local_triforce_hunt']: + if world.worlds[player].options.goal in ['triforce_hunt', 'local_triforce_hunt']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Get the Triforce Pieces.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' - if world.goal[player] == 'triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'Go find the Triforce pieces with your friends... Ganon is invincible!' else: tt['sign_ganon'] = 'Go find the Triforce pieces... Ganon is invincible!' @@ -2507,7 +2494,7 @@ def write_strings(rom, world, player): "invisibility.\n\n\n\n… … …\n\nWait! you can see me? I knew I should have\n" \ "hidden in a hollow tree. If you bring\n%d Triforce piece out of %d, I can reassemble it." % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['pedestal']: + elif world.worlds[player].options.goal in ['pedestal']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Your goal is at the pedestal.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' tt['sign_ganon'] = 'You need to get to the pedestal... Ganon is invincible!' @@ -2516,17 +2503,17 @@ def write_strings(rom, world, player): tt['ganon_fall_in_alt'] = 'You cannot defeat me until you finish your goal!' tt['ganon_phase_3_alt'] = 'Got wax in\nyour ears?\nI can not die!' if triforce_pieces_required > 1: - if world.goal[player] == 'ganon_triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'ganon_triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'You need to find %d Triforce pieces out of %d with your friends to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif world.worlds[player].options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: tt['sign_ganon'] = 'You need to find %d Triforce pieces out of %d to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) else: - if world.goal[player] == 'ganon_triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'ganon_triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'You need to find %d Triforce piece out of %d with your friends to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif world.worlds[player].options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: tt['sign_ganon'] = 'You need to find %d Triforce piece out of %d to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) @@ -2549,11 +2536,11 @@ def write_strings(rom, world, player): tt['tablet_bombos_book'] = bombos_text # inverted spawn menu changes - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n{CHOICE3}" tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n Mountain Cave\n{CHOICE2}" - for at, text, _ in world.plando_texts[player]: + for at, text, _ in world.worlds[player].options.plando_texts: if at not in tt: raise Exception(f"No text target \"{at}\" found.") @@ -2626,12 +2613,12 @@ def set_inverted_mode(world, player, rom): rom.write_byte(snes_to_pc(0x08D40C), 0xD0) # morph proof # the following bytes should only be written in vanilla # or they'll overwrite the randomizer's shuffles - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': rom.write_byte(0xDBB73 + 0x23, 0x37) # switch AT and GT rom.write_byte(0xDBB73 + 0x36, 0x24) rom.write_int16(0x15AEE + 2 * 0x38, 0x00E0) rom.write_int16(0x15AEE + 2 * 0x25, 0x000C) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(0x15B8C, 0x6C) rom.write_byte(0xDBB73 + 0x00, 0x53) # switch bomb shop and links house rom.write_byte(0xDBB73 + 0x52, 0x01) @@ -2689,7 +2676,7 @@ def set_inverted_mode(world, player, rom): rom.write_int16(snes_to_pc(0x02D9A6), 0x005A) rom.write_byte(snes_to_pc(0x02D9B3), 0x12) # keep the old man spawn point at old man house unless shuffle is vanilla - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) rom.write_int16(snes_to_pc(0x02D8DE), 0x00F1) rom.write_bytes(snes_to_pc(0x02D910), [0x1F, 0x1E, 0x1F, 0x1F, 0x03, 0x02, 0x03, 0x03]) @@ -2752,7 +2739,7 @@ def set_inverted_mode(world, player, rom): rom.write_int16s(snes_to_pc(0x1bb836), [0x001B, 0x001B, 0x001B]) rom.write_int16(snes_to_pc(0x308300), 0x0140) # new pyramid hole entrance rom.write_int16(snes_to_pc(0x308320), 0x001B) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(snes_to_pc(0x308340), 0x7B) rom.write_int16(snes_to_pc(0x1af504), 0x148B) rom.write_int16(snes_to_pc(0x1af50c), 0x149B) @@ -2789,10 +2776,10 @@ def set_inverted_mode(world, player, rom): rom.write_bytes(snes_to_pc(0x1BC85A), [0x50, 0x0F, 0x82]) rom.write_int16(0xDB96F + 2 * 0x35, 0x001B) # move pyramid exit door rom.write_int16(0xDBA71 + 2 * 0x35, 0x06A4) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(0xDBB73 + 0x35, 0x36) rom.write_byte(snes_to_pc(0x09D436), 0xF3) # remove castle gate warp - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_int16(0x15AEE + 2 * 0x37, 0x0010) # pyramid exit to new hc area rom.write_byte(0x15B8C + 0x37, 0x1B) rom.write_int16(0x15BDB + 2 * 0x37, 0x0418) diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 3f5081129a..452c15223c 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -27,9 +27,9 @@ from .UnderworldGlitchRules import underworld_glitches_rules def set_rules(world): player = world.player world = world.multiworld - if world.glitches_required[player] == 'no_logic': + if world.worlds[player].options.glitches_required == 'no_logic': if player == next(player_id for player_id in world.get_game_players("A Link to the Past") - if world.glitches_required[player_id] == 'no_logic'): # only warn one time + if world.worlds[player_id].options.glitches_required == 'no_logic'): # only warn one time logging.info( 'WARNING! Seeds generated under this logic often require major glitches and may be impossible!') @@ -40,8 +40,8 @@ def set_rules(world): else: # Set access rules according to max glitches for multiworld progression. # Set accessibility to none, and shuffle assuming the no logic players can always win - world.accessibility[player].value = ItemsAccessibility.option_minimal - world.progression_balancing[player].value = 0 + world.worlds[player].options.accessibility.value = ItemsAccessibility.option_minimal + world.worlds[player].options.progression_balancing.value = 0 else: world.completion_condition[player] = lambda state: state.has('Triforce', player) @@ -49,52 +49,52 @@ def set_rules(world): dungeon_boss_rules(world, player) global_rules(world, player) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': default_rules(world, player) - if world.mode[player] == 'open': + if world.worlds[player].options.mode == 'open': open_rules(world, player) - elif world.mode[player] == 'standard': + elif world.worlds[player].options.mode == 'standard': standard_rules(world, player) - elif world.mode[player] == 'inverted': + elif world.worlds[player].options.mode == 'inverted': open_rules(world, player) inverted_rules(world, player) else: - raise NotImplementedError(f'World state {world.mode[player]} is not implemented yet') + raise NotImplementedError(f'World state {world.worlds[player].options.mode} is not implemented yet') - if world.glitches_required[player] == 'no_glitches': + if world.worlds[player].options.glitches_required == 'no_glitches': no_glitches_rules(world, player) forbid_bomb_jump_requirements(world, player) - elif world.glitches_required[player] == 'overworld_glitches': + elif world.worlds[player].options.glitches_required == 'overworld_glitches': # Initially setting no_glitches_rules to set the baseline rules for some # entrances. The overworld_glitches_rules set is primarily additive. no_glitches_rules(world, player) fake_flipper_rules(world, player) overworld_glitches_rules(world, player) forbid_bomb_jump_requirements(world, player) - elif world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + elif world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: no_glitches_rules(world, player) fake_flipper_rules(world, player) overworld_glitches_rules(world, player) underworld_glitches_rules(world, player) bomb_jump_requirements(world, player) - elif world.glitches_required[player] == 'minor_glitches': + elif world.worlds[player].options.glitches_required == 'minor_glitches': no_glitches_rules(world, player) fake_flipper_rules(world, player) forbid_bomb_jump_requirements(world, player) else: - raise NotImplementedError(f'Not implemented yet: Logic - {world.glitches_required[player]}') + raise NotImplementedError(f'Not implemented yet: Logic - {world.worlds[player].options.glitches_required}') - if world.goal[player] == 'bosses': + if world.worlds[player].options.goal == 'bosses': # require all bosses to beat ganon add_rule(world.get_location('Ganon', player), lambda state: state.can_reach('Master Sword Pedestal', 'Location', player) and state.has('Beat Agahnim 1', player) and state.has('Beat Agahnim 2', player) and has_crystals(state, 7, player)) - elif world.goal[player] == 'ganon': + elif world.worlds[player].options.goal == 'ganon': # require aga2 to beat ganon add_rule(world.get_location('Ganon', player), lambda state: state.has('Beat Agahnim 2', player)) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_big_bomb_rules(world, player) - if world.glitches_required[player].current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.entrance_shuffle[player].current_key not in {'insanity', 'insanity_legacy', 'madness'}: + if world.worlds[player].options.glitches_required.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.worlds[player].options.entrance_shuffle.current_key not in {'insanity', 'insanity_legacy', 'madness'}: path_to_courtyard = mirrorless_path_to_castle_courtyard(world, player) add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.multiworld.get_entrance('Dark Death Mountain Offset Mirror', player).can_reach(state) and all(rule(state) for rule in path_to_courtyard), 'or') else: @@ -102,21 +102,24 @@ def set_rules(world): # if swamp and dam have not been moved we require mirror for swamp palace # however there is mirrorless swamp in hybrid MG, so we don't necessarily want this. HMG handles this requirement itself. - if not world.worlds[player].swamp_patch_required and world.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic']: + if not world.worlds[player].swamp_patch_required and world.worlds[player].options.glitches_required not in ['hybrid_major_glitches', 'no_logic']: add_rule(world.get_entrance('Swamp Palace Moat', player), lambda state: state.has('Magic Mirror', player)) # GT Entrance may be required for Turtle Rock for OWG and < 7 required - ganons_tower = world.get_entrance('Inverted Ganons Tower' if world.mode[player] == 'inverted' else 'Ganons Tower', player) - if world.crystals_needed_for_gt[player] == 7 and not (world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and world.mode[player] != 'inverted'): + ganons_tower = world.get_entrance('Inverted Ganons Tower' if world.worlds[player].options.mode == 'inverted' else 'Ganons Tower', player) + if (world.worlds[player].options.crystals_needed_for_gt == 7 + and not (world.worlds[player].options.glitches_required + in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic'] + and world.worlds[player].options.mode != 'inverted')): set_rule(ganons_tower, lambda state: False) set_trock_key_rules(world, player) - set_rule(ganons_tower, lambda state: has_crystals(state, state.multiworld.crystals_needed_for_gt[player], player)) - if world.mode[player] != 'inverted' and world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + set_rule(ganons_tower, lambda state: has_crystals(state, state.multiworld.worlds[player].options.crystals_needed_for_gt, player)) + if world.worlds[player].options.mode != 'inverted' and world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: add_rule(world.get_entrance('Ganons Tower', player), lambda state: state.multiworld.get_entrance('Ganons Tower Ascent', player).can_reach(state), 'or') - set_bunny_rules(world, player, world.mode[player] == 'inverted') + set_bunny_rules(world, player, world.worlds[player].options.mode == 'inverted') def mirrorless_path_to_castle_courtyard(world, player): @@ -150,17 +153,17 @@ def set_always_allow(spot, rule): def add_lamp_requirement(world: MultiWorld, spot, player: int, has_accessible_torch: bool = False): - if world.dark_room_logic[player] == "lamp": + if world.worlds[player].options.dark_room_logic == "lamp": add_rule(spot, lambda state: state.has('Lamp', player)) - elif world.dark_room_logic[player] == "torches": # implicitly lamp as well + elif world.worlds[player].options.dark_room_logic == "torches": # implicitly lamp as well if has_accessible_torch: add_rule(spot, lambda state: state.has('Lamp', player) or state.has('Fire Rod', player)) else: add_rule(spot, lambda state: state.has('Lamp', player)) - elif world.dark_room_logic[player] == "none": + elif world.worlds[player].options.dark_room_logic == "none": pass else: - raise ValueError(f"Unknown Dark Room Logic: {world.dark_room_logic[player]}") + raise ValueError(f"Unknown Dark Room Logic: {world.worlds[player].options.dark_room_logic}") non_crossover_items = (item_name_groups["Small Keys"] | item_name_groups["Big Keys"] | progression_items) - { @@ -227,12 +230,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Sick Kid', player), lambda state: state.has_group("Bottles", player)) set_rule(multiworld.get_location('Library', player), lambda state: state.has('Pegasus Boots', player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player) and can_kill_most_things(state, player, 4)) else: set_rule(multiworld.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player) - and ((state.multiworld.enemy_health[player] in ("easy", "default") and can_use_bombs(state, player, 4)) + and ((state.multiworld.worlds[player].options.enemy_health in ("easy", "default") + and can_use_bombs(state, player, 4)) or can_shoot_arrows(state, player) or state.has("Cane of Somaria", player) or has_beam_sword(state, player))) @@ -299,8 +303,7 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Sewers Door', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4) or ( - multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal and multiworld.mode[ - player] == 'standard')) # standard universal small keys cannot access the shop + world.options.small_key_shuffle == small_key_shuffle.option_universal and world.options.mode == 'standard')) # standard universal small keys cannot access the shop set_rule(multiworld.get_entrance('Sewers Back Door', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4)) set_rule(multiworld.get_entrance('Sewers Secret Room', player), lambda state: can_bomb_or_bonk(state, player)) @@ -339,12 +342,12 @@ def global_rules(multiworld: MultiWorld, player: int): add_rule(ep_prize, lambda state: state.has('Big Key (Eastern Palace)', player) and state._lttp_has_key('Small Key (Eastern Palace)', player, 2) and ep_prize.parent_region.dungeon.boss.can_defeat(state)) - if not multiworld.enemy_shuffle[player]: + if not world.options.enemy_shuffle: add_rule(ep_boss, lambda state: can_shoot_arrows(state, player)) add_rule(ep_prize, lambda state: can_shoot_arrows(state, player)) # You can always kill the Stalfos' with the pots on easy/normal - if multiworld.enemy_health[player] in ("hard", "expert") or multiworld.enemy_shuffle[player]: + if world.options.enemy_health in ("hard", "expert") or world.options.enemy_shuffle: stalfos_rule = lambda state: can_kill_most_things(state, player, 4) for location in ['Eastern Palace - Compass Chest', 'Eastern Palace - Big Chest', 'Eastern Palace - Dark Square Pot Key', 'Eastern Palace - Dark Eyegore Key Drop', @@ -362,14 +365,14 @@ def global_rules(multiworld: MultiWorld, player: int): add_rule(multiworld.get_location('Desert Palace - Boss', player), lambda state: state._lttp_has_key('Small Key (Desert Palace)', player, 4) and state.has('Big Key (Desert Palace)', player) and has_fire_source(state, player) and state.multiworld.get_location('Desert Palace - Boss', player).parent_region.dungeon.boss.can_defeat(state)) # logic patch to prevent placing a crystal in Desert that's required to reach the required keys - if not (multiworld.small_key_shuffle[player] and multiworld.big_key_shuffle[player]): + if not (world.options.small_key_shuffle and world.options.big_key_shuffle): add_rule(multiworld.get_location('Desert Palace - Prize', player), lambda state: state.multiworld.get_region('Desert Palace Main (Outer)', player).can_reach(state)) set_rule(multiworld.get_location('Tower of Hera - Basement Cage', player), lambda state: can_activate_crystal_switch(state, player)) set_rule(multiworld.get_location('Tower of Hera - Map Chest', player), lambda state: can_activate_crystal_switch(state, player)) set_rule(multiworld.get_entrance('Tower of Hera Small Key Door', player), lambda state: can_activate_crystal_switch(state, player) and (state._lttp_has_key('Small Key (Tower of Hera)', player) or location_item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player))) set_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_activate_crystal_switch(state, player) and state.has('Big Key (Tower of Hera)', player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: add_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_kill_most_things(state, player, 3)) else: add_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), @@ -378,7 +381,7 @@ def global_rules(multiworld: MultiWorld, player: int): or state.has("Cane of Somaria", player))) set_rule(multiworld.get_location('Tower of Hera - Big Chest', player), lambda state: state.has('Big Key (Tower of Hera)', player)) set_rule(multiworld.get_location('Tower of Hera - Big Key Chest', player), lambda state: has_fire_source(state, player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Tower of Hera - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Tower of Hera)' and item.player == player) set_rule(multiworld.get_entrance('Swamp Palace Moat', player), lambda state: state.has('Flippers', player) and state.has('Open Floodgate', player)) @@ -387,32 +390,32 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Swamp Palace - Trench 1 Pot Key', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 2)) set_rule(multiworld.get_entrance('Swamp Palace (Center)', player), lambda state: state.has('Hammer', player) and state._lttp_has_key('Small Key (Swamp Palace)', player, 3)) set_rule(multiworld.get_location('Swamp Palace - Hookshot Pot Key', player), lambda state: state.has('Hookshot', player)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # it could move the key to the top right platform which can only be reached with bombs add_rule(multiworld.get_location('Swamp Palace - Hookshot Pot Key', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Swamp Palace (West)', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6) if state.has('Hookshot', player) else state._lttp_has_key('Small Key (Swamp Palace)', player, 4)) set_rule(multiworld.get_location('Swamp Palace - Big Chest', player), lambda state: state.has('Big Key (Swamp Palace)', player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': allow_self_locking_items(multiworld.get_location('Swamp Palace - Big Chest', player), 'Big Key (Swamp Palace)') set_rule(multiworld.get_entrance('Swamp Palace (North)', player), lambda state: state.has('Hookshot', player) and state._lttp_has_key('Small Key (Swamp Palace)', player, 5)) - if not multiworld.small_key_shuffle[player] and multiworld.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic']: + if not world.options.small_key_shuffle and world.options.glitches_required not in ['hybrid_major_glitches', 'no_logic']: forbid_item(multiworld.get_location('Swamp Palace - Entrance', player), 'Big Key (Swamp Palace)', player) add_rule(multiworld.get_location('Swamp Palace - Prize', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6)) add_rule(multiworld.get_location('Swamp Palace - Boss', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # key can (and probably will) be moved behind bombable wall set_rule(multiworld.get_location('Swamp Palace - Waterway Pot Key', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Thieves Town Big Key Door', player), lambda state: state.has('Big Key (Thieves Town)', player)) - if multiworld.worlds[player].dungeons["Thieves Town"].boss.enemizer_name == "Blind": + if world.dungeons["Thieves Town"].boss.enemizer_name == "Blind": set_rule(multiworld.get_entrance('Blind Fight', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player, 3) and can_use_bombs(state, player)) set_rule(multiworld.get_location('Thieves\' Town - Big Chest', player), lambda state: ((state._lttp_has_key('Small Key (Thieves Town)', player, 3)) or (location_item_name(state, 'Thieves\' Town - Big Chest', player) == ("Small Key (Thieves Town)", player)) and state._lttp_has_key('Small Key (Thieves Town)', player, 2)) and state.has('Hammer', player)) set_rule(multiworld.get_location('Thieves\' Town - Blind\'s Cell', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player)) - if multiworld.accessibility[player] != 'full' and not multiworld.key_drop_shuffle[player]: + if world.options.accessibility != 'full' and not world.options.key_drop_shuffle: set_always_allow(multiworld.get_location('Thieves\' Town - Big Chest', player), lambda state, item: item.name == 'Small Key (Thieves Town)' and item.player == player) set_rule(multiworld.get_location('Thieves\' Town - Attic', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player, 3)) set_rule(multiworld.get_location('Thieves\' Town - Spike Switch Pot Key', player), @@ -424,7 +427,7 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Skull Woods First Section West Door', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) set_rule(multiworld.get_entrance('Skull Woods First Section (Left) Door to Exit', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) set_rule(multiworld.get_location('Skull Woods - Big Chest', player), lambda state: state.has('Big Key (Skull Woods)', player) and can_use_bombs(state, player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': allow_self_locking_items(multiworld.get_location('Skull Woods - Big Chest', player), 'Big Key (Skull Woods)') set_rule(multiworld.get_entrance('Skull Woods Torch Room', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 4) and state.has('Fire Rod', player) and has_sword(state, player)) # sword required for curtain add_rule(multiworld.get_location('Skull Woods - Prize', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) @@ -501,13 +504,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Turtle Rock (Trinexx)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6) and state.has('Big Key (Turtle Rock)', player) and state.has('Cane of Somaria', player)) set_rule(multiworld.get_entrance('Turtle Rock Second Section Bomb Wall', player), lambda state: can_kill_most_things(state, player, 10)) - if not multiworld.worlds[player].fix_trock_doors: + if not world.fix_trock_doors: add_rule(multiworld.get_entrance('Turtle Rock Second Section Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Second Section from Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Eye Bridge from Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Eye Bridge Bomb Wall', player), lambda state: can_use_bombs(state, player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_entrance('Palace of Darkness Bonk Wall', player), lambda state: can_bomb_or_bonk(state, player) and can_kill_most_things(state, player, 3)) else: set_rule(multiworld.get_entrance('Palace of Darkness Bonk Wall', player), lambda state: can_bomb_or_bonk(state, player) and can_shoot_arrows(state, player)) @@ -517,18 +520,18 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Palace of Darkness (North)', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 4)) set_rule(multiworld.get_location('Palace of Darkness - Big Chest', player), lambda state: can_use_bombs(state, player) and state.has('Big Key (Palace of Darkness)', player)) set_rule(multiworld.get_location('Palace of Darkness - The Arena - Ledge', player), lambda state: can_use_bombs(state, player)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # chest switch may be up on ledge where bombs are required set_rule(multiworld.get_location('Palace of Darkness - Stalfos Basement', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Palace of Darkness Big Key Chest Staircase', player), lambda state: can_use_bombs(state, player) and (state._lttp_has_key('Small Key (Palace of Darkness)', player, 6) or ( location_item_name(state, 'Palace of Darkness - Big Key Chest', player) in [('Small Key (Palace of Darkness)', player)] and state._lttp_has_key('Small Key (Palace of Darkness)', player, 3)))) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Palace of Darkness - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Palace of Darkness)' and item.player == player and state._lttp_has_key('Small Key (Palace of Darkness)', player, 5)) set_rule(multiworld.get_entrance('Palace of Darkness Spike Statue Room Door', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 6) or ( location_item_name(state, 'Palace of Darkness - Harmless Hellway', player) in [('Small Key (Palace of Darkness)', player)] and state._lttp_has_key('Small Key (Palace of Darkness)', player, 4))) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Palace of Darkness - Harmless Hellway', player), lambda state, item: item.name == 'Small Key (Palace of Darkness)' and item.player == player and state._lttp_has_key('Small Key (Palace of Darkness)', player, 5)) set_rule(multiworld.get_entrance('Palace of Darkness Maze Door', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 6)) @@ -541,13 +544,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has('Pegasus Boots', player)) set_rule(multiworld.get_entrance('Ganons Tower (Tile Room)', player), lambda state: state.has('Cane of Somaria', player)) set_rule(multiworld.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: set_rule(multiworld.get_location('Ganons Tower - Conveyor Cross Pot Key', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) set_rule(multiworld.get_entrance('Ganons Tower (Map Room)', player), lambda state: state._lttp_has_key('Small Key (Ganons Tower)', player, 8) or ( location_item_name(state, 'Ganons Tower - Map Chest', player) in [('Big Key (Ganons Tower)', player)] and state._lttp_has_key('Small Key (Ganons Tower)', player, 6))) # this seemed to be causing generation failure, disable for now - # if world.accessibility[player] != 'full': + # if world.worlds[player].options.accessibility != 'full': # set_always_allow(world.get_location('Ganons Tower - Map Chest', player), lambda state, item: item.name == 'Small Key (Ganons Tower)' and item.player == player and state._lttp_has_key('Small Key (Ganons Tower)', player, 7) and state.can_reach('Ganons Tower (Hookshot Room)', 'region', player)) # It is possible to need more than 6 keys to get through this entrance if you spend keys elsewhere. We reflect this in the chest requirements. @@ -582,7 +585,7 @@ def global_rules(multiworld: MultiWorld, player: int): lambda state: can_use_bombs(state, player) and state.multiworld.get_location('Ganons Tower - Big Key Chest', player).parent_region.dungeon.bosses['bottom'].can_defeat(state)) set_rule(multiworld.get_location('Ganons Tower - Big Key Room - Right', player), lambda state: can_use_bombs(state, player) and state.multiworld.get_location('Ganons Tower - Big Key Room - Right', player).parent_region.dungeon.bosses['bottom'].can_defeat(state)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_entrance('Ganons Tower Big Key Door', player), lambda state: state.has('Big Key (Ganons Tower)', player)) else: @@ -600,12 +603,12 @@ def global_rules(multiworld: MultiWorld, player: int): set_defeat_dungeon_boss_rule(multiworld.get_location('Agahnim 2', player)) ganon = multiworld.get_location('Ganon', player) set_rule(ganon, lambda state: GanonDefeatRule(state, player)) - if multiworld.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + if world.options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: add_rule(ganon, lambda state: has_triforce_pieces(state, player)) - elif multiworld.goal[player] == 'ganon_pedestal': + elif world.options.goal == 'ganon_pedestal': add_rule(multiworld.get_location('Ganon', player), lambda state: state.can_reach('Master Sword Pedestal', 'Location', player)) else: - add_rule(ganon, lambda state: has_crystals(state, state.multiworld.crystals_needed_for_ganon[player], player)) + add_rule(ganon, lambda state: has_crystals(state, state.multiworld.worlds[player].options.crystals_needed_for_ganon, player)) set_rule(multiworld.get_entrance('Ganon Drop', player), lambda state: has_beam_sword(state, player)) # need to damage ganon to get tiles to drop set_rule(multiworld.get_location('Flute Activation Spot', player), lambda state: state.has('Flute', player)) @@ -722,9 +725,9 @@ def default_rules(world, player): set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has('Magic Mirror', player)) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Moon Pearl', player) and has_sword(state, player) and has_turtle_rock_medallion(state, player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword required to cast magic (!) - set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player].to_bool(world, player)) + set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.worlds[player].options.open_pyramid.to_bool(world, player)) - if world.swordless[player]: + if world.worlds[player].options.swordless: swordless_rules(world, player) @@ -879,14 +882,14 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Dark Grassy Lawn Flute', player), lambda state: state.has('Activated Flute', player)) set_rule(world.get_entrance('Hammer Peg Area Flute', player), lambda state: state.has('Activated Flute', player)) - set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) + set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.worlds[player].options.open_pyramid) - if world.swordless[player]: + if world.worlds[player].options.swordless: swordless_rules(world, player) def no_glitches_rules(world, player): """""" - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': set_rule(world.get_entrance('Zoras River', player), lambda state: state.has('Moon Pearl', player) and (state.has('Flippers', player) or can_lift_rocks(state, player))) set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has('Moon Pearl', player) and state.has('Flippers', player)) # can be fake flippered to set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has('Moon Pearl', player) and state.has('Flippers', player)) # can be fake flippered to @@ -910,7 +913,7 @@ def no_glitches_rules(world, player): add_conditional_lamps(world, player) def fake_flipper_rules(world, player): - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': set_rule(world.get_entrance('Zoras River', player), lambda state: state.has('Moon Pearl', player)) set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has('Moon Pearl', player)) set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has('Moon Pearl', player)) @@ -996,7 +999,7 @@ def add_conditional_lamps(world, player): 'Location', True) add_conditional_lamp('Palace of Darkness - Dark Basement - Right', 'Palace of Darkness (Entrance)', 'Location', True) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': add_conditional_lamp('Agahnim 1', 'Agahnims Tower', 'Entrance') add_conditional_lamp('Castle Tower - Dark Maze', 'Agahnims Tower') add_conditional_lamp('Castle Tower - Dark Archer Key Drop', 'Agahnims Tower') @@ -1018,7 +1021,7 @@ def add_conditional_lamps(world, player): add_conditional_lamp('Eastern Palace - Boss', 'Eastern Palace', 'Location', True) add_conditional_lamp('Eastern Palace - Prize', 'Eastern Palace', 'Location', True) - if not world.mode[player] == "standard": + if not world.worlds[player].options.mode == "standard": add_lamp_requirement(world, world.get_location('Sewers - Dark Cross', player), player) add_lamp_requirement(world, world.get_entrance('Sewers Back Door', player), player) add_lamp_requirement(world, world.get_entrance('Throne Room', player), player) @@ -1044,7 +1047,7 @@ def open_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4) and state.has('Big Key (Hyrule Castle)', player) - and (world.enemy_health[player] in ("easy", "default") + and (world.worlds[player].options.enemy_health in ("easy", "default") or can_kill_most_things(state, player, 1))) @@ -1058,7 +1061,7 @@ def swordless_rules(world, player): set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has('Hammer', player)) # need to damage ganon to get tiles to drop - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Moon Pearl', player) and has_turtle_rock_medallion(state, player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has('Moon Pearl', player) and has_misery_mire_medallion(state, player)) # sword not required to use medallion for opening in swordless (!) @@ -1084,7 +1087,7 @@ def standard_rules(world, player): set_rule(world.get_entrance('Links House S&Q', player), lambda state: state.can_reach('Sanctuary', 'Region', player)) set_rule(world.get_entrance('Sanctuary S&Q', player), lambda state: state.can_reach('Sanctuary', 'Region', player)) - if world.small_key_shuffle[player] != small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle != small_key_shuffle.option_universal: set_rule(world.get_location('Hyrule Castle - Boomerang Guard Key Drop', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 1) and can_kill_most_things(state, player, 2)) @@ -1097,7 +1100,7 @@ def standard_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 2) and state.has('Big Key (Hyrule Castle)', player) - and (world.enemy_health[player] in ("easy", "default") + and (world.worlds[player].options.enemy_health in ("easy", "default") or can_kill_most_things(state, player, 1))) set_rule(world.get_location('Sewers - Key Rat Key Drop', player), @@ -1195,15 +1198,15 @@ def set_trock_key_rules(multiworld, player): return 6 # If TR is only accessible from the middle, the big key must be further restricted to prevent softlock potential - if not can_reach_front and not multiworld.small_key_shuffle[player]: + if not can_reach_front and not multiworld.worlds[player].options.small_key_shuffle: # Must not go in the Big Key Chest - only 1 other chest available and 2+ keys required for all other chests forbid_item(multiworld.get_location('Turtle Rock - Big Key Chest', player), 'Big Key (Turtle Rock)', player) if not can_reach_big_chest: # Must not go in the Chain Chomps chest - only 2 other chests available and 3+ keys required for all other chests forbid_item(multiworld.get_location('Turtle Rock - Chain Chomps', player), 'Big Key (Turtle Rock)', player) forbid_item(multiworld.get_location('Turtle Rock - Pokey 2 Key Drop', player), 'Big Key (Turtle Rock)', player) - if multiworld.accessibility[player] == 'full': - if multiworld.big_key_shuffle[player] and can_reach_big_chest: + if multiworld.worlds[player].options.accessibility == 'full': + if multiworld.worlds[player].options.big_key_shuffle and can_reach_big_chest: # Must not go in the dungeon - all 3 available chests (Chomps, Big Chest, Crystaroller) must be keys to access laser bridge, and the big key is required first for location in ['Turtle Rock - Chain Chomps', 'Turtle Rock - Compass Chest', 'Turtle Rock - Pokey 1 Key Drop', 'Turtle Rock - Pokey 2 Key Drop', @@ -1216,9 +1219,9 @@ def set_trock_key_rules(multiworld, player): location.place_locked_item(item) toss_junk_item(multiworld, player) - if multiworld.accessibility[player] != 'full': + if multiworld.worlds[player].options.accessibility != 'full': set_always_allow(multiworld.get_location('Turtle Rock - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Turtle Rock)' and item.player == player - and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) + and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) def set_big_bomb_rules(world, player): @@ -1683,7 +1686,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): def get_rule_to_add(region, location = None, connecting_entrance = None): # In OWG, a location can potentially be superbunny-mirror accessible or # bunny revival accessible. - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic']: if region.name == 'Swamp Palace (Entrance)': # Need to 0hp revive - not in logic return lambda state: state.has('Moon Pearl', player) if region.name == 'Tower of Hera (Bottom)': # Need to hit the crystal switch @@ -1723,7 +1726,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): seen.add(new_region) if not is_link(new_region): # For glitch rulesets, establish superbunny and revival rules. - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name not in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name not in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): if region.name in OverworldGlitchRules.get_sword_required_superbunny_mirror_regions(): possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has('Magic Mirror', player) and has_sword(state, player)) elif (region.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_regions() @@ -1760,7 +1763,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): # Add requirements for all locations that are actually in the dark world, except those available to the bunny, including dungeon revival for entrance in world.get_entrances(player): if is_bunny(entrance.connected_region): - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] : + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] : if entrance.connected_region.type == LTTPRegionType.Dungeon: if entrance.parent_region.type != LTTPRegionType.Dungeon and entrance.connected_region.name in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance)) @@ -1768,7 +1771,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): if entrance.connected_region.name == 'Turtle Rock (Entrance)': add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance)) for location in entrance.connected_region.locations: - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances(): + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances(): continue if location.name in bunny_accessible_locations: continue diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index 055eb2da93..bb3945f5b0 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -168,7 +168,7 @@ def push_shop_inventories(multiworld): for location in shop_slots: item_name = location.item.name # Retro Bow arrows will already have been pushed - if (not multiworld.retro_bow[location.player]) or ((item_name, location.item.player) + if (not multiworld.worlds[location.player].options.retro_bow) or ((item_name, location.item.player) != ("Single Arrow", location.player)): location.shop.push_inventory(location.shop_slot, item_name, round(location.shop_price * get_price_modifier(location.item)), @@ -185,36 +185,36 @@ def push_shop_inventories(multiworld): def create_shops(multiworld, player: int): from .Options import RandomizeShopInventories player_shop_table = shop_table.copy() - if multiworld.include_witch_hut[player]: + if multiworld.worlds[player].options.include_witch_hut: player_shop_table["Potion Shop"] = player_shop_table["Potion Shop"]._replace(locked=False) dynamic_shop_slots = total_dynamic_shop_slots + 3 else: dynamic_shop_slots = total_dynamic_shop_slots - if multiworld.shuffle_capacity_upgrades[player]: + if multiworld.worlds[player].options.shuffle_capacity_upgrades: player_shop_table["Capacity Upgrade"] = player_shop_table["Capacity Upgrade"]._replace(locked=False) - num_slots = min(dynamic_shop_slots, multiworld.shop_item_slots[player]) + num_slots = min(dynamic_shop_slots, multiworld.worlds[player].options.shop_item_slots) single_purchase_slots: List[bool] = [True] * num_slots + [False] * (dynamic_shop_slots - num_slots) multiworld.random.shuffle(single_purchase_slots) - if multiworld.randomize_shop_inventories[player]: + if multiworld.worlds[player].options.randomize_shop_inventories: default_shop_table = [i for l in [shop_generation_types[x] for x in ['arrows', 'bombs', 'potions', 'shields', 'bottle'] if - not multiworld.retro_bow[player] or x != 'arrows'] for i in l] + not multiworld.worlds[player].options.retro_bow or x != 'arrows'] for i in l] new_basic_shop = multiworld.random.sample(default_shop_table, k=3) new_dark_shop = multiworld.random.sample(default_shop_table, k=3) for name, shop in player_shop_table.items(): typ, shop_id, keeper, custom, locked, items, sram_offset = shop if not locked: new_items = multiworld.random.sample(default_shop_table, k=len(items)) - if multiworld.randomize_shop_inventories[player] == RandomizeShopInventories.option_randomize_by_shop_type: + if multiworld.worlds[player].options.randomize_shop_inventories == RandomizeShopInventories.option_randomize_by_shop_type: if items == _basic_shop_defaults: new_items = new_basic_shop elif items == _dark_world_shop_defaults: new_items = new_dark_shop keeper = multiworld.random.choice([0xA0, 0xC1, 0xFF]) player_shop_table[name] = ShopData(typ, shop_id, keeper, custom, locked, new_items, sram_offset) - if multiworld.mode[player] == "inverted": + if multiworld.worlds[player].options.mode == "inverted": # make sure that blue potion is available in inverted, special case locked = None; lock when done. player_shop_table["Dark Lake Hylia Shop"] = \ player_shop_table["Dark Lake Hylia Shop"]._replace(items=_inverted_hylia_shop_defaults, locked=None) @@ -237,7 +237,7 @@ def create_shops(multiworld, player: int): add_rule(loc, lambda state, spot=loc: shop_price_rules(state, player, spot)) loc.shop = shop loc.shop_slot = index - if ((not (multiworld.shuffle_capacity_upgrades[player] and type == ShopType.UpgradeShop)) + if ((not (multiworld.worlds[player].options.shuffle_capacity_upgrades and type == ShopType.UpgradeShop)) and not single_purchase_slots.pop()): loc.shop_slot_disabled = True loc.locked = True @@ -309,18 +309,18 @@ def set_up_shops(multiworld, player: int): from .Options import small_key_shuffle # TODO: move hard+ mode changes for shields here, utilizing the new shops - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: rss = multiworld.get_region('Red Shield Shop', player).shop replacement_items = [['Red Potion', 150], ['Green Potion', 75], ['Blue Potion', 200], ['Bombs (10)', 50], ['Blue Shield', 50], ['Small Heart', 10]] # Can't just replace the single arrow with 10 arrows as retro doesn't need them. - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: replacement_items.append(['Small Key (Universal)', 100]) replacement_item = multiworld.random.choice(replacement_items) rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1]) rss.locked = True - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal or multiworld.retro_bow[player]: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal or multiworld.worlds[player].options.retro_bow: for shop in multiworld.random.sample([s for s in multiworld.shops if s.custom and not s.locked and s.type == ShopType.Shop and s.region.player == player], 5): @@ -328,19 +328,19 @@ def set_up_shops(multiworld, player: int): slots = [0, 1, 2] multiworld.random.shuffle(slots) slots = iter(slots) - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: shop.add_inventory(next(slots), 'Small Key (Universal)', 100) - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: shop.push_inventory(next(slots), 'Single Arrow', 80) - if multiworld.shuffle_capacity_upgrades[player]: + if multiworld.worlds[player].options.shuffle_capacity_upgrades: for shop in multiworld.shops: if shop.type == ShopType.UpgradeShop and shop.region.player == player and \ shop.region.name == "Capacity Upgrade": shop.clear_inventory() - if (multiworld.shuffle_shop_inventories[player] or multiworld.randomize_shop_prices[player] - or multiworld.randomize_cost_types[player]): + if (multiworld.worlds[player].options.shuffle_shop_inventories or multiworld.worlds[player].options.randomize_shop_prices + or multiworld.worlds[player].options.randomize_cost_types): shops = [] total_inventory = [] for shop in multiworld.shops: @@ -352,7 +352,7 @@ def set_up_shops(multiworld, player: int): for item in total_inventory: item["price_type"], item["price"] = get_price(multiworld, item, player) - if multiworld.shuffle_shop_inventories[player]: + if multiworld.worlds[player].options.shuffle_shop_inventories: multiworld.random.shuffle(total_inventory) i = 0 @@ -434,39 +434,39 @@ def get_price(multiworld, item, player: int, price_type=None): price_types = [price_type] else: price_types = [ShopPriceType.Rupees] # included as a chance to not change price - if multiworld.randomize_cost_types[player]: + if multiworld.worlds[player].options.randomize_cost_types: price_types += [ ShopPriceType.Hearts, ShopPriceType.Bombs, ShopPriceType.Magic, ] - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: if item and item["item"] == "Small Key (Universal)": price_types = [ShopPriceType.Rupees, ShopPriceType.Magic] # no logical requirements for repeatable keys else: price_types.append(ShopPriceType.Keys) - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: if item and item["item"] == "Single Arrow": price_types = [ShopPriceType.Rupees, ShopPriceType.Magic] # no logical requirements for arrows else: price_types.append(ShopPriceType.Arrows) - diff = multiworld.item_pool[player].value + diff = multiworld.worlds[player].options.item_pool.value if item: # This is for a shop's regular inventory, the item is already determined, and we will decide the price here price = item["price"] - if multiworld.randomize_shop_prices[player]: + if multiworld.worlds[player].options.randomize_shop_prices: adjust = 2 if price < 100 else 5 - price = int((price / adjust) * (0.5 + multiworld.per_slot_randoms[player].random() * 1.5)) * adjust - multiworld.per_slot_randoms[player].shuffle(price_types) + price = int((price / adjust) * (0.5 + multiworld.worlds[player].random.random() * 1.5)) * adjust + multiworld.worlds[player].random.shuffle(price_types) for p_type in price_types: if any(x in item['item'] for x in price_blacklist[p_type]): continue return p_type, price_chart[p_type](price, diff) else: # This is an AP location and the price will be adjusted after an item is shuffled into it - p_type = multiworld.per_slot_randoms[player].choice(price_types) - return p_type, price_chart[p_type](min(int(multiworld.per_slot_randoms[player].randint(8, 56) - * multiworld.shop_price_modifier[player] / 100) * 5, 9999), diff) + p_type = multiworld.worlds[player].random.choice(price_types) + return p_type, price_chart[p_type](min(int(multiworld.worlds[player].random.randint(8, 56) + * multiworld.worlds[player].options.shop_price_modifier / 100) * 5, 9999), diff) def shop_price_rules(state: CollectionState, player: int, location: ALttPLocation): diff --git a/worlds/alttp/StateHelpers.py b/worlds/alttp/StateHelpers.py index 8661632b83..6ac3c4b8f8 100644 --- a/worlds/alttp/StateHelpers.py +++ b/worlds/alttp/StateHelpers.py @@ -6,7 +6,7 @@ def is_not_bunny(state: CollectionState, region: LTTPRegion, player: int) -> boo if state.has('Moon Pearl', player): return True - return region.is_light_world if state.multiworld.mode[player] != 'inverted' else region.is_dark_world + return region.is_light_world if state.multiworld.worlds[player].options.mode != 'inverted' else region.is_dark_world def can_bomb_clip(state: CollectionState, region: LTTPRegion, player: int) -> bool: @@ -24,7 +24,7 @@ def can_buy(state: CollectionState, item: str, player: int) -> bool: def can_shoot_arrows(state: CollectionState, player: int, count: int = 0) -> bool: - if state.multiworld.retro_bow[player]: + if state.multiworld.worlds[player].options.retro_bow: return (state.has('Bow', player) or state.has('Silver Bow', player)) and can_buy(state, 'Single Arrow', player) return (state.has('Bow', player) or state.has('Silver Bow', player)) and can_hold_arrows(state, player, count) @@ -74,9 +74,9 @@ def can_extend_magic(state: CollectionState, player: int, smallmagic: int = 16, elif state.has('Magic Upgrade (1/2)', player): basemagic = 16 if can_buy_unlimited(state, 'Green Potion', player) or can_buy_unlimited(state, 'Blue Potion', player): - if state.multiworld.item_functionality[player] == 'hard' and not fullrefill: + if state.multiworld.worlds[player].options.item_functionality == 'hard' and not fullrefill: basemagic = basemagic + int(basemagic * 0.5 * bottle_count(state, player)) - elif state.multiworld.item_functionality[player] == 'expert' and not fullrefill: + elif state.multiworld.worlds[player].options.item_functionality == 'expert' and not fullrefill: basemagic = basemagic + int(basemagic * 0.25 * bottle_count(state, player)) else: basemagic = basemagic + basemagic * bottle_count(state, player) @@ -99,12 +99,12 @@ def can_hold_arrows(state: CollectionState, player: int, quantity: int): def can_use_bombs(state: CollectionState, player: int, quantity: int = 1) -> bool: - bombs = 0 if state.multiworld.bombless_start[player] else 10 + bombs = 0 if state.multiworld.worlds[player].options.bombless_start else 10 bombs += ((state.count("Bomb Upgrade (+5)", player) * 5) + (state.count("Bomb Upgrade (+10)", player) * 10) + (state.count("Bomb Upgrade (50)", player) * 50)) # Bomb Upgrade (+5) beyond the 6th gives +10 bombs += max(0, ((state.count("Bomb Upgrade (+5)", player) - 6) * 10)) - if (not state.multiworld.shuffle_capacity_upgrades[player]) and state.has("Capacity Upgrade Shop", player): + if (not state.multiworld.worlds[player].options.shuffle_capacity_upgrades) and state.has("Capacity Upgrade Shop", player): bombs += 40 return bombs >= min(quantity, 50) @@ -120,7 +120,7 @@ def can_activate_crystal_switch(state: CollectionState, player: int) -> bool: def can_kill_most_things(state: CollectionState, player: int, enemies: int = 5) -> bool: - if state.multiworld.enemy_shuffle[player]: + if state.multiworld.worlds[player].options.enemy_shuffle: # I don't fully understand Enemizer's logic for placing enemies in spots where they need to be killable, if any. # Just go with maximal requirements for now. return (has_melee_weapon(state, player) @@ -135,7 +135,7 @@ def can_kill_most_things(state: CollectionState, player: int, enemies: int = 5) or (state.has('Cane of Byrna', player) and (enemies < 6 or can_extend_magic(state, player))) or can_shoot_arrows(state, player) or state.has('Fire Rod', player) - or (state.multiworld.enemy_health[player] in ("easy", "default") + or (state.multiworld.worlds[player].options.enemy_health in ("easy", "default") and can_use_bombs(state, player, enemies * 4))) @@ -152,7 +152,7 @@ def can_get_good_bee(state: CollectionState, player: int) -> bool: def can_retrieve_tablet(state: CollectionState, player: int) -> bool: return state.has('Book of Mudora', player) and (has_beam_sword(state, player) or - (state.multiworld.swordless[player] and + (state.multiworld.worlds[player].options.swordless and state.has("Hammer", player))) @@ -179,7 +179,7 @@ def has_fire_source(state: CollectionState, player: int) -> bool: def can_melt_things(state: CollectionState, player: int) -> bool: return state.has('Fire Rod', player) or \ (state.has('Bombos', player) and - (state.multiworld.swordless[player] or + (state.multiworld.worlds[player].options.swordless or has_sword(state, player))) @@ -192,19 +192,19 @@ def has_turtle_rock_medallion(state: CollectionState, player: int) -> bool: def can_boots_clip_lw(state: CollectionState, player: int) -> bool: - if state.multiworld.mode[player] == 'inverted': + if state.multiworld.worlds[player].options.mode == 'inverted': return state.has('Pegasus Boots', player) and state.has('Moon Pearl', player) return state.has('Pegasus Boots', player) def can_boots_clip_dw(state: CollectionState, player: int) -> bool: - if state.multiworld.mode[player] != 'inverted': + if state.multiworld.worlds[player].options.mode != 'inverted': return state.has('Pegasus Boots', player) and state.has('Moon Pearl', player) return state.has('Pegasus Boots', player) def can_get_glitched_speed_dw(state: CollectionState, player: int) -> bool: rules = [state.has('Pegasus Boots', player), any([state.has('Hookshot', player), has_sword(state, player)])] - if state.multiworld.mode[player] != 'inverted': + if state.multiworld.worlds[player].options.mode != 'inverted': rules.append(state.has('Moon Pearl', player)) return all(rules) diff --git a/worlds/alttp/UnderworldGlitchRules.py b/worlds/alttp/UnderworldGlitchRules.py index 2b18f67ed9..25511f320d 100644 --- a/worlds/alttp/UnderworldGlitchRules.py +++ b/worlds/alttp/UnderworldGlitchRules.py @@ -59,7 +59,7 @@ def dungeon_reentry_rules(world, player, clip: LTTPEntrance, dungeon_region: str # since the clip links directly to the exterior region. -def underworld_glitches_rules(world, player): +def underworld_glitches_rules(world, player): # Ice Palace Entrance Clip # This is the easiest one since it's a simple internal clip. # Need to also add melting to freezor chest since it's otherwise assumed. @@ -88,12 +88,12 @@ def underworld_glitches_rules(world, player): # We need to be able to s+q to old man, then go to either Mire or Hera at either Hera or GT. # First we require a certain type of entrance shuffle, then build the rule from its pieces. if not world.worlds[player].swamp_patch_required: - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rule_map = { 'Misery Mire (Entrance)': (lambda state: True), 'Tower of Hera (Bottom)': (lambda state: state.can_reach('Tower of Hera Big Key Door', 'Entrance', player)) } - inverted = world.mode[player] == 'inverted' + inverted = world.worlds[player].options.mode == 'inverted' hera_rule = lambda state: (state.has('Moon Pearl', player) or not inverted) and \ rule_map.get(world.get_entrance('Tower of Hera', player).connected_region.name, lambda state: False)(state) gt_rule = lambda state: (state.has('Moon Pearl', player) or inverted) and \ diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 4a026f109b..1934138afa 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -313,74 +313,62 @@ class ALTTPWorld(World): break def generate_early(self): - # write old options - import dataclasses - is_first = self.player == min(self.multiworld.get_game_players(self.game)) - - for field in dataclasses.fields(self.options_dataclass): - if is_first: - setattr(self.multiworld, field.name, {}) - getattr(self.multiworld, field.name)[self.player] = getattr(self.options, field.name) - # end of old options re-establisher - - player = self.player multiworld = self.multiworld - self.fix_trock_doors = (multiworld.entrance_shuffle[player] != 'vanilla' - or multiworld.mode[player] == 'inverted') - self.fix_skullwoods_exit = multiworld.entrance_shuffle[player] not in ['vanilla', 'simple', 'restricted', - 'dungeons_simple'] - self.fix_palaceofdarkness_exit = multiworld.entrance_shuffle[player] not in ['dungeons_simple', 'vanilla', - 'simple', 'restricted'] - self.fix_trock_exit = multiworld.entrance_shuffle[player] not in ['vanilla', 'simple', 'restricted', - 'dungeons_simple'] + self.fix_trock_doors = (self.options.entrance_shuffle != 'vanilla' or self.options.mode == 'inverted') + self.fix_skullwoods_exit = self.options.entrance_shuffle not in ['vanilla', 'simple', 'restricted', 'dungeons_simple'] + self.fix_palaceofdarkness_exit = self.options.entrance_shuffle not in ['dungeons_simple', 'vanilla', 'simple', 'restricted'] + self.fix_trock_exit = self.options.entrance_shuffle not in ['vanilla', 'simple', 'restricted', 'dungeons_simple'] # fairy bottle fills bottle_options = [ "Bottle (Red Potion)", "Bottle (Green Potion)", "Bottle (Blue Potion)", "Bottle (Bee)", "Bottle (Good Bee)" ] - if multiworld.item_pool[player] not in ["hard", "expert"]: + if self.options.item_pool not in ["hard", "expert"]: bottle_options.append("Bottle (Fairy)") self.waterfall_fairy_bottle_fill = self.random.choice(bottle_options) self.pyramid_fairy_bottle_fill = self.random.choice(bottle_options) - if multiworld.mode[player] == 'standard': - if multiworld.small_key_shuffle[player]: - if (multiworld.small_key_shuffle[player] not in - (small_key_shuffle.option_universal, small_key_shuffle.option_own_dungeons, - small_key_shuffle.option_start_with)): + if self.options.mode == 'standard': + if self.options.small_key_shuffle: + if (self.options.small_key_shuffle not in + (small_key_shuffle.option_universal, small_key_shuffle.option_own_dungeons, + small_key_shuffle.option_start_with)): self.multiworld.local_early_items[self.player]["Small Key (Hyrule Castle)"] = 1 - self.multiworld.local_items[self.player].value.add("Small Key (Hyrule Castle)") - self.multiworld.non_local_items[self.player].value.discard("Small Key (Hyrule Castle)") - if multiworld.big_key_shuffle[player]: - self.multiworld.local_items[self.player].value.add("Big Key (Hyrule Castle)") - self.multiworld.non_local_items[self.player].value.discard("Big Key (Hyrule Castle)") + self.options.local_items.value.add("Small Key (Hyrule Castle)") + self.options.non_local_items.value.discard("Small Key (Hyrule Castle)") + if self.options.big_key_shuffle: + self.options.local_items.value.add("Big Key (Hyrule Castle)") + self.options.non_local_items.value.discard("Big Key (Hyrule Castle)") # system for sharing ER layouts self.er_seed = str(multiworld.random.randint(0, 2 ** 64)) - if multiworld.entrance_shuffle[player] != "vanilla" and multiworld.entrance_shuffle_seed[player] != "random": - shuffle = multiworld.entrance_shuffle[player].current_key + if self.options.entrance_shuffle != "vanilla" and self.options.entrance_shuffle_seed != "random": + shuffle = self.options.entrance_shuffle.current_key if shuffle == "vanilla": self.er_seed = "vanilla" - elif (not multiworld.entrance_shuffle_seed[player].value.isdigit()) or multiworld.is_race: + elif (not self.options.entrance_shuffle_seed.value.isdigit()) or multiworld.is_race: self.er_seed = get_same_seed(multiworld, ( - shuffle, multiworld.entrance_shuffle_seed[player].value, multiworld.retro_caves[player], multiworld.mode[player], - multiworld.glitches_required[player])) + shuffle, self.options.entrance_shuffle_seed.value, + self.options.retro_caves, + self.options.mode, + self.options.glitches_required + )) else: # not a race or group seed, use set seed as is. - self.er_seed = int(multiworld.entrance_shuffle_seed[player].value) - elif multiworld.entrance_shuffle[player] == "vanilla": + self.er_seed = int(self.options.entrance_shuffle_seed.value) + elif self.options.entrance_shuffle == "vanilla": self.er_seed = "vanilla" for dungeon_item in ["small_key_shuffle", "big_key_shuffle", "compass_shuffle", "map_shuffle"]: - option = getattr(multiworld, dungeon_item)[player] + option = getattr(self.options, dungeon_item) if option == "own_world": - multiworld.local_items[player].value |= self.item_name_groups[option.item_name_group] + self.options.local_items.value |= self.item_name_groups[option.item_name_group] elif option == "different_world": - multiworld.non_local_items[player].value |= self.item_name_groups[option.item_name_group] - if multiworld.mode[player] == "standard": - multiworld.non_local_items[player].value -= {"Small Key (Hyrule Castle)"} + self.options.non_local_items.value |= self.item_name_groups[option.item_name_group] + if self.options.mode == "standard": + self.options.non_local_items.value -= {"Small Key (Hyrule Castle)"} elif option.in_dungeon: self.dungeon_local_item_names |= self.item_name_groups[option.item_name_group] if option == "original_dungeon": @@ -388,15 +376,15 @@ class ALTTPWorld(World): else: self.options.local_items.value |= self.dungeon_local_item_names - self.difficulty_requirements = difficulties[multiworld.item_pool[player].current_key] + self.difficulty_requirements = difficulties[self.options.item_pool.current_key] # enforce pre-defined local items. - if multiworld.goal[player] in ["local_triforce_hunt", "local_ganon_triforce_hunt"]: - multiworld.local_items[player].value.add('Triforce Piece') + if self.options.goal in ["local_triforce_hunt", "local_ganon_triforce_hunt"]: + self.options.local_items.value.add('Triforce Piece') # Not possible to place crystals outside boss prizes yet (might as well make it consistent with pendants too). - multiworld.non_local_items[player].value -= item_name_groups['Pendants'] - multiworld.non_local_items[player].value -= item_name_groups['Crystals'] + self.options.non_local_items.value -= item_name_groups['Pendants'] + self.options.non_local_items.value -= item_name_groups['Crystals'] create_dungeons = create_dungeons @@ -404,15 +392,15 @@ class ALTTPWorld(World): player = self.player multiworld = self.multiworld - if multiworld.mode[player] != 'inverted': + if self.options.mode != 'inverted': create_regions(multiworld, player) else: create_inverted_regions(multiworld, player) create_shops(multiworld, player) self.create_dungeons() - if (multiworld.glitches_required[player] not in ["no_glitches", "minor_glitches"] and - multiworld.entrance_shuffle[player] in [ + if (self.options.glitches_required not in ["no_glitches", "minor_glitches"] and + self.options.entrance_shuffle in [ "vanilla", "dungeons_simple", "dungeons_full", "simple", "restricted", "full"]): self.fix_fake_world = False @@ -420,7 +408,7 @@ class ALTTPWorld(World): old_random = multiworld.random multiworld.random = random.Random(self.er_seed) - if multiworld.mode[player] != 'inverted': + if self.options.mode != 'inverted': link_entrances(multiworld, player) mark_light_world_regions(multiworld, player) else: @@ -505,8 +493,9 @@ class ALTTPWorld(World): if state.has('Silver Bow', item.player): return elif state.has('Bow', item.player) and (self.difficulty_requirements.progressive_bow_limit >= 2 - or self.multiworld.glitches_required[self.player] == 'no_glitches' - or self.multiworld.swordless[self.player]): # modes where silver bow is always required for ganon + or self.options.glitches_required == 'no_glitches' + or self.options.swordless): + # modes where silver bow is always required for ganon return 'Silver Bow' elif self.difficulty_requirements.progressive_bow_limit >= 1: return 'Bow' @@ -549,9 +538,9 @@ class ALTTPWorld(World): break else: raise FillError('Unable to place dungeon prizes') - if world.mode[player] == 'standard' and world.small_key_shuffle[player] \ - and world.small_key_shuffle[player] != small_key_shuffle.option_universal and \ - world.small_key_shuffle[player] != small_key_shuffle.option_own_dungeons: + if self.options.mode == 'standard' and self.options.small_key_shuffle \ + and self.options.small_key_shuffle != small_key_shuffle.option_universal and \ + self.options.small_key_shuffle != small_key_shuffle.option_own_dungeons: world.local_early_items[player]["Small Key (Hyrule Castle)"] = 1 @classmethod @@ -592,27 +581,27 @@ class ALTTPWorld(World): multiworld.spoiler.hashes[player] = get_hash_string(rom.hash) palettes_options = { - 'dungeon': multiworld.uw_palettes[player], - 'overworld': multiworld.ow_palettes[player], - 'hud': multiworld.hud_palettes[player], - 'sword': multiworld.sword_palettes[player], - 'shield': multiworld.shield_palettes[player], + 'dungeon': self.options.uw_palettes, + 'overworld': self.options.ow_palettes, + 'hud': self.options.hud_palettes, + 'sword': self.options.sword_palettes, + 'shield': self.options.shield_palettes, # 'link': world.link_palettes[player] } palettes_options = {key: option.current_key for key, option in palettes_options.items()} - apply_rom_settings(rom, multiworld.heartbeep[player].current_key, - multiworld.heartcolor[player].current_key, - multiworld.quickswap[player], - multiworld.menuspeed[player].current_key, - multiworld.music[player], + apply_rom_settings(rom, self.options.heartbeep.current_key, + self.options.heartcolor.current_key, + self.options.quickswap, + self.options.menuspeed.current_key, + self.options.music, multiworld.sprite[player], None, palettes_options, multiworld, player, True, - reduceflashing=multiworld.reduceflashing[player] or multiworld.is_race, - triforcehud=multiworld.triforcehud[player].current_key, - deathlink=multiworld.death_link[player], - allowcollect=multiworld.allow_collect[player]) + reduceflashing=self.options.reduceflashing or multiworld.is_race, + triforcehud=self.options.triforcehud.current_key, + deathlink=self.options.death_link, + allowcollect=self.options.allow_collect) rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) @@ -629,7 +618,7 @@ class ALTTPWorld(World): @classmethod def stage_extend_hint_information(cls, world, hint_data: typing.Dict[int, typing.Dict[int, str]]): er_hint_data = {player: {} for player in world.get_game_players("A Link to the Past") if - world.entrance_shuffle[player] != "vanilla" or world.retro_caves[player]} + world.worlds[player].options.entrance_shuffle != "vanilla" or world.worlds[player].options.retro_caves} for region in world.regions: if region.player in er_hint_data and region.locations: @@ -745,7 +734,7 @@ class ALTTPWorld(World): f" {self.pyramid_fairy_bottle_fill}") spoiler_handle.write(f"\nWaterfall Fairy ({player_name}):" f" {self.waterfall_fairy_bottle_fill}") - if self.multiworld.boss_shuffle[self.player] != "none": + if self.options.boss_shuffle != "none": def create_boss_map() -> typing.Dict: boss_map = { "Eastern Palace": self.dungeons["Eastern Palace"].boss.name, @@ -762,7 +751,7 @@ class ALTTPWorld(World): "Ganons Tower": "Agahnim 2", "Ganon": "Ganon" } - if self.multiworld.mode[self.player] != 'inverted': + if self.options.mode != 'inverted': boss_map.update({ "Ganons Tower Basement": self.dungeons["Ganons Tower"].bosses["bottom"].name, @@ -847,7 +836,7 @@ class ALTTPWorld(World): "triforce_pieces_available", "triforce_pieces_extra", ] - slot_data = {option_name: getattr(self.multiworld, option_name)[self.player].value for option_name in slot_options} + slot_data = {option_name: getattr(self.options, option_name).value for option_name in slot_options} slot_data.update({ 'mm_medalion': self.required_medallions[0], @@ -868,8 +857,8 @@ def get_same_seed(world, seed_def: tuple) -> str: class ALttPLogic(LogicMixin): def _lttp_has_key(self, item, player, count: int = 1): - if self.multiworld.glitches_required[player] == 'no_logic': + if self.multiworld.worlds[player].options.glitches_required == 'no_logic': return True - if self.multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if self.multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: return can_buy_unlimited(self, 'Small Key (Universal)', player) return self.prog_items[player][item] >= count diff --git a/worlds/alttp/test/dungeons/TestDungeon.py b/worlds/alttp/test/dungeons/TestDungeon.py index 5ab1b23065..c06955a122 100644 --- a/worlds/alttp/test/dungeons/TestDungeon.py +++ b/worlds/alttp/test/dungeons/TestDungeon.py @@ -14,8 +14,8 @@ class TestDungeon(LTTPTestBase): self.starting_regions = [] # Where to start exploring self.remove_exits = [] # Block dungeon exits self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 create_regions(self.multiworld, 1) self.multiworld.worlds[1].create_dungeons() create_shops(self.multiworld, 1) diff --git a/worlds/alttp/test/inverted/TestInverted.py b/worlds/alttp/test/inverted/TestInverted.py index a0a654991b..3c86b6ba0a 100644 --- a/worlds/alttp/test/inverted/TestInverted.py +++ b/worlds/alttp/test/inverted/TestInverted.py @@ -14,9 +14,9 @@ class TestInverted(TestBase, LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.mode[1].value = 2 - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() create_shops(self.multiworld, 1) diff --git a/worlds/alttp/test/inverted/TestInvertedBombRules.py b/worlds/alttp/test/inverted/TestInvertedBombRules.py index a33beca7a9..ab73d91108 100644 --- a/worlds/alttp/test/inverted/TestInvertedBombRules.py +++ b/worlds/alttp/test/inverted/TestInvertedBombRules.py @@ -12,7 +12,7 @@ class TestInvertedBombRules(LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.mode[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 create_inverted_regions(self.multiworld, 1) self.multiworld.worlds[1].create_dungeons() diff --git a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py index bf25c5c9a1..972b617a29 100644 --- a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py +++ b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py @@ -14,10 +14,10 @@ from worlds.alttp.test import LTTPTestBase class TestInvertedMinor(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.mode[1].value = 2 - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("minor_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("minor_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() diff --git a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py index 1de22b95e5..4be51f6298 100644 --- a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py +++ b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py @@ -14,10 +14,10 @@ from worlds.alttp.test import LTTPTestBase class TestInvertedOWG(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("overworld_glitches") - self.multiworld.mode[1].value = 2 - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("overworld_glitches") + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() diff --git a/worlds/alttp/test/minor_glitches/TestMinor.py b/worlds/alttp/test/minor_glitches/TestMinor.py index 7663c20a29..d5ffe8cac5 100644 --- a/worlds/alttp/test/minor_glitches/TestMinor.py +++ b/worlds/alttp/test/minor_glitches/TestMinor.py @@ -11,9 +11,9 @@ from worlds.alttp.test import LTTPTestBase class TestMinor(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("minor_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("minor_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] self.world.er_seed = 0 self.world.create_regions() diff --git a/worlds/alttp/test/options/TestOpenPyramid.py b/worlds/alttp/test/options/TestOpenPyramid.py index c7912c43d7..5769b337fb 100644 --- a/worlds/alttp/test/options/TestOpenPyramid.py +++ b/worlds/alttp/test/options/TestOpenPyramid.py @@ -23,7 +23,7 @@ class GoalPyramidTest(PyramidTestBase): } def testCrystalsGoalAccess(self): - self.multiworld.goal[1].value = 1 # crystals + self.multiworld.worlds[1].options.goal.value = 1 # crystals self.assertFalse(self.can_reach_entrance("Pyramid Hole")) self.collect_by_name(["Hammer", "Progressive Glove", "Moon Pearl"]) self.assertTrue(self.can_reach_entrance("Pyramid Hole")) diff --git a/worlds/alttp/test/owg/TestVanillaOWG.py b/worlds/alttp/test/owg/TestVanillaOWG.py index e51970bc50..6b6db1454b 100644 --- a/worlds/alttp/test/owg/TestVanillaOWG.py +++ b/worlds/alttp/test/owg/TestVanillaOWG.py @@ -12,9 +12,9 @@ class TestVanillaOWG(TestBase, LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("overworld_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("overworld_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].er_seed = 0 self.multiworld.worlds[1].create_regions() self.multiworld.worlds[1].create_items() diff --git a/worlds/alttp/test/vanilla/TestVanilla.py b/worlds/alttp/test/vanilla/TestVanilla.py index 9b5db7b122..031aec1ff9 100644 --- a/worlds/alttp/test/vanilla/TestVanilla.py +++ b/worlds/alttp/test/vanilla/TestVanilla.py @@ -10,10 +10,10 @@ from worlds.alttp.test import LTTPTestBase class TestVanilla(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("no_glitches") + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("no_glitches") self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].er_seed = 0 self.multiworld.worlds[1].create_regions() self.multiworld.worlds[1].create_items() From 5088b02bfee5cf2950fac2cd03982a70abc03cb9 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Apr 2025 08:42:20 -0500 Subject: [PATCH 044/199] Unittests: fix world unittests with unittest module (#4895) --- test/worlds/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/worlds/__init__.py b/test/worlds/__init__.py index cf396111bf..4bc017511c 100644 --- a/test/worlds/__init__.py +++ b/test/worlds/__init__.py @@ -12,7 +12,7 @@ def load_tests(loader, standard_tests, pattern): all_tests = [ test_case for folder in folders if os.path.exists(folder) for test_collection in loader.discover(folder, top_level_dir=file_path) - for test_suite in test_collection + for test_suite in test_collection if isinstance(test_suite, unittest.suite.TestSuite) for test_case in test_suite ] From e090153d932a772ac3da43ee044fe6df117a61d8 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 19 Apr 2025 15:44:55 +0200 Subject: [PATCH 045/199] LttP: fix generation if other games are involved (#4901) --- worlds/alttp/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index f69e6bb955..99cc78e2d9 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -850,9 +850,9 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x155C9, local_random.choice([0x11, 0x16])) # Randomize GT music too with map shuffle # patch entrance/exits/holes - for region in world.regions: + for region in world.get_regions(player): for exit in region.exits: - if exit.target is not None and exit.player == player: + if exit.target is not None: if isinstance(exit.addresses, tuple): offset = exit.target room_id, ow_area, vram_loc, scroll_y, scroll_x, link_y, link_x, camera_y, camera_x, unknown_1, unknown_2, door_1, door_2 = exit.addresses From efe2b7c539b56fc0bccae75ea5e79f645ddbc240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 19 Apr 2025 11:55:02 -0400 Subject: [PATCH 046/199] Core: Support default value with cache_self1 (#4667) * add cache_self1_default and tests * merge the two decorators * just change the defaults of the wrap lol * add test for default and default --- Utils.py | 2 ++ test/utils/test_caches.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Utils.py b/Utils.py index 202b8da178..e4e94a45f6 100644 --- a/Utils.py +++ b/Utils.py @@ -114,6 +114,8 @@ def cache_self1(function: typing.Callable[[S, T], RetType]) -> typing.Callable[[ cache[arg] = res return res + wrap.__defaults__ = function.__defaults__ + return wrap diff --git a/test/utils/test_caches.py b/test/utils/test_caches.py index fc681611f0..b6db75c960 100644 --- a/test/utils/test_caches.py +++ b/test/utils/test_caches.py @@ -35,6 +35,19 @@ class TestCacheSelf1(unittest.TestCase): self.assertFalse(o1.func(1) is o1.func(2)) self.assertFalse(o1.func(1) is o2.func(1)) + def test_cache_default(self) -> None: + class Cls: + @cache_self1 + def func(self, _: Any = 1) -> object: + return object() + + o1 = Cls() + o2 = Cls() + self.assertIs(o1.func(), o1.func()) + self.assertIs(o1.func(1), o1.func()) + self.assertIsNot(o1.func(2), o1.func()) + self.assertIsNot(o1.func(), o2.func()) + def test_gc(self) -> None: # verify that we don't keep a global reference import gc From f8579337480a7e92b6b2a53c47e6445a9d4ad410 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Sat, 19 Apr 2025 17:27:03 -0400 Subject: [PATCH 047/199] Launcher: Add search box (#4863) * Add fuzzy search box to Launcher. * move func bind to the kv and prefer substring matching (#79) * move the func bind to the kv * prefer substr matching * Remove fuzzy results, rely on substring only. * Use early return instead of else. * Add type hint to filter_clients_by_type. * Activate search on keyboard input. * Clear search box when filtering by type. * Update Launcher.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --------- Co-authored-by: Aaron Wagener Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- Launcher.py | 31 +++++++++++++++++++++++++++++-- data/launcher.kv | 32 ++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/Launcher.py b/Launcher.py index 29bd71764e..713c0cd318 100644 --- a/Launcher.py +++ b/Launcher.py @@ -230,10 +230,11 @@ def run_gui(path: str, args: Any) -> None: from kivy.properties import ObjectProperty from kivy.core.window import Window from kivy.metrics import dp - from kivymd.uix.button import MDIconButton + from kivymd.uix.button import MDIconButton, MDButton from kivymd.uix.card import MDCard from kivymd.uix.menu import MDDropdownMenu from kivymd.uix.snackbar import MDSnackbar, MDSnackbarText + from kivymd.uix.textfield import MDTextField from kivy.lang.builder import Builder @@ -253,6 +254,7 @@ def run_gui(path: str, args: Any) -> None: navigation: MDGridLayout = ObjectProperty(None) grid: MDGridLayout = ObjectProperty(None) button_layout: ScrollBox = ObjectProperty(None) + search_box: MDTextField = ObjectProperty(None) cards: list[LauncherCard] current_filter: Sequence[str | Type] | None @@ -338,14 +340,29 @@ def run_gui(path: str, args: Any) -> None: scroll_percent = self.button_layout.convert_distance_to_scroll(0, top) self.button_layout.scroll_y = max(0, min(1, scroll_percent[1])) - def filter_clients(self, caller): + def filter_clients_by_type(self, caller: MDButton): self._refresh_components(caller.type) + self.search_box.text = "" + + def filter_clients_by_name(self, caller: MDTextField, name: str) -> None: + if len(name) == 0: + self._refresh_components(self.current_filter) + return + + sub_matches = [ + card for card in self.cards + if name.lower() in card.component.display_name.lower() and card.component.type != Type.HIDDEN + ] + self.button_layout.layout.clear_widgets() + for card in sub_matches: + self.button_layout.layout.add_widget(card) def build(self): self.top_screen = Builder.load_file(Utils.local_path("data/launcher.kv")) self.grid = self.top_screen.ids.grid self.navigation = self.top_screen.ids.navigation self.button_layout = self.top_screen.ids.button_layout + self.search_box = self.top_screen.ids.search_box self.set_colors() self.top_screen.md_bg_color = self.theme_cls.backgroundColor @@ -353,6 +370,7 @@ def run_gui(path: str, args: Any) -> None: refresh_components = self._refresh_components Window.bind(on_drop_file=self._on_drop_file) + Window.bind(on_keyboard=self._on_keyboard) for component in components: self.cards.append(self.build_card(component)) @@ -389,6 +407,15 @@ def run_gui(path: str, args: Any) -> None: else: logging.warning(f"unable to identify component for {file}") + def _on_keyboard(self, window: Window, key: int, scancode: int, codepoint: str, modifier: list[str]): + # Activate search as soon as we start typing, no matter if we are focused on the search box or not. + # Focus first, then capture the first character we type, otherwise it gets swallowed and lost. + # Limit text input to ASCII non-control characters (space bar to tilde). + if not self.search_box.focus: + self.search_box.focus = True + if key in range(32, 126): + self.search_box.text += codepoint + def _stop(self, *largs): # ran into what appears to be https://groups.google.com/g/kivy-users/c/saWDLoYCSZ4 with PyCharm. # Closing the window explicitly cleans it up. diff --git a/data/launcher.kv b/data/launcher.kv index 8c6a8288e4..1cb4e84ab5 100644 --- a/data/launcher.kv +++ b/data/launcher.kv @@ -80,7 +80,7 @@ MDFloatLayout: id: all style: "text" type: (Type.CLIENT, Type.TOOL, Type.ADJUSTER, Type.MISC) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "asterisk" @@ -90,7 +90,7 @@ MDFloatLayout: id: client style: "text" type: (Type.CLIENT, ) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "controller" @@ -100,7 +100,7 @@ MDFloatLayout: id: Tool style: "text" type: (Type.TOOL, ) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "desktop-classic" @@ -110,7 +110,7 @@ MDFloatLayout: id: adjuster style: "text" type: (Type.ADJUSTER, ) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "wrench" @@ -120,7 +120,7 @@ MDFloatLayout: id: misc style: "text" type: (Type.MISC, ) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "dots-horizontal-circle-outline" @@ -131,7 +131,7 @@ MDFloatLayout: id: favorites style: "text" type: ("favorites", ) - on_release: app.filter_clients(self) + on_release: app.filter_clients_by_type(self) MDButtonIcon: icon: "star" @@ -141,5 +141,21 @@ MDFloatLayout: MDNavigationDrawerDivider: - ScrollBox: - id: button_layout \ No newline at end of file + MDGridLayout: + id: main_layout + cols: 1 + spacing: "10dp" + + MDTextField: + id: search_box + mode: "outlined" + set_text: app.filter_clients_by_name + + MDTextFieldLeadingIcon: + icon: "magnify" + + MDTextFieldHintText: + text: "Search" + + ScrollBox: + id: button_layout From 20651df307c9cfc059ebe48b56d78cd21fd3cfcf Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Apr 2025 18:21:11 -0500 Subject: [PATCH 048/199] kvui: fix kwargs on ResizableTextField and ImageButton (#4903) --- kvui.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kvui.py b/kvui.py index 9a8b7109fa..d0d965c30b 100644 --- a/kvui.py +++ b/kvui.py @@ -98,7 +98,7 @@ class ThemedApp(MDApp): class ImageIcon(MDButtonIcon, AsyncImage): def __init__(self, *args, **kwargs): - super().__init__(args, kwargs) + super().__init__(*args, **kwargs) self.image = ApAsyncImage(**kwargs) self.add_widget(self.image) @@ -183,15 +183,17 @@ class ResizableTextField(MDTextField): height_rule = subclass.properties.get("height", None) if height_rule: height_rule.ignore_prev = True - super().__init__(args, kwargs) + super().__init__(*args, **kwargs) def on_release(self: MDButton, *args): super(MDButton, self).on_release(args) self.on_leave() + MDButton.on_release = on_release + # I was surprised to find this didn't already exist in kivy :( class HoverBehavior(object): """originally from https://stackoverflow.com/a/605348110""" @@ -904,7 +906,7 @@ class GameManager(ThemedApp): pos_hint={"center_y": 0.575}) info_button.bind(on_release=self.command_button_action) bottom_layout.add_widget(info_button) - self.textinput = CommandPromptTextInput(size_hint_y=None, height=dp(30), multiline=False, write_tab=False) + self.textinput = CommandPromptTextInput(size_hint_y=None, multiline=False, write_tab=False) self.textinput.bind(on_text_validate=self.on_message) info_button.height = self.textinput.height self.textinput.text_validate_unfocus = False From e4bc7bd1cd44a44981c6b9387e60a626ce3a7d87 Mon Sep 17 00:00:00 2001 From: SunCat Date: Sun, 20 Apr 2025 07:16:46 +0300 Subject: [PATCH 049/199] Checksfinder: Fix the last remnant of outdated game description (#4893) Co-authored-by: Scipio Wright Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/checksfinder/docs/en_ChecksFinder.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/checksfinder/docs/en_ChecksFinder.md b/worlds/checksfinder/docs/en_ChecksFinder.md index cb33ab3959..4d8fc10091 100644 --- a/worlds/checksfinder/docs/en_ChecksFinder.md +++ b/worlds/checksfinder/docs/en_ChecksFinder.md @@ -7,9 +7,9 @@ config file. ## What is considered a location check in ChecksFinder? -Location checks in are completed when the player finds a spot on a board that has the archipelago logo. The bottom of -the screen has a number next to the archipelago logo, that number is how many you can find so far. You can only get as -many checks as you have gained items, plus five to start with being available. +Location checks get cleared when you open all non-bomb cells in a board. The bottom +of the screen has a number next to the Archipelago logo that displays how many location checks are left to be sent with +your current inventory. You can only get as many checks as you have gained items plus five checks to start with. ## When the player receives an item, what happens? From 199b6bdabb0f632fb2ff03127979ea7eaaa0f044 Mon Sep 17 00:00:00 2001 From: qwint Date: Sun, 20 Apr 2025 06:04:56 -0500 Subject: [PATCH 050/199] Launcher: Update header docstring (#4777) --- Launcher.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Launcher.py b/Launcher.py index 713c0cd318..859ebf0f76 100644 --- a/Launcher.py +++ b/Launcher.py @@ -1,11 +1,11 @@ """ Archipelago Launcher -* if run with APBP as argument, launch corresponding client. -* if run with executable as argument, run it passing argv[2:] as arguments -* if run without arguments, open launcher GUI +* If run with a patch file as argument, launch corresponding client with the patch file as an argument. +* If run with component name as argument, run it passing argv[2:] as arguments. +* If run without arguments or unknown arguments, open launcher GUI. -Scroll down to components= to add components to the launcher as well as setup.py +Additional components can be added to worlds.LauncherComponents.components. """ import argparse From a26abe079ee203c81ebe42ff2290bc8831a8dc05 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Sun, 20 Apr 2025 04:07:17 -0700 Subject: [PATCH 051/199] Zillion: Some Code Cleaning (#4780) --- worlds/zillion/__init__.py | 4 ++-- worlds/zillion/client.py | 18 +++++++++--------- worlds/zillion/gen_data.py | 4 ++-- worlds/zillion/id_maps.py | 12 ++++++------ worlds/zillion/logic.py | 14 +++++++------- worlds/zillion/options.py | 16 ++++++++-------- worlds/zillion/test/TestGoal.py | 4 ++-- worlds/zillion/test/TestOptions.py | 2 +- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/worlds/zillion/__init__.py b/worlds/zillion/__init__.py index d0064b9cb1..588654d259 100644 --- a/worlds/zillion/__init__.py +++ b/worlds/zillion/__init__.py @@ -59,7 +59,7 @@ class ZillionWebWorld(WebWorld): "English", "setup_en.md", "setup/en", - ["beauxq"] + ["beauxq"], )] option_groups = z_option_groups @@ -365,7 +365,7 @@ class ZillionWorld(World): z_loc.zz_loc.item = multi_item multi_items[z_loc.zz_loc.name] = ( z_loc.item.name, - self.multiworld.get_player_name(z_loc.item.player) + self.multiworld.get_player_name(z_loc.item.player), ) # debug_zz_loc_ids.sort() # for name, id_ in debug_zz_loc_ids.items(): diff --git a/worlds/zillion/client.py b/worlds/zillion/client.py index 71f0615d32..1c176e7013 100644 --- a/worlds/zillion/client.py +++ b/worlds/zillion/client.py @@ -147,7 +147,7 @@ class ZillionContext(CommonContext): class ZillionManager(GameManager): logging_pairs = [ - ("Client", "Archipelago") + ("Client", "Archipelago"), ] base_title = "Archipelago Zillion Client" @@ -282,7 +282,7 @@ class ZillionContext(CommonContext): payload = { "cmd": "Get", - "keys": [f"zillion-{self.auth}-doors"] + "keys": [f"zillion-{self.auth}-doors"], } async_start(self.send_msgs([payload])) elif cmd == "Retrieved": @@ -326,7 +326,7 @@ class ZillionContext(CommonContext): n_locations = len(self.missing_locations) + len(self.checked_locations) - 1 # -1 to ignore win logger.info(f"New Check: {loc_name} ({self.ap_local_count}/{n_locations})") async_start(self.send_msgs([ - {"cmd": "LocationChecks", "locations": [server_id]} + {"cmd": "LocationChecks", "locations": [server_id]}, ])) else: # This will happen a lot in Zillion, @@ -338,7 +338,7 @@ class ZillionContext(CommonContext): if not self.finished_game: async_start(self.send_msgs([ {"cmd": "LocationChecks", "locations": [loc_name_to_id["J-6 bottom far left"]]}, - {"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL} + {"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}, ])) self.finished_game = True elif isinstance(event_from_game, events.DoorEventFromGame): @@ -347,7 +347,7 @@ class ZillionContext(CommonContext): payload = { "cmd": "Set", "key": f"zillion-{self.auth}-doors", - "operations": [{"operation": "replace", "value": doors_b64}] + "operations": [{"operation": "replace", "value": doors_b64}], } async_start(self.send_msgs([payload])) elif isinstance(event_from_game, events.MapEventFromGame): @@ -367,7 +367,7 @@ class ZillionContext(CommonContext): # TODO: colors in this text, like sni client? logger.info(f"received {self.ap_id_to_name[ap_id]} from {from_name}") self.to_game.put_nowait( - events.ItemEventToGame(zz_item_ids) + events.ItemEventToGame(zz_item_ids), ) self.next_item = len(self.items_received) @@ -398,7 +398,7 @@ async def zillion_sync_task(ctx: ZillionContext) -> None: logger.info("Start Zillion in RetroArch, then use the /sms command to connect to it.") await asyncio.wait(( asyncio.create_task(ctx.look_for_retroarch.wait()), - asyncio.create_task(ctx.exit_event.wait()) + asyncio.create_task(ctx.exit_event.wait()), ), return_when=asyncio.FIRST_COMPLETED) last_log = "" @@ -443,7 +443,7 @@ async def zillion_sync_task(ctx: ZillionContext) -> None: await asyncio.wait(( asyncio.create_task(ctx.got_slot_data.wait()), asyncio.create_task(ctx.exit_event.wait()), - asyncio.create_task(asyncio.sleep(6)) + asyncio.create_task(asyncio.sleep(6)), ), return_when=asyncio.FIRST_COMPLETED) # to not spam connect packets else: # not correct seed name log_no_spam("incorrect seed - did you mix up roms?") @@ -467,7 +467,7 @@ async def zillion_sync_task(ctx: ZillionContext) -> None: await asyncio.wait(( asyncio.create_task(ctx.got_room_info.wait()), asyncio.create_task(ctx.exit_event.wait()), - asyncio.create_task(asyncio.sleep(6)) + asyncio.create_task(asyncio.sleep(6)), ), return_when=asyncio.FIRST_COMPLETED) else: # no name found in game if not help_message_shown: diff --git a/worlds/zillion/gen_data.py b/worlds/zillion/gen_data.py index 2140733961..295cfa0889 100644 --- a/worlds/zillion/gen_data.py +++ b/worlds/zillion/gen_data.py @@ -19,7 +19,7 @@ class GenData: jsonable = { "multi_items": self.multi_items, "zz_game": self.zz_game.to_jsonable(), - "game_id": list(self.game_id) + "game_id": list(self.game_id), } return json.dumps(jsonable) @@ -37,5 +37,5 @@ class GenData: return GenData( from_json["multi_items"], ZzGame.from_jsonable(from_json["zz_game"]), - bytes(from_json["game_id"]) + bytes(from_json["game_id"]), ) diff --git a/worlds/zillion/id_maps.py b/worlds/zillion/id_maps.py index 25762f99cd..d7f746125a 100644 --- a/worlds/zillion/id_maps.py +++ b/worlds/zillion/id_maps.py @@ -42,7 +42,7 @@ _zz_empty = zz_item_name_to_zz_item["empty"] def make_id_to_others(start_char: Chars) -> tuple[ - dict[int, str], dict[int, int], dict[int, ZzItem] + dict[int, str], dict[int, int], dict[int, ZzItem], ]: """ returns id_to_name, id_to_zz_id, id_to_zz_item """ id_to_name: dict[int, str] = {} @@ -53,19 +53,19 @@ def make_id_to_others(start_char: Chars) -> tuple[ name_to_zz_item = { "Apple": _zz_rescue_0, "Champ": _zz_rescue_1, - "JJ": _zz_empty + "JJ": _zz_empty, } elif start_char == "Apple": name_to_zz_item = { "Apple": _zz_empty, "Champ": _zz_rescue_1, - "JJ": _zz_rescue_0 + "JJ": _zz_rescue_0, } else: # Champ name_to_zz_item = { "Apple": _zz_rescue_0, "Champ": _zz_empty, - "JJ": _zz_rescue_1 + "JJ": _zz_rescue_1, } for name, ap_id in item_name_to_id.items(): @@ -150,10 +150,10 @@ def get_slot_info(regions: Iterable[RegionData], rescues[str(i)] = { "start_char": ri.start_char, "room_code": ri.room_code, - "mask": ri.mask + "mask": ri.mask, } return { "start_char": start_char, "rescues": rescues, - "loc_mem_to_id": loc_memory_to_loc_id + "loc_mem_to_id": loc_memory_to_loc_id, } diff --git a/worlds/zillion/logic.py b/worlds/zillion/logic.py index f3d1814a9e..aa7b77398b 100644 --- a/worlds/zillion/logic.py +++ b/worlds/zillion/logic.py @@ -25,15 +25,15 @@ def set_randomizer_locs(cs: CollectionState, p: int, zz_r: Randomizer) -> int: z_world = cs.multiworld.worlds[p] assert isinstance(z_world, ZillionWorld) - _hash = p + hash_ = p for z_loc in z_world.my_locations: zz_name = z_loc.zz_loc.name zz_item = z_loc.item.zz_item \ if isinstance(z_loc.item, ZillionItem) and z_loc.item.player == p \ else zz_empty zz_r.locations[zz_name].item = zz_item - _hash += (hash(zz_name) * (z_loc.zz_loc.req.gun + 2)) ^ hash(zz_item) - return _hash + hash_ += (hash(zz_name) * (z_loc.zz_loc.req.gun + 2)) ^ hash(zz_item) + return hash_ def item_counts(cs: CollectionState, p: int) -> tuple[tuple[str, int], ...]: @@ -67,11 +67,11 @@ class ZillionLogicCache: returns frozenset of accessible zilliandomizer locations """ # caching this function because it would be slow - _hash = set_randomizer_locs(cs, self._player, self._zz_r) + hash_ = set_randomizer_locs(cs, self._player, self._zz_r) counts = item_counts(cs, self._player) - _hash += hash(counts) + hash_ += hash(counts) - cntr, locs = self._cache.get(_hash, _cache_miss) + cntr, locs = self._cache.get(hash_, _cache_miss) if cntr == cs.prog_items[self._player]: # print("cache hit") return locs @@ -90,6 +90,6 @@ class ZillionLogicCache: tr = frozenset(self._zz_r.get_locations(have_req)) # save result in cache - self._cache[_hash] = (cs.prog_items[self._player].copy(), tr) + self._cache[hash_] = (cs.prog_items[self._player].copy(), tr) return tr diff --git a/worlds/zillion/options.py b/worlds/zillion/options.py index 13f3d43ab0..5669f4da30 100644 --- a/worlds/zillion/options.py +++ b/worlds/zillion/options.py @@ -6,7 +6,7 @@ from Options import Choice, DefaultOnToggle, NamedRange, OptionGroup, PerGameCom from zilliandomizer.options import ( Options as ZzOptions, char_to_gun, char_to_jump, ID, - VBLR as ZzVBLR, Chars, ItemCounts as ZzItemCounts + VBLR as ZzVBLR, Chars, ItemCounts as ZzItemCounts, ) from zilliandomizer.options.parsing import validate as zz_validate @@ -23,7 +23,7 @@ class ZillionContinues(NamedRange): display_name = "continues" special_range_names = { "vanilla": 3, - "infinity": 21 + "infinity": 21, } @@ -247,7 +247,7 @@ class ZillionStartingCards(NamedRange): range_end = 10 display_name = "starting cards" special_range_names = { - "vanilla": 0 + "vanilla": 0, } @@ -315,8 +315,8 @@ class ZillionOptions(PerGameCommonOptions): z_option_groups = [ OptionGroup("item counts", [ ZillionIDCardCount, ZillionBreadCount, ZillionOpaOpaCount, ZillionZillionCount, - ZillionFloppyDiskCount, ZillionScopeCount, ZillionRedIDCardCount - ]) + ZillionFloppyDiskCount, ZillionScopeCount, ZillionRedIDCardCount, + ]), ] @@ -361,7 +361,7 @@ def validate(options: ZillionOptions) -> tuple[ZzOptions, Counter[str]]: "Zillion": options.zillion_count, "Floppy Disk": options.floppy_disk_count, "Scope": options.scope_count, - "Red ID Card": options.red_id_card_count + "Red ID Card": options.red_id_card_count, }) minimums = Counter({ "ID Card": 0, @@ -370,7 +370,7 @@ def validate(options: ZillionOptions) -> tuple[ZzOptions, Counter[str]]: "Zillion": guns_required, "Floppy Disk": floppy_req.value, "Scope": 0, - "Red ID Card": 1 + "Red ID Card": 1, }) for key in minimums: item_counts[key] = max(minimums[key], item_counts[key]) @@ -426,7 +426,7 @@ def validate(options: ZillionOptions) -> tuple[ZzOptions, Counter[str]]: bool(options.early_scope.value), True, # balance defense starting_cards.value, - map_gen + map_gen, ) zz_validate(zz_op) return zz_op, item_counts diff --git a/worlds/zillion/test/TestGoal.py b/worlds/zillion/test/TestGoal.py index 1c79305699..9b891ddca0 100644 --- a/worlds/zillion/test/TestGoal.py +++ b/worlds/zillion/test/TestGoal.py @@ -104,7 +104,7 @@ class TestGoalAppleStart(ZillionTestBase): "start_char": "Apple", "jump_levels": "balanced", "gun_levels": "low", - "zillion_count": 5 + "zillion_count": 5, } def test_guns_jj_first(self) -> None: @@ -131,7 +131,7 @@ class TestGoalChampStart(ZillionTestBase): "jump_levels": "low", "gun_levels": "balanced", "opa_opa_count": 5, - "opas_per_level": 1 + "opas_per_level": 1, } def test_jump_jj_first(self) -> None: diff --git a/worlds/zillion/test/TestOptions.py b/worlds/zillion/test/TestOptions.py index 904063fd3c..f37a1f24a7 100644 --- a/worlds/zillion/test/TestOptions.py +++ b/worlds/zillion/test/TestOptions.py @@ -18,7 +18,7 @@ class OptionsTest(ZillionTestBase): """ all of the valid values for the AP options map to valid values for ZZ options """ for option_name, vblr_class in ( ("jump_levels", ZillionJumpLevels), - ("gun_levels", ZillionGunLevels) + ("gun_levels", ZillionGunLevels), ): for value in vblr_class.name_lookup.values(): self.options = {option_name: value} From e498cc7d4853b6e7a0ba61f3ffee03b0a0c54501 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Sun, 20 Apr 2025 04:21:40 -0700 Subject: [PATCH 052/199] Tests: Don't use `type` as `Callable` (#4866) --- test/general/test_entrance_rando.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/general/test_entrance_rando.py b/test/general/test_entrance_rando.py index 56a059ecf2..65853dfc8b 100644 --- a/test/general/test_entrance_rando.py +++ b/test/general/test_entrance_rando.py @@ -1,3 +1,4 @@ +from typing import Callable import unittest from enum import IntEnum @@ -34,7 +35,7 @@ def generate_entrance_pair(region: Region, name_suffix: str, group: int): def generate_disconnected_region_grid(multiworld: MultiWorld, grid_side_length: int, region_size: int = 0, - region_type: type[Region] = Region): + region_creator: Callable[[str, int, MultiWorld], Region] = Region): """ Generates a grid-like region structure for ER testing, where menu is connected to the top-left region, and each region "in vanilla" has 2 2-way exits going either down or to the right, until reaching the goal region in the @@ -44,7 +45,7 @@ def generate_disconnected_region_grid(multiworld: MultiWorld, grid_side_length: for col in range(grid_side_length): index = row * grid_side_length + col name = f"region{index}" - region = region_type(name, 1, multiworld) + region = region_creator(name, 1, multiworld) multiworld.regions.append(region) generate_locations(region_size, 1, region=region, tag=f"_{name}") @@ -465,7 +466,7 @@ class TestRandomizeEntrances(unittest.TestCase): entrance_type = CustomEntrance multiworld = generate_test_multiworld() - generate_disconnected_region_grid(multiworld, 5, region_type=CustomRegion) + generate_disconnected_region_grid(multiworld, 5, region_creator=CustomRegion) self.assertRaises(EntranceRandomizationError, randomize_entrances, multiworld.worlds[1], False, directionally_matched_group_lookup) From eb1fef1f923a9e6eb37a5cda2bbdab71d7422bc4 Mon Sep 17 00:00:00 2001 From: shananas <47014056+shananas@users.noreply.github.com> Date: Sun, 20 Apr 2025 08:20:23 -0400 Subject: [PATCH 053/199] KH2: Update Docs (#4869) --- worlds/kh2/docs/setup_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh2/docs/setup_en.md b/worlds/kh2/docs/setup_en.md index 2e1022f3ef..e0fc23e024 100644 --- a/worlds/kh2/docs/setup_en.md +++ b/worlds/kh2/docs/setup_en.md @@ -10,7 +10,7 @@ Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) - Follow this Guide to set up these requirements [KH2Rando.com](https://tommadness.github.io/KH2Randomizer/setup/Panacea-ModLoader/) - 1. Version 25.01.26.0 or greater OpenKH Mod Manager with Panacea + 1. Version 25.03.16.0 or greater OpenKH Mod Manager with Panacea 2. Lua Backend from the OpenKH Mod Manager 3. Install the mod `KH2FM-Mods-Num/GoA-ROM-Edition` using OpenKH Mod Manager - Needed for Archipelago From a76ee010ebdd3e89a69e1fe2705581728cc9c1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sun, 20 Apr 2025 08:21:02 -0400 Subject: [PATCH 054/199] Stardew Valley: Make Bus and Boat Require Money (#4833) --- worlds/stardew_valley/logic/money_logic.py | 12 ++++++------ worlds/stardew_valley/rules.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worlds/stardew_valley/logic/money_logic.py b/worlds/stardew_valley/logic/money_logic.py index e272436fd8..f5ca991e72 100644 --- a/worlds/stardew_valley/logic/money_logic.py +++ b/worlds/stardew_valley/logic/money_logic.py @@ -35,8 +35,8 @@ GrindLogicMixin, ShippingLogicMixin]]): @cache_self1 def can_have_earned_total(self, amount: int) -> StardewRule: - if amount < 1000: - return True_() + if amount <= 1000: + return self.logic.true_ pierre_rule = self.logic.region.can_reach_all((Region.pierre_store, Region.forest)) willy_rule = self.logic.region.can_reach_all((Region.fish_shop, LogicRegion.fishing)) @@ -44,19 +44,19 @@ GrindLogicMixin, ShippingLogicMixin]]): robin_rule = self.logic.region.can_reach_all((Region.carpenter, Region.secret_woods)) shipping_rule = self.logic.shipping.can_use_shipping_bin - if amount < 2000: + if amount <= 2500: selling_any_rule = pierre_rule | willy_rule | clint_rule | robin_rule | shipping_rule return selling_any_rule - if amount < 5000: + if amount <= 5000: selling_all_rule = (pierre_rule & willy_rule & clint_rule & robin_rule) | shipping_rule return selling_all_rule - if amount < 10000: + if amount <= 10000: return shipping_rule seed_rules = self.logic.region.can_reach(Region.pierre_store) - if amount < 40000: + if amount <= 40000: return shipping_rule & seed_rules percent_progression_items_needed = min(90, amount // 20000) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index bdfbc20488..4b1ff2ad56 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -201,7 +201,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S movie_theater_rule = logic.has_movie_theater() set_entrance_rule(multiworld, player, Entrance.enter_movie_theater, movie_theater_rule) set_entrance_rule(multiworld, player, Entrance.purchase_movie_ticket, movie_theater_rule) - set_entrance_rule(multiworld, player, Entrance.take_bus_to_desert, logic.received("Bus Repair")) + set_entrance_rule(multiworld, player, Entrance.take_bus_to_desert, logic.received("Bus Repair") & logic.money.can_spend(500)) set_entrance_rule(multiworld, player, Entrance.enter_skull_cavern, logic.received(Wallet.skull_key)) set_entrance_rule(multiworld, player, LogicEntrance.talk_to_mines_dwarf, logic.wallet.can_speak_dwarf() & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron)) @@ -362,7 +362,7 @@ def set_island_entrances_rules(logic: StardewLogic, multiworld, player, world_op Entrance.use_island_obelisk: logic.can_use_obelisk(Transportation.island_obelisk), Entrance.use_farm_obelisk: logic.can_use_obelisk(Transportation.farm_obelisk), Entrance.fish_shop_to_boat_tunnel: boat_repaired, - Entrance.boat_to_ginger_island: boat_repaired, + Entrance.boat_to_ginger_island: boat_repaired & logic.money.can_spend(1000), Entrance.island_south_to_west: logic.received("Island West Turtle"), Entrance.island_south_to_north: logic.received("Island North Turtle"), Entrance.island_west_to_islandfarmhouse: logic.received("Island Farmhouse"), From b756a67c2ac0be869fbb001f6c1d726c94efe821 Mon Sep 17 00:00:00 2001 From: Trevor L <80716066+TRPG0@users.noreply.github.com> Date: Sun, 20 Apr 2025 06:31:58 -0600 Subject: [PATCH 055/199] BRC: Update Setup Guide (#4861) Co-authored-by: Scipio Wright Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/bomb_rush_cyberfunk/docs/setup_en.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/worlds/bomb_rush_cyberfunk/docs/setup_en.md b/worlds/bomb_rush_cyberfunk/docs/setup_en.md index 14da25adb3..aac6e86612 100644 --- a/worlds/bomb_rush_cyberfunk/docs/setup_en.md +++ b/worlds/bomb_rush_cyberfunk/docs/setup_en.md @@ -16,8 +16,11 @@ Cyberfunk root folder. *Do not use any pre-release versions of BepInEx 6.* 2. Start Bomb Rush Cyberfunk once so that BepInEx can create its required configuration files. -3. Download the zip archive from the [releases](https://github.com/TRPG0/BRC-Archipelago/releases) page, and extract its -contents into `BepInEx\plugins`. +3. Download `ModLocalizer.dll` from its [releases](https://github.com/TRPG0/BRC-ModLocalizer/releases) page, and put it +in `BepInEx\plugins`. + +4. Download the zip archive for the Archipelago plugin from its [releases](https://github.com/TRPG0/BRC-Archipelago/releases) +page, and extract the contents into `BepInEx\plugins`. After installing Archipelago, there are some additional mods that can also be installed for a better experience: From 04aa4715269c2f7aecfe83e514ea0c042fa73eba Mon Sep 17 00:00:00 2001 From: Omnises Nihilis <38057571+Omnises@users.noreply.github.com> Date: Sun, 20 Apr 2025 05:43:52 -0700 Subject: [PATCH 056/199] KH2: Update Docs (#4871) --- worlds/kh2/docs/setup_en.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/worlds/kh2/docs/setup_en.md b/worlds/kh2/docs/setup_en.md index e0fc23e024..a1248d1095 100644 --- a/worlds/kh2/docs/setup_en.md +++ b/worlds/kh2/docs/setup_en.md @@ -27,7 +27,7 @@ Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames. Load this mod just like the GoA ROM you did during the KH2 Rando setup. `JaredWeakStrike/APCompanion`
Have this mod second-highest priority below the .zip seed.
-This mod is based upon Num's Garden of Assemblege Mod and requires it to work. Without Num this could not be possible. +This mod is based upon Num's Garden of Assemblage Mod and requires it to work. Without Num this could not be possible.

Required: Auto Save Mod and KH2 Lua Library

@@ -35,7 +35,7 @@ Load these mods just like you loaded the GoA ROM mod during the KH2 Rando setup.

Optional QoL Mods: AP QoL and Bear Skip

-`JaredWeakStrike/AP_QOL` Makes the urns minigames much faster, makes Cavern of Remembrance orbs drop significantly more drive orbs for refilling drive/leveling master form, skips the animation when using the bulky vendor RC, skips carpet escape auto scroller in Agrabah 2, and prevents the wardrobe in the Beasts Castle wardrobe push minigame from waking up while being pushed. +`JaredWeakStrike/AP_QOL` Makes the urns minigames much faster, makes Cavern of Remembrance orbs drop significantly more drive orbs for refilling drive/leveling master form, skips the animation when using the bulky vendor RC, skips carpet escape auto-scroller in Agrabah 2, and prevents the wardrobe in the Beasts Castle wardrobe push minigame from waking up while being pushed. `shananas/BearSkip` Skips all minigames in 100 Acre Woods except the Spooky Cave minigame since there are chests in Spooky Cave you can only get during the minigame. For Spooky Cave, Pooh is moved to the other side of the invisible wall that prevents you from using his RC to finish the minigame. @@ -83,6 +83,9 @@ Enter The room's port number into the top box where the x's are and pres - Loading into Simulated Twilight Town Instead of the GOA. - To fix this look over the guide at [KH2Rando.com](https://tommadness.github.io/KH2Randomizer/setup/Panacea-ModLoader/). Specifically the Panacea and Lua Backend Steps. +- Using a seed from the standalone KH2 Randomizer Seed Generator. + - The Archipelago version of the KH2 Randomizer does not use this Seed Generator; refer to the [Archipelago Setup](https://archipelago.gg/tutorial/Archipelago/setup/en) to learn how to generate and play a seed through Archipelago. +

Best Practices

- Make a save at the start of the GoA before opening anything. This will be the file to select when loading an autosave if/when your game crashes. @@ -139,4 +142,4 @@ This pack will handle logic, received items, checked locations and autotabbing f - Why should I install the auto save mod at `KH2FM-Mods-equations19/auto-save` and `KH2FM-Mods-equations19/KH2-Lua-Library`? - Because Kingdom Hearts 2 is prone to crashes and will keep you from losing your progress. Both mods are needed for auto save to work. - How do I load an auto save? - - To load an auto-save, hold down the Select or your equivalent on your prefered controller while choosing a file. Make sure to hold the button down the whole time. + - To load an auto-save, hold down the Select or your equivalent on your preferred controller while choosing a file. Make sure to hold the button down the whole time. From b76f2163a4902ddb33d101dd5551e54bc31cc4ef Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 20 Apr 2025 08:08:30 -0500 Subject: [PATCH 057/199] MM2: Fix invalid weakness failsafe and refactor weakness tests (#4899) --- worlds/mm2/rules.py | 4 +-- worlds/mm2/test/test_weakness.py | 50 +++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/worlds/mm2/rules.py b/worlds/mm2/rules.py index d84c13c827..67431c9956 100644 --- a/worlds/mm2/rules.py +++ b/worlds/mm2/rules.py @@ -215,7 +215,7 @@ def set_rules(world: "MM2World") -> None: continue highest, wp = max(zip(weapon_weight.values(), weapon_weight.keys())) uses = weapon_energy[wp] // weapon_costs[wp] - if int(uses * boss_damage[wp]) > boss_health[boss]: + if int(uses * boss_damage[wp]) >= boss_health[boss]: used = ceil(boss_health[boss] / boss_damage[wp]) weapon_energy[wp] -= weapon_costs[wp] * used boss_health[boss] = 0 @@ -226,7 +226,7 @@ def set_rules(world: "MM2World") -> None: # it should be impossible to be out of energy, simply because even if every boss took 1 from # Quick Boomerang and no other, it would only be 28 off from defeating all 9, # which Metal Blade should be able to cover - wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon]) + max_uses, wp = max((weapon_energy[weapon] // weapon_costs[weapon], weapon) for weapon in weapon_weight if weapon != 0 and (weapon != 8 or boss != 12)) # Wily Machine cannot under any circumstances take damage from Time Stopper, prevent this diff --git a/worlds/mm2/test/test_weakness.py b/worlds/mm2/test/test_weakness.py index c294ce5ac9..817241c40b 100644 --- a/worlds/mm2/test/test_weakness.py +++ b/worlds/mm2/test/test_weakness.py @@ -2,9 +2,9 @@ from math import ceil from . import MM2TestBase from ..options import bosses +from ..rules import minimum_weakness_requirement -# Need to figure out how this test should work def validate_wily_5(base: MM2TestBase) -> None: world = base.multiworld.worlds[base.player] weapon_damage = world.weapon_damage @@ -67,38 +67,54 @@ def validate_wily_5(base: MM2TestBase) -> None: weapon_weight.pop(wp) -class StrictWeaknessTests(MM2TestBase): +class WeaknessTests(MM2TestBase): options = { - "strict_weakness": True, "yoku_jumps": True, - "enable_lasers": True + "enable_lasers": True, } - def test_that_every_boss_has_a_weakness(self) -> None: world = self.multiworld.worlds[self.player] weapon_damage = world.weapon_damage for boss in range(14): - if not any(weapon_damage[weapon][boss] for weapon in range(9)): + if not any(weapon_damage[weapon][boss] >= minimum_weakness_requirement[weapon] for weapon in range(9)): self.fail(f"Boss {boss} generated without weakness! Seed: {self.multiworld.seed}") def test_wily_5(self) -> None: validate_wily_5(self) -class RandomStrictWeaknessTests(MM2TestBase): +class StrictWeaknessTests(WeaknessTests): + options = { + "strict_weakness": True, + **WeaknessTests.options + } + + +class RandomWeaknessTests(WeaknessTests): + options = { + "random_weakness": "randomized", + **WeaknessTests.options + } + + +class ShuffledWeaknessTests(WeaknessTests): + options = { + "random_weakness": "shuffled", + **WeaknessTests.options + } + + +class RandomStrictWeaknessTests(WeaknessTests): options = { "strict_weakness": True, "random_weakness": "randomized", - "yoku_jumps": True, - "enable_lasers": True + **WeaknessTests.options } - def test_that_every_boss_has_a_weakness(self) -> None: - world = self.multiworld.worlds[self.player] - weapon_damage = world.weapon_damage - for boss in range(14): - if not any(weapon_damage[weapon][boss] for weapon in range(9)): - self.fail(f"Boss {boss} generated without weakness! Seed: {self.multiworld.seed}") - def test_wily_5(self) -> None: - validate_wily_5(self) +class ShuffledStrictWeaknessTests(WeaknessTests): + options = { + "strict_weakness": True, + "random_weakness": "shuffled", + **WeaknessTests.options + } From be0f23beb3ff546fa493f2cbd0831879254e7fb4 Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Sun, 20 Apr 2025 07:46:57 -0600 Subject: [PATCH 058/199] CV64: Some DeathLink Adjustments (#4727) --- worlds/cv64/client.py | 44 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/worlds/cv64/client.py b/worlds/cv64/client.py index cec5f551b9..849ca44a8a 100644 --- a/worlds/cv64/client.py +++ b/worlds/cv64/client.py @@ -10,12 +10,20 @@ from worlds._bizhawk.client import BizHawkClient if TYPE_CHECKING: from worlds._bizhawk.context import BizHawkClientContext +DEATHLINK_AREA_NUMBERS = [0, 1, 1, 2, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, + 7, 9, 8, 6, 12, 12, 13, 11, 12, 5, 2, 10, 13, 13] + +DEATHLINK_AREA_NAMES = ["Forest of Silence", "Castle Wall", "Villa", "Tunnel", "Underground Waterway", "Castle Center", + "Duel Tower", "Tower of Execution", "Tower of Science", "Tower of Sorcery", "Room of Clocks", + "Clock Tower", "Castle Keep", "Level: You Cheated"] + class Castlevania64Client(BizHawkClient): game = "Castlevania 64" system = "N64" patch_suffix = ".apcv64" self_induced_death = False + time_of_sent_death = None received_deathlinks = 0 death_causes = [] currently_shopping = False @@ -62,15 +70,19 @@ class Castlevania64Client(BizHawkClient): return if "tags" not in args: return - if "DeathLink" in args["tags"] and args["data"]["source"] != ctx.slot_info[ctx.slot].name: + if "DeathLink" in args["tags"] and args["data"]["time"] != self.time_of_sent_death: self.received_deathlinks += 1 if "cause" in args["data"]: cause = args["data"]["cause"] + # If the other game sent a death with a blank string for the cause, use the default death message. + if cause == "": + cause = f"{args['data']['source']} killed you without a word!" # Truncate the death cause message at 120 characters. if len(cause) > 120: cause = cause[0:120] else: - cause = f"{args['data']['source']} killed you!" + # If the other game sent a death with no cause at all, use the default death message. + cause = f"{args['data']['source']} killed you without a word!" self.death_causes.append(cause) async def game_watcher(self, ctx: "BizHawkClientContext") -> None: @@ -115,11 +127,30 @@ class Castlevania64Client(BizHawkClient): if "DeathLink" in ctx.tags and save_struct[0xA4] & 0x80 and not self.self_induced_death and not \ deathlink_induced_death: self.self_induced_death = True - if save_struct[0xA4] & 0x08: - # Special death message for dying while having the Vamp status. - await ctx.send_death(f"{ctx.player_names[ctx.slot]} became a vampire and drank your blood!") + + # If the player died at the Castle Keep exterior map on one of the Room of Clocks boss towers + # (determinable by checking the entrance value as well as the map value), consider Room of Clocks the + # actual area of death. + if save_struct[0xAD] == 0x14 and save_struct[0xAF] in [0, 1]: + area_of_death = DEATHLINK_AREA_NAMES[10] + # Otherwise, determine what area the player perished in from the current map ID. else: - await ctx.send_death(f"{ctx.player_names[ctx.slot]} perished. Dracula has won!") + area_of_death = DEATHLINK_AREA_NAMES[DEATHLINK_AREA_NUMBERS[save_struct[0xAD]]] + + # If we had the Vamp status while dying, use a special message. + if save_struct[0xA4] & 0x08: + death_message = (f"{ctx.player_names[ctx.slot]} became a vampire at {area_of_death} and drank your " + f"blood!") + # Otherwise, use the generic one. + else: + death_message = f"{ctx.player_names[ctx.slot]} perished in {area_of_death}. Dracula has won!" + + # Send the death. + await ctx.send_death(death_message) + + # Record the time in which the death was sent so when we receive the packet we can tell it wasn't our + # own death. ctx.on_deathlink overwrites it later, so it MUST be grabbed now. + self.time_of_sent_death = ctx.last_death_link # Write any DeathLinks received along with the corresponding death cause starting with the oldest. # To minimize Bizhawk Write jank, the DeathLink write will be prioritized over the item received one. @@ -208,6 +239,7 @@ class Castlevania64Client(BizHawkClient): # Send game clear if we're in either any ending cutscene or the credits state. if not ctx.finished_game and (0x26 <= int(cutscene_value) <= 0x2E or game_state == 0x0000000B): + ctx.finished_game = True await ctx.send_msgs([{ "cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL From 33dc845de8b252a781c80d2d27039f3e74fc0333 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 20 Apr 2025 09:48:09 -0400 Subject: [PATCH 059/199] TUNIC: Fix UT Issue with Fewer Shops Option (#4873) --- worlds/tunic/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index ff1dc414c3..86a91a336b 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -162,9 +162,14 @@ class TunicWorld(World): self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) self.options.breakable_shuffle.value = self.passthrough.get("breakable_shuffle", 0) - self.options.fixed_shop.value = self.options.fixed_shop.option_false self.options.laurels_location.value = self.options.laurels_location.option_anywhere self.options.combat_logic.value = self.passthrough["combat_logic"] + + self.options.fixed_shop.value = self.options.fixed_shop.option_false + if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].keys() + or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].values()): + self.options.fixed_shop.value = self.options.fixed_shop.option_true + else: self.using_ut = False else: From 22941168cdd475c2ce07bb867bd1171b58b84bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sun, 20 Apr 2025 10:17:22 -0400 Subject: [PATCH 060/199] Stardew Valley: Refactor Animals to use Content Packs (#4320) --- worlds/stardew_valley/content/game_content.py | 21 ++++-- worlds/stardew_valley/content/unpacking.py | 4 ++ .../content/vanilla/ginger_island.py | 20 +++++- .../content/vanilla/the_farm.py | 66 ++++++++++++++++++- worlds/stardew_valley/data/animal.py | 23 +++++++ worlds/stardew_valley/data/bundle_data.py | 4 +- worlds/stardew_valley/data/museum_data.py | 9 +-- worlds/stardew_valley/logic/animal_logic.py | 59 +++++------------ worlds/stardew_valley/logic/festival_logic.py | 31 +++++++-- worlds/stardew_valley/logic/logic.py | 25 +++---- .../logic/logic_and_mods_design.md | 14 +++- worlds/stardew_valley/logic/source_logic.py | 12 +++- worlds/stardew_valley/strings/animal_names.py | 5 +- .../strings/animal_product_names.py | 19 +++++- worlds/stardew_valley/strings/metal_names.py | 2 - 15 files changed, 229 insertions(+), 85 deletions(-) create mode 100644 worlds/stardew_valley/data/animal.py diff --git a/worlds/stardew_valley/content/game_content.py b/worlds/stardew_valley/content/game_content.py index 8a72a4811d..c3f8e9f8e9 100644 --- a/worlds/stardew_valley/content/game_content.py +++ b/worlds/stardew_valley/content/game_content.py @@ -1,9 +1,10 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Dict, Iterable, Set, Any, Mapping, Type, Tuple, Union +from typing import Iterable, Set, Any, Mapping, Type, Tuple, Union from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression, building_progression, tool_progression +from ..data.animal import Animal from ..data.building import Building from ..data.fish_data import FishItem from ..data.game_item import GameItem, Source, ItemTag @@ -18,12 +19,13 @@ class StardewContent: # regions -> To be used with can reach rule - game_items: Dict[str, GameItem] = field(default_factory=dict) - fishes: Dict[str, FishItem] = field(default_factory=dict) - villagers: Dict[str, Villager] = field(default_factory=dict) - farm_buildings: Dict[str, Building] = field(default_factory=dict) - skills: Dict[str, Skill] = field(default_factory=dict) - quests: Dict[str, Any] = field(default_factory=dict) + game_items: dict[str, GameItem] = field(default_factory=dict) + fishes: dict[str, FishItem] = field(default_factory=dict) + villagers: dict[str, Villager] = field(default_factory=dict) + farm_buildings: dict[str, Building] = field(default_factory=dict) + animals: dict[str, Animal] = field(default_factory=dict) + skills: dict[str, Skill] = field(default_factory=dict) + quests: dict[str, Any] = field(default_factory=dict) def find_sources_of_type(self, types: Union[Type[Source], Tuple[Type[Source]]]) -> Iterable[Source]: for item in self.game_items.values(): @@ -109,6 +111,11 @@ class ContentPack: def farm_building_hook(self, content: StardewContent): ... + animals: Iterable[Animal] = () + + def animal_hook(self, content: StardewContent): + ... + skills: Iterable[Skill] = () def skill_hook(self, content: StardewContent): diff --git a/worlds/stardew_valley/content/unpacking.py b/worlds/stardew_valley/content/unpacking.py index 2d50f7718b..faa7cb5399 100644 --- a/worlds/stardew_valley/content/unpacking.py +++ b/worlds/stardew_valley/content/unpacking.py @@ -65,6 +65,10 @@ def register_pack(content: StardewContent, pack: ContentPack): content.farm_buildings[building.name] = building pack.farm_building_hook(content) + for animal in pack.animals: + content.animals[animal.name] = animal + pack.animal_hook(content) + for skill in pack.skills: content.skills[skill.name] = skill pack.skill_hook(content) diff --git a/worlds/stardew_valley/content/vanilla/ginger_island.py b/worlds/stardew_valley/content/vanilla/ginger_island.py index 2fbcb03279..edb135ea30 100644 --- a/worlds/stardew_valley/content/vanilla/ginger_island.py +++ b/worlds/stardew_valley/content/vanilla/ginger_island.py @@ -1,15 +1,19 @@ from .pelican_town import pelican_town as pelican_town_content_pack from ..game_content import ContentPack, StardewContent from ...data import villagers_data, fish_data -from ...data.game_item import ItemTag, Tag +from ...data.animal import Animal, AnimalName, OstrichIncubatorSource +from ...data.game_item import ItemTag, Tag, CustomRuleSource from ...data.harvest import ForagingSource, HarvestFruitTreeSource, HarvestCropSource from ...data.requirement import WalnutRequirement from ...data.shop import ShopSource +from ...strings.animal_product_names import AnimalProduct from ...strings.book_names import Book +from ...strings.building_names import Building from ...strings.crop_names import Fruit, Vegetable from ...strings.fish_names import Fish from ...strings.forageable_names import Forageable, Mushroom from ...strings.fruit_tree_names import Sapling +from ...strings.generic_names import Generic from ...strings.metal_names import Fossil, Mineral from ...strings.region_names import Region, LogicRegion from ...strings.season_names import Season @@ -51,6 +55,13 @@ ginger_island_content_pack = GingerIslandContentPack( Vegetable.taro_root: (HarvestCropSource(seed=Seed.taro, seasons=(Season.summer,)),), Fruit.pineapple: (HarvestCropSource(seed=Seed.pineapple, seasons=(Season.summer,)),), + # Temporary animal stuff, will be moved once animal products are properly content-packed + AnimalProduct.ostrich_egg_starter: (CustomRuleSource(lambda logic: logic.tool.can_forage(Generic.any, Region.island_north, True) + & logic.has(Forageable.journal_scrap) + & logic.region.can_reach(Region.volcano_floor_5)),), + AnimalProduct.ostrich_egg: (CustomRuleSource(lambda logic: logic.has(AnimalProduct.ostrich_egg_starter) + | logic.animal.has_animal(AnimalName.ostrich)),), + }, shop_sources={ Seed.taro: (ShopSource(items_price=((2, Fossil.bone_fragment),), shop_region=Region.island_trader),), @@ -81,5 +92,12 @@ ginger_island_content_pack = GingerIslandContentPack( ), villagers=( villagers_data.leo, + ), + animals=( + Animal(AnimalName.ostrich, + required_building=Building.barn, + sources=( + OstrichIncubatorSource(AnimalProduct.ostrich_egg_starter), + )), ) ) diff --git a/worlds/stardew_valley/content/vanilla/the_farm.py b/worlds/stardew_valley/content/vanilla/the_farm.py index 68d0bf10f6..183025e43f 100644 --- a/worlds/stardew_valley/content/vanilla/the_farm.py +++ b/worlds/stardew_valley/content/vanilla/the_farm.py @@ -1,7 +1,12 @@ from .pelican_town import pelican_town as pelican_town_content_pack from ..game_content import ContentPack +from ...data.animal import IncubatorSource, Animal, AnimalName from ...data.harvest import FruitBatsSource, MushroomCaveSource +from ...data.shop import ShopSource +from ...strings.animal_product_names import AnimalProduct +from ...strings.building_names import Building from ...strings.forageable_names import Forageable, Mushroom +from ...strings.region_names import Region the_farm = ContentPack( "The Farm (Vanilla)", @@ -39,5 +44,64 @@ the_farm = ContentPack( Mushroom.red: ( MushroomCaveSource(), ), - } + }, + animals=( + Animal(AnimalName.chicken, + required_building=Building.coop, + sources=( + ShopSource(shop_region=Region.ranch, money_price=800), + # For now there is no way to obtain the starter item, so this adds additional rules in the system for nothing. + # IncubatorSource(AnimalProduct.egg_starter) + )), + Animal(AnimalName.cow, + required_building=Building.barn, + sources=( + ShopSource(shop_region=Region.ranch, money_price=1500), + )), + Animal(AnimalName.goat, + required_building=Building.big_barn, + sources=( + ShopSource(shop_region=Region.ranch, money_price=4000), + )), + Animal(AnimalName.duck, + required_building=Building.big_coop, + sources=( + ShopSource(shop_region=Region.ranch, money_price=1200), + # For now there is no way to obtain the starter item, so this adds additional rules in the system for nothing. + # IncubatorSource(AnimalProduct.duck_egg_starter) + )), + Animal(AnimalName.sheep, + required_building=Building.deluxe_barn, + sources=( + ShopSource(shop_region=Region.ranch, money_price=8000), + )), + Animal(AnimalName.rabbit, + required_building=Building.deluxe_coop, + sources=( + ShopSource(shop_region=Region.ranch, money_price=8000), + )), + Animal(AnimalName.pig, + required_building=Building.deluxe_barn, + sources=( + ShopSource(shop_region=Region.ranch, money_price=16000), + )), + Animal(AnimalName.void_chicken, + required_building=Building.big_coop, + sources=( + IncubatorSource(AnimalProduct.void_egg_starter), + )), + Animal(AnimalName.golden_chicken, + required_building=Building.big_coop, + sources=( + IncubatorSource(AnimalProduct.golden_egg_starter), + )), + Animal(AnimalName.dinosaur, + required_building=Building.big_coop, + sources=( + # We should use the starter item here, but since the dinosaur egg is also an artifact, it's part of the museum rules + # and I do not want to touch it yet. + # IncubatorSource(AnimalProduct.dinosaur_egg_starter), + IncubatorSource(AnimalProduct.dinosaur_egg), + )), + ) ) diff --git a/worlds/stardew_valley/data/animal.py b/worlds/stardew_valley/data/animal.py new file mode 100644 index 0000000000..8121b6f681 --- /dev/null +++ b/worlds/stardew_valley/data/animal.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass, field + +from .game_item import Source +from ..strings.animal_names import Animal as AnimalName + +assert AnimalName + + +@dataclass(frozen=True) +class Animal: + name: str + required_building: str = field(kw_only=True) + sources: tuple[Source, ...] = field(kw_only=True) + + +@dataclass(frozen=True) +class IncubatorSource(Source): + egg_item: str + + +@dataclass(frozen=True) +class OstrichIncubatorSource(Source): + egg_item: str diff --git a/worlds/stardew_valley/data/bundle_data.py b/worlds/stardew_valley/data/bundle_data.py index 75f0f75a23..3a5523ecdd 100644 --- a/worlds/stardew_valley/data/bundle_data.py +++ b/worlds/stardew_valley/data/bundle_data.py @@ -143,7 +143,7 @@ duck_egg = BundleItem(AnimalProduct.duck_egg) rabbit_foot = BundleItem(AnimalProduct.rabbit_foot) dinosaur_egg = BundleItem(AnimalProduct.dinosaur_egg) void_egg = BundleItem(AnimalProduct.void_egg) -ostrich_egg = BundleItem(AnimalProduct.ostrich_egg, source=BundleItem.Sources.island, ) +ostrich_egg = BundleItem(AnimalProduct.ostrich_egg, source=BundleItem.Sources.content) golden_egg = BundleItem(AnimalProduct.golden_egg) truffle_oil = BundleItem(ArtisanGood.truffle_oil) @@ -832,7 +832,7 @@ calico_items = [calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50), strawberry_seeds.as_amount(20), spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5), - pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5)] + pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5) ] calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2) raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4) diff --git a/worlds/stardew_valley/data/museum_data.py b/worlds/stardew_valley/data/museum_data.py index b81c518a37..0607261ec6 100644 --- a/worlds/stardew_valley/data/museum_data.py +++ b/worlds/stardew_valley/data/museum_data.py @@ -3,12 +3,13 @@ from __future__ import annotations from dataclasses import dataclass from typing import List, Tuple, Union, Optional -from ..strings.monster_names import Monster +from ..strings.animal_product_names import AnimalProduct from ..strings.fish_names import WaterChest from ..strings.forageable_names import Forageable -from ..strings.metal_names import Mineral, Artifact, Fossil -from ..strings.region_names import Region from ..strings.geode_names import Geode +from ..strings.metal_names import Mineral, Artifact, Fossil +from ..strings.monster_names import Monster +from ..strings.region_names import Region @dataclass(frozen=True) @@ -105,7 +106,7 @@ class Artifact: geodes=(Geode.artifact_trove, WaterChest.fishing_chest)) ornamental_fan = create_artifact("Ornamental Fan", 7.4, (Region.beach, Region.forest, Region.town), geodes=(Geode.artifact_trove, WaterChest.fishing_chest)) - dinosaur_egg = create_artifact("Dinosaur Egg", 11.4, (Region.skull_cavern), + dinosaur_egg = create_artifact(AnimalProduct.dinosaur_egg, 11.4, (Region.skull_cavern), monsters=Monster.pepper_rex) rare_disc = create_artifact("Rare Disc", 5.6, Region.stardew_valley, geodes=(Geode.artifact_trove, WaterChest.fishing_chest), diff --git a/worlds/stardew_valley/logic/animal_logic.py b/worlds/stardew_valley/logic/animal_logic.py index eb1ebeeec5..071133d5ce 100644 --- a/worlds/stardew_valley/logic/animal_logic.py +++ b/worlds/stardew_valley/logic/animal_logic.py @@ -1,25 +1,15 @@ -from typing import Union +import typing from .base_logic import BaseLogicMixin, BaseLogic -from .building_logic import BuildingLogicMixin -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from ..stardew_rule import StardewRule, true_ -from ..strings.animal_names import Animal, coop_animals, barn_animals +from ..stardew_rule import StardewRule from ..strings.building_names import Building from ..strings.forageable_names import Forageable -from ..strings.generic_names import Generic -from ..strings.region_names import Region +from ..strings.machine_names import Machine -cost_and_building_by_animal = { - Animal.chicken: (800, Building.coop), - Animal.cow: (1500, Building.barn), - Animal.goat: (4000, Building.big_barn), - Animal.duck: (1200, Building.big_coop), - Animal.sheep: (8000, Building.deluxe_barn), - Animal.rabbit: (8000, Building.deluxe_coop), - Animal.pig: (16000, Building.deluxe_barn) -} +if typing.TYPE_CHECKING: + from .logic import StardewLogic +else: + StardewLogic = object class AnimalLogicMixin(BaseLogicMixin): @@ -28,32 +18,19 @@ class AnimalLogicMixin(BaseLogicMixin): self.animal = AnimalLogic(*args, **kwargs) -class AnimalLogic(BaseLogic[Union[HasLogicMixin, MoneyLogicMixin, BuildingLogicMixin]]): +class AnimalLogic(BaseLogic[StardewLogic]): - def can_buy_animal(self, animal: str) -> StardewRule: - try: - price, building = cost_and_building_by_animal[animal] - except KeyError: - return true_ - return self.logic.money.can_spend_at(Region.ranch, price) & self.logic.building.has_building(building) + def can_incubate(self, egg_item: str) -> StardewRule: + return self.logic.building.has_building(Building.coop) & self.logic.has(egg_item) - def has_animal(self, animal: str) -> StardewRule: - if animal == Generic.any: - return self.has_any_animal() - elif animal == Building.coop: - return self.has_any_coop_animal() - elif animal == Building.barn: - return self.has_any_barn_animal() - return self.logic.has(animal) + def can_ostrich_incubate(self, egg_item: str) -> StardewRule: + return self.logic.building.has_building(Building.barn) & self.logic.has(Machine.ostrich_incubator) & self.logic.has(egg_item) - def has_happy_animal(self, animal: str) -> StardewRule: - return self.has_animal(animal) & self.logic.has(Forageable.hay) + def has_animal(self, animal_name: str) -> StardewRule: + animal = self.content.animals.get(animal_name) + assert animal is not None, f"Animal {animal_name} not found." - def has_any_animal(self) -> StardewRule: - return self.has_any_coop_animal() | self.has_any_barn_animal() + return self.logic.source.has_access_to_any(animal.sources) & self.logic.building.has_building(animal.required_building) - def has_any_coop_animal(self) -> StardewRule: - return self.logic.has_any(*coop_animals) - - def has_any_barn_animal(self) -> StardewRule: - return self.logic.has_any(*barn_animals) + def has_happy_animal(self, animal_name: str) -> StardewRule: + return self.logic.animal.has_animal(animal_name) & self.logic.has(Forageable.hay) diff --git a/worlds/stardew_valley/logic/festival_logic.py b/worlds/stardew_valley/logic/festival_logic.py index 2b22617202..939e904951 100644 --- a/worlds/stardew_valley/logic/festival_logic.py +++ b/worlds/stardew_valley/logic/festival_logic.py @@ -17,6 +17,7 @@ from .skill_logic import SkillLogicMixin from .time_logic import TimeLogicMixin from ..options import FestivalLocations from ..stardew_rule import StardewRule +from ..strings.animal_product_names import AnimalProduct from ..strings.book_names import Book from ..strings.craftable_names import Fishing from ..strings.crop_names import Fruit, Vegetable @@ -154,18 +155,37 @@ SkillLogicMixin, RegionLogicMixin, ActionLogicMixin, MonsterLogicMixin, Relation if self.options.festival_locations != FestivalLocations.option_hard: return self.logic.true_ - animal_rule = self.logic.animal.has_animal(Generic.any) + # Other animal products are not counted in the animal product category + good_animal_products = [ + AnimalProduct.duck_egg, AnimalProduct.duck_feather, AnimalProduct.egg, AnimalProduct.goat_milk, AnimalProduct.golden_egg, AnimalProduct.large_egg, + AnimalProduct.large_goat_milk, AnimalProduct.large_milk, AnimalProduct.milk, AnimalProduct.ostrich_egg, AnimalProduct.rabbit_foot, + AnimalProduct.void_egg, AnimalProduct.wool + ] + if AnimalProduct.ostrich_egg not in self.content.game_items: + # When ginger island is excluded, ostrich egg is not available + good_animal_products.remove(AnimalProduct.ostrich_egg) + animal_rule = self.logic.has_any(*good_animal_products) + artisan_rule = self.logic.artisan.can_keg(Generic.any) | self.logic.artisan.can_preserves_jar(Generic.any) - cooking_rule = self.logic.money.can_spend_at(Region.saloon, 220) # Salads at the bar are good enough + + # Salads at the bar are good enough + cooking_rule = self.logic.money.can_spend_at(Region.saloon, 220) + fish_rule = self.logic.skill.can_fish(difficulty=50) - forage_rule = self.logic.region.can_reach_any((Region.forest, Region.backwoods)) # Hazelnut always available since the grange display is in fall - mineral_rule = self.logic.action.can_open_geode(Generic.any) # More than half the minerals are good enough + + # Hazelnut always available since the grange display is in fall + forage_rule = self.logic.region.can_reach_any((Region.forest, Region.backwoods)) + + # More than half the minerals are good enough + mineral_rule = self.logic.action.can_open_geode(Generic.any) + good_fruits = (fruit for fruit in (Fruit.apple, Fruit.banana, Forageable.coconut, Forageable.crystal_fruit, Fruit.mango, Fruit.orange, Fruit.peach, Fruit.pomegranate, Fruit.strawberry, Fruit.melon, Fruit.rhubarb, Fruit.pineapple, Fruit.ancient_fruit, Fruit.starfruit) if fruit in self.content.game_items) fruit_rule = self.logic.has_any(*good_fruits) + good_vegetables = (vegeteable for vegeteable in (Vegetable.amaranth, Vegetable.artichoke, Vegetable.beet, Vegetable.cauliflower, Forageable.fiddlehead_fern, Vegetable.kale, @@ -173,8 +193,7 @@ SkillLogicMixin, RegionLogicMixin, ActionLogicMixin, MonsterLogicMixin, Relation if vegeteable in self.content.game_items) vegetable_rule = self.logic.has_any(*good_vegetables) - return animal_rule & artisan_rule & cooking_rule & fish_rule & \ - forage_rule & fruit_rule & mineral_rule & vegetable_rule + return animal_rule & artisan_rule & cooking_rule & fish_rule & forage_rule & fruit_rule & mineral_rule & vegetable_rule def can_win_fishing_competition(self) -> StardewRule: return self.logic.skill.can_fish(difficulty=60) diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index aa4cd075d3..3848e393d2 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -149,42 +149,37 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin # self.received("Deluxe Fertilizer Recipe") & self.has(MetalBar.iridium) & self.has(SVItem.sap), # | (self.ability.can_cook() & self.relationship.has_hearts(NPC.emily, 3) & self.has(Forageable.leek) & self.has(Forageable.dandelion) & # | (self.ability.can_cook() & self.relationship.has_hearts(NPC.jodi, 7) & self.has(AnimalProduct.cow_milk) & self.has(Ingredient.sugar)), - Animal.chicken: self.animal.can_buy_animal(Animal.chicken), - Animal.cow: self.animal.can_buy_animal(Animal.cow), - Animal.dinosaur: self.building.has_building(Building.big_coop) & self.has(AnimalProduct.dinosaur_egg), - Animal.duck: self.animal.can_buy_animal(Animal.duck), - Animal.goat: self.animal.can_buy_animal(Animal.goat), - Animal.ostrich: self.building.has_building(Building.barn) & self.has(AnimalProduct.ostrich_egg) & self.has(Machine.ostrich_incubator), - Animal.pig: self.animal.can_buy_animal(Animal.pig), - Animal.rabbit: self.animal.can_buy_animal(Animal.rabbit), - Animal.sheep: self.animal.can_buy_animal(Animal.sheep), AnimalProduct.any_egg: self.has_any(AnimalProduct.chicken_egg, AnimalProduct.duck_egg), AnimalProduct.brown_egg: self.animal.has_animal(Animal.chicken), AnimalProduct.chicken_egg: self.has_any(AnimalProduct.egg, AnimalProduct.brown_egg, AnimalProduct.large_egg, AnimalProduct.large_brown_egg), AnimalProduct.cow_milk: self.has_any(AnimalProduct.milk, AnimalProduct.large_milk), - AnimalProduct.duck_egg: self.animal.has_animal(Animal.duck), + AnimalProduct.duck_egg: self.animal.has_animal(Animal.duck), # Should also check starter AnimalProduct.duck_feather: self.animal.has_happy_animal(Animal.duck), - AnimalProduct.egg: self.animal.has_animal(Animal.chicken), - AnimalProduct.goat_milk: self.has(Animal.goat), - AnimalProduct.golden_egg: self.received(AnimalProduct.golden_egg) & (self.money.can_spend_at(Region.ranch, 100000) | self.money.can_trade_at(Region.qi_walnut_room, Currency.qi_gem, 100)), + AnimalProduct.egg: self.animal.has_animal(Animal.chicken), # Should also check starter + AnimalProduct.goat_milk: self.animal.has_animal(Animal.goat), + AnimalProduct.golden_egg: self.has(AnimalProduct.golden_egg_starter), # Should also check golden chicken if there was an alternative to obtain it without golden egg AnimalProduct.large_brown_egg: self.animal.has_happy_animal(Animal.chicken), AnimalProduct.large_egg: self.animal.has_happy_animal(Animal.chicken), AnimalProduct.large_goat_milk: self.animal.has_happy_animal(Animal.goat), AnimalProduct.large_milk: self.animal.has_happy_animal(Animal.cow), AnimalProduct.milk: self.animal.has_animal(Animal.cow), - AnimalProduct.ostrich_egg: self.tool.can_forage(Generic.any, Region.island_north, True) & self.has(Forageable.journal_scrap) & self.region.can_reach(Region.volcano_floor_5), AnimalProduct.rabbit_foot: self.animal.has_happy_animal(Animal.rabbit), AnimalProduct.roe: self.skill.can_fish() & self.building.has_building(Building.fish_pond), AnimalProduct.squid_ink: self.mine.can_mine_in_the_mines_floor_81_120() | (self.building.has_building(Building.fish_pond) & self.has(Fish.squid)), AnimalProduct.sturgeon_roe: self.has(Fish.sturgeon) & self.building.has_building(Building.fish_pond), AnimalProduct.truffle: self.animal.has_animal(Animal.pig) & self.season.has_any_not_winter(), - AnimalProduct.void_egg: self.money.can_spend_at(Region.sewer, 5000) | (self.building.has_building(Building.fish_pond) & self.has(Fish.void_salmon)), + AnimalProduct.void_egg: self.has(AnimalProduct.void_egg_starter), # Should also check void chicken if there was an alternative to obtain it without void egg AnimalProduct.wool: self.animal.has_animal(Animal.rabbit) | self.animal.has_animal(Animal.sheep), AnimalProduct.slime_egg_green: self.has(Machine.slime_egg_press) & self.has(Loot.slime), AnimalProduct.slime_egg_blue: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(3), AnimalProduct.slime_egg_red: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(6), AnimalProduct.slime_egg_purple: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(9), AnimalProduct.slime_egg_tiger: self.has(Fish.lionfish) & self.building.has_building(Building.fish_pond), + AnimalProduct.duck_egg_starter: self.logic.false_, # It could be purchased at the Feast of the Winter Star, but it's random every year, so not considering it yet... + AnimalProduct.dinosaur_egg_starter: self.logic.false_, # Dinosaur eggs are also part of the museum rules, and I don't want to touch them yet. + AnimalProduct.egg_starter: self.logic.false_, # It could be purchased at the Desert Festival, but festival logic is quite a mess, so not considering it yet... + AnimalProduct.golden_egg_starter: self.received(AnimalProduct.golden_egg) & (self.money.can_spend_at(Region.ranch, 100000) | self.money.can_trade_at(Region.qi_walnut_room, Currency.qi_gem, 100)), + AnimalProduct.void_egg_starter: self.money.can_spend_at(Region.sewer, 5000) | (self.building.has_building(Building.fish_pond) & self.has(Fish.void_salmon)), ArtisanGood.aged_roe: self.artisan.can_preserves_jar(AnimalProduct.roe), ArtisanGood.battery_pack: (self.has(Machine.lightning_rod) & self.season.has_any_not_winter()) | self.has(Machine.solar_panel), ArtisanGood.caviar: self.artisan.can_preserves_jar(AnimalProduct.sturgeon_roe), diff --git a/worlds/stardew_valley/logic/logic_and_mods_design.md b/worlds/stardew_valley/logic/logic_and_mods_design.md index 87631175b3..bf6684a354 100644 --- a/worlds/stardew_valley/logic/logic_and_mods_design.md +++ b/worlds/stardew_valley/logic/logic_and_mods_design.md @@ -72,4 +72,16 @@ of source (Monster drop and fish can have foraging sources). if easy logic is disabled. For instance, anything that requires money could be accessible as soon as you can sell something to someone (even wood). Items are classified by their source. An item with a fishing or a crab pot source is considered a fish, an item dropping from a monster is a monster drop. An -item with a foraging source is a forageable. Items can fit in multiple categories. +item with a foraging source is a forageable. Items can fit in multiple categories. + +## Prefer rich class to anemic list of sources + +For game mechanic that might need more logic/interaction than a simple game item, prefer creating a class than just listing the sources and adding generic +requirements to them. This will simplify the implementation of more complex mechanics and increase cohesion. + +For instance, `Building` can be upgraded. Instead of having a simple source for the `Big Coop` being a shop source with an additional requirement being having +the previous building, the `Building` class has knowledge of the upgrade system and know from which building it can be upgraded. + +Another example is `Animal`. Instead of a shopping source with a requirement of having a `Coop`, the `Chicken` knows that a building is required. This way, a +potential source of chicken from incubating an egg would not require an additional requirement of having a coop (assuming the incubator could be obtained +without a big coop). diff --git a/worlds/stardew_valley/logic/source_logic.py b/worlds/stardew_valley/logic/source_logic.py index f1c6fe3d7b..67ce55177c 100644 --- a/worlds/stardew_valley/logic/source_logic.py +++ b/worlds/stardew_valley/logic/source_logic.py @@ -1,6 +1,7 @@ import functools from typing import Union, Any, Iterable +from .animal_logic import AnimalLogicMixin from .artisan_logic import ArtisanLogicMixin from .base_logic import BaseLogicMixin, BaseLogic from .grind_logic import GrindLogicMixin @@ -11,6 +12,7 @@ from .received_logic import ReceivedLogicMixin from .region_logic import RegionLogicMixin from .requirement_logic import RequirementLogicMixin from .tool_logic import ToolLogicMixin +from ..data.animal import IncubatorSource, OstrichIncubatorSource from ..data.artisan import MachineSource from ..data.game_item import GenericSource, Source, GameItem, CustomRuleSource from ..data.harvest import ForagingSource, FruitBatsSource, MushroomCaveSource, SeasonalForagingSource, \ @@ -25,7 +27,7 @@ class SourceLogicMixin(BaseLogicMixin): class SourceLogic(BaseLogic[Union[SourceLogicMixin, HasLogicMixin, ReceivedLogicMixin, HarvestingLogicMixin, MoneyLogicMixin, RegionLogicMixin, -ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin]]): +ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin, AnimalLogicMixin]]): def has_access_to_item(self, item: GameItem): rules = [] @@ -81,6 +83,14 @@ ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin]]): def _(self, source: HarvestCropSource): return self.logic.harvesting.can_harvest_crop_from(source) + @has_access_to.register + def _(self, source: IncubatorSource): + return self.logic.animal.can_incubate(source.egg_item) + + @has_access_to.register + def _(self, source: OstrichIncubatorSource): + return self.logic.animal.can_ostrich_incubate(source.egg_item) + @has_access_to.register def _(self, source: MachineSource): return self.logic.artisan.can_produce_from(source) diff --git a/worlds/stardew_valley/strings/animal_names.py b/worlds/stardew_valley/strings/animal_names.py index ecae0d7680..59f2f3c9c7 100644 --- a/worlds/stardew_valley/strings/animal_names.py +++ b/worlds/stardew_valley/strings/animal_names.py @@ -8,6 +8,5 @@ class Animal: rabbit = "Rabbit" goat = "Goat" ostrich = "Ostrich" - -coop_animals = [Animal.chicken, "Rabbit", "Duck", "Dinosaur"] -barn_animals = [Animal.cow, "Sheep", "Pig", "Ostrich"] \ No newline at end of file + void_chicken = "Void Chicken" + golden_chicken = "Golden Chicken" diff --git a/worlds/stardew_valley/strings/animal_product_names.py b/worlds/stardew_valley/strings/animal_product_names.py index f89b610ae8..1b7490a607 100644 --- a/worlds/stardew_valley/strings/animal_product_names.py +++ b/worlds/stardew_valley/strings/animal_product_names.py @@ -3,17 +3,32 @@ class AnimalProduct: brown_egg = "Egg (Brown)" chicken_egg = "Chicken Egg" cow_milk = "Cow Milk" + dinosaur_egg_starter = "Dinosaur Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Dinosaur-and-egg problem.""" dinosaur_egg = "Dinosaur Egg" + duck_egg_starter = "Duck Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Chicken-and-egg problem.""" duck_egg = "Duck Egg" duck_feather = "Duck Feather" + egg_starter = "Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Chicken-and-egg problem.""" egg = "Egg" goat_milk = "Goat Milk" + golden_egg_starter = "Golden Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Chicken-and-egg problem.""" golden_egg = "Golden Egg" large_brown_egg = "Large Egg (Brown)" large_egg = "Large Egg" large_goat_milk = "Large Goat Milk" large_milk = "Large Milk" milk = "Milk" + ostrich_egg_starter = "Ostrich Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Chicken-and-egg problem.""" ostrich_egg = "Ostrich Egg" rabbit_foot = "Rabbit's Foot" roe = "Roe" @@ -25,6 +40,8 @@ class AnimalProduct: squid_ink = "Squid Ink" sturgeon_roe = "Sturgeon Roe" truffle = "Truffle" + void_egg_starter = "Void Egg (Starter)" + """This item does not really exist and should never end up being displayed. + It's there to patch the loop in logic because of the Chicken-and-egg problem.""" void_egg = "Void Egg" wool = "Wool" - diff --git a/worlds/stardew_valley/strings/metal_names.py b/worlds/stardew_valley/strings/metal_names.py index 7798c06def..7efdc7ed33 100644 --- a/worlds/stardew_valley/strings/metal_names.py +++ b/worlds/stardew_valley/strings/metal_names.py @@ -142,5 +142,3 @@ class ModFossil: pterodactyl_phalange = "Pterodactyl Phalange" pterodactyl_vertebra = "Pterodactyl Vertebra" pterodactyl_claw = "Pterodactyl Claw" - - From 543dcb27d85510f1eec01c3744172d41440c4cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sun, 20 Apr 2025 10:51:03 -0400 Subject: [PATCH 061/199] Stardew Valley: Exclude maximum one resource packs from pool when in start inventory (#4839) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/stardew_valley/__init__.py | 6 ++--- worlds/stardew_valley/data/items.csv | 4 +-- worlds/stardew_valley/items.py | 27 +++++++++---------- .../strings/wallet_item_names.py | 1 + worlds/stardew_valley/test/TestGeneration.py | 4 +-- worlds/stardew_valley/test/TestItemLink.py | 8 +++--- worlds/stardew_valley/test/TestItems.py | 18 ++++++++++++- 7 files changed, 42 insertions(+), 26 deletions(-) diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index bad0ab9e68..7f420eb81d 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,7 +1,7 @@ import logging import typing from random import Random -from typing import Dict, Any, Iterable, Optional, List, TextIO, cast +from typing import Dict, Any, Iterable, Optional, List, TextIO from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState from Options import PerGameCommonOptions @@ -148,8 +148,8 @@ class StardewValleyWorld(World): self.precollect_building_items() items_to_exclude = [excluded_items for excluded_items in self.multiworld.precollected_items[self.player] - if not item_table[excluded_items.name].has_any_group(Group.RESOURCE_PACK, - Group.FRIENDSHIP_PACK)] + if item_table[excluded_items.name].has_any_group(Group.MAXIMUM_ONE) + or not item_table[excluded_items.name].has_any_group(Group.RESOURCE_PACK, Group.FRIENDSHIP_PACK)] if self.options.season_randomization == SeasonRandomization.option_disabled: items_to_exclude = [item for item in items_to_exclude diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index 44e16c5d50..11a22e952d 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -748,7 +748,7 @@ id,name,classification,groups,mod_name 5208,Chest,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5209,Stone Chest,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5210,Quality Bobber,filler,RESOURCE_PACK, -5211,Mini-Obelisk,filler,"EXACTLY_TWO,RESOURCE_PACK", +5211,Mini-Obelisk,filler,"AT_LEAST_TWO,RESOURCE_PACK", 5212,Monster Musk,filler,RESOURCE_PACK, 5213,Sprinkler,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5214,Quality Sprinkler,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", @@ -760,7 +760,7 @@ id,name,classification,groups,mod_name 5220,Lightning Rod,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5221,Resource Pack: 5000 Money,useful,"BASE_RESOURCE,RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5222,Resource Pack: 10000 Money,useful,"BASE_RESOURCE,RESOURCE_PACK,RESOURCE_PACK_USEFUL", -5223,Junimo Chest,filler,"EXACTLY_TWO,RESOURCE_PACK", +5223,Junimo Chest,filler,"AT_LEAST_TWO,RESOURCE_PACK", 5224,Horse Flute,useful,"MAXIMUM_ONE,RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5225,Pierre's Missing Stocklist,useful,"MAXIMUM_ONE,RESOURCE_PACK,RESOURCE_PACK_USEFUL", 5226,Hopper,filler,"RESOURCE_PACK,RESOURCE_PACK_USEFUL", diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index b4b1175c1d..a0f901a209 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -69,7 +69,7 @@ class Group(enum.Enum): TRAP = enum.auto() BONUS = enum.auto() MAXIMUM_ONE = enum.auto() - EXACTLY_TWO = enum.auto() + AT_LEAST_TWO = enum.auto() DEPRECATED = enum.auto() RESOURCE_PACK_USEFUL = enum.auto() SPECIAL_ORDER_BOARD = enum.auto() @@ -181,7 +181,7 @@ def create_items(item_factory: StardewItemFactory, locations_count: int, items_t items += unique_filler_items logger.debug(f"Created {len(unique_filler_items)} unique filler items") - resource_pack_items = fill_with_resource_packs_and_traps(item_factory, options, random, items, locations_count) + resource_pack_items = fill_with_resource_packs_and_traps(item_factory, options, random, items + items_to_exclude, locations_count - len(items)) items += resource_pack_items logger.debug(f"Created {len(resource_pack_items)} resource packs") @@ -711,7 +711,7 @@ def weapons_count(options: StardewValleyOptions): def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options: StardewValleyOptions, random: Random, items_already_added: List[Item], - number_locations: int) -> List[Item]: + available_item_slots: int) -> List[Item]: include_traps = options.trap_items != TrapItems.option_no_traps items_already_added_names = [item.name for item in items_already_added] useful_resource_packs = [pack for pack in items_by_group[Group.RESOURCE_PACK_USEFUL] @@ -734,10 +734,9 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options priority_filler_items = remove_excluded_items(priority_filler_items, options) number_priority_items = len(priority_filler_items) - required_resource_pack = number_locations - len(items_already_added) - if required_resource_pack < number_priority_items: + if available_item_slots < number_priority_items: chosen_priority_items = [item_factory(resource_pack) for resource_pack in - random.sample(priority_filler_items, required_resource_pack)] + random.sample(priority_filler_items, available_item_slots)] return chosen_priority_items items = [] @@ -745,24 +744,24 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options ItemClassification.trap if resource_pack.classification == ItemClassification.trap else ItemClassification.useful) for resource_pack in priority_filler_items] items.extend(chosen_priority_items) - required_resource_pack -= number_priority_items + available_item_slots -= number_priority_items all_filler_packs = [filler_pack for filler_pack in all_filler_packs if Group.MAXIMUM_ONE not in filler_pack.groups or (filler_pack.name not in [priority_item.name for priority_item in priority_filler_items] and filler_pack.name not in items_already_added_names)] - while required_resource_pack > 0: + while available_item_slots > 0: resource_pack = random.choice(all_filler_packs) - exactly_2 = Group.EXACTLY_TWO in resource_pack.groups - while exactly_2 and required_resource_pack == 1: + exactly_2 = Group.AT_LEAST_TWO in resource_pack.groups + while exactly_2 and available_item_slots == 1: resource_pack = random.choice(all_filler_packs) - exactly_2 = Group.EXACTLY_TWO in resource_pack.groups + exactly_2 = Group.AT_LEAST_TWO in resource_pack.groups classification = ItemClassification.useful if resource_pack.classification == ItemClassification.progression else resource_pack.classification items.append(item_factory(resource_pack, classification)) - required_resource_pack -= 1 + available_item_slots -= 1 if exactly_2: items.append(item_factory(resource_pack, classification)) - required_resource_pack -= 1 + available_item_slots -= 1 if exactly_2 or Group.MAXIMUM_ONE in resource_pack.groups: all_filler_packs.remove(resource_pack) @@ -803,7 +802,7 @@ def generate_filler_choice_pool(options: StardewValleyOptions) -> list[str]: def remove_limited_amount_packs(packs): - return [pack for pack in packs if Group.MAXIMUM_ONE not in pack.groups and Group.EXACTLY_TWO not in pack.groups] + return [pack for pack in packs if Group.MAXIMUM_ONE not in pack.groups and Group.AT_LEAST_TWO not in pack.groups] def get_all_filler_items(include_traps: bool, exclude_ginger_island: bool) -> List[ItemData]: diff --git a/worlds/stardew_valley/strings/wallet_item_names.py b/worlds/stardew_valley/strings/wallet_item_names.py index 32655efe88..743d1f0c01 100644 --- a/worlds/stardew_valley/strings/wallet_item_names.py +++ b/worlds/stardew_valley/strings/wallet_item_names.py @@ -9,3 +9,4 @@ class Wallet: dark_talisman = "Dark Talisman" club_card = "Club Card" mastery_of_the_five_ways = "Mastery Of The Five Ways" + key_to_the_town = "Key To The Town" diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 35cd2007eb..77092c78fc 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -66,7 +66,7 @@ class TestBaseItemGeneration(SVTestBase): def test_does_not_create_or_create_two_of_exactly_two_items(self): all_created_items = self.get_all_created_items() - for exactly_two_item in items.items_by_group[items.Group.EXACTLY_TWO]: + for exactly_two_item in items.items_by_group[items.Group.AT_LEAST_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) self.assertTrue(count == 0 or count == 2) @@ -114,7 +114,7 @@ class TestNoGingerIslandItemGeneration(SVTestBase): def test_does_not_create_exactly_two_items(self): all_created_items = self.get_all_created_items() - for exactly_two_item in items.items_by_group[items.Group.EXACTLY_TWO]: + for exactly_two_item in items.items_by_group[items.Group.AT_LEAST_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) self.assertTrue(count == 0 or count == 2) diff --git a/worlds/stardew_valley/test/TestItemLink.py b/worlds/stardew_valley/test/TestItemLink.py index 39bf553cab..3a0d976511 100644 --- a/worlds/stardew_valley/test/TestItemLink.py +++ b/worlds/stardew_valley/test/TestItemLink.py @@ -19,7 +19,7 @@ class TestItemLinksEverythingIncluded(SVTestBase): continue filler_generated.append(filler) self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) - self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + self.assertNotIn(Group.AT_LEAST_TWO, item_table[filler].groups) if Group.TRAP in item_table[filler].groups: at_least_one_trap = True if Group.GINGER_ISLAND in item_table[filler].groups: @@ -46,7 +46,7 @@ class TestItemLinksNoIsland(SVTestBase): filler_generated.append(filler) self.assertNotIn(Group.GINGER_ISLAND, item_table[filler].groups) self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) - self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + self.assertNotIn(Group.AT_LEAST_TWO, item_table[filler].groups) if Group.TRAP in item_table[filler].groups: at_least_one_trap = True if len(filler_generated) >= max_number_filler: @@ -70,7 +70,7 @@ class TestItemLinksNoTraps(SVTestBase): filler_generated.append(filler) self.assertNotIn(Group.TRAP, item_table[filler].groups) self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) - self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + self.assertNotIn(Group.AT_LEAST_TWO, item_table[filler].groups) if Group.GINGER_ISLAND in item_table[filler].groups: at_least_one_island = True if len(filler_generated) >= max_number_filler: @@ -94,7 +94,7 @@ class TestItemLinksNoTrapsAndIsland(SVTestBase): self.assertNotIn(Group.GINGER_ISLAND, item_table[filler].groups) self.assertNotIn(Group.TRAP, item_table[filler].groups) self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) - self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + self.assertNotIn(Group.AT_LEAST_TWO, item_table[filler].groups) if len(filler_generated) >= max_number_filler: break self.assertGreaterEqual(len(filler_generated), max_number_filler) diff --git a/worlds/stardew_valley/test/TestItems.py b/worlds/stardew_valley/test/TestItems.py index 9cff146597..1d6f968955 100644 --- a/worlds/stardew_valley/test/TestItems.py +++ b/worlds/stardew_valley/test/TestItems.py @@ -1,4 +1,4 @@ -from BaseClasses import MultiWorld, get_seed +from BaseClasses import MultiWorld, get_seed, ItemClassification from . import setup_solo_multiworld, SVTestCase, solo_multiworld from .options.presets import allsanity_no_mods_6_x_x, get_minsanity_options from .. import StardewValleyWorld @@ -72,6 +72,22 @@ class TestItems(SVTestCase): self.assertEqual(len(starting_seasons_rolled), 4) +class TestStartInventoryFillersAreProperlyExcluded(SVTestCase): + def test_given_maximum_one_resource_pack_in_start_inventory_when_create_items_then_item_is_properly_excluded(self): + assert item_table[Wallet.key_to_the_town].classification == ItemClassification.useful \ + and {Group.MAXIMUM_ONE, Group.RESOURCE_PACK_USEFUL}.issubset(item_table[Wallet.key_to_the_town].groups), \ + "'Key to the Town' is no longer suitable to test this usecase." + + options = { + "start_inventory": { + Wallet.key_to_the_town: 1, + } + } + + with solo_multiworld(options, world_caching=False) as (multiworld, world): + self.assertNotIn(world.create_item(Wallet.key_to_the_town), multiworld.get_items()) + + class TestMetalDetectors(SVTestCase): def test_minsanity_1_metal_detector(self): options = get_minsanity_options() From b59162737d7c6b379bf0963ec664208cdc153dfe Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 20 Apr 2025 23:04:40 +0200 Subject: [PATCH 062/199] LttP: increase gen rate of pedestal goal with limited rupee pool (#4905) * LttP: increase gen rate of pedestal goal with limited rupee pool * improve chance further if retro bow is involved --- worlds/alttp/ItemPool.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 2b99ef8a73..0bcc189f9c 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -707,13 +707,20 @@ def get_pool_core(world, player: int): else: break - if goal == 'pedestal': - place_item('Master Sword Pedestal', 'Triforce') - pool.remove("Rupees (20)") - if retro_bow: replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)', 'Arrow Upgrade (70)'} pool = ['Rupees (5)' if item in replace else item for item in pool] + + if goal == 'pedestal': + place_item('Master Sword Pedestal', 'Triforce') + for rupee_name in ("Rupees (5)", "Rupees (20)", "Rupees (50)", "Rupees (100)", "Rupees (300)"): + try: + pool.remove(rupee_name) + except ValueError: + pass + else: + break + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: pool.extend(diff.universal_keys) if mode == 'standard': From b62c1364a9c6c211a25fdfd0fe6ec01c55fda225 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 21 Apr 2025 00:43:05 +0200 Subject: [PATCH 063/199] MultiServer.py: Another Hint Priority + Item Links bug oh boy (#4874) Basically, hints for itemlink worlds' locations get stored in ctx.hints under 1. the location's player 2. **every individual player** that is participating in the itemlink. Right now, the updatehint code tries to replace and resend the hint under the itemlinked player, which doesn't work. --- MultiServer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index c9e0ad8bfa..4295f28c58 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1983,11 +1983,13 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): new_hint = new_hint.re_prioritize(ctx, status) if hint == new_hint: return - ctx.replace_hint(client.team, hint.finding_player, hint, new_hint) - ctx.replace_hint(client.team, hint.receiving_player, hint, new_hint) + + concerning_slots = ctx.slot_set(hint.receiving_player) | {hint.finding_player} + for slot in concerning_slots: + ctx.replace_hint(client.team, slot, hint, new_hint) ctx.save() - ctx.on_changed_hints(client.team, hint.finding_player) - ctx.on_changed_hints(client.team, hint.receiving_player) + for slot in concerning_slots: + ctx.on_changed_hints(client.team, slot) elif cmd == 'StatusUpdate': update_client_status(ctx, client, args["status"]) From 1a6de25ab6b83fe28ec3031a5bd4815f72182da1 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 21 Apr 2025 00:43:31 +0200 Subject: [PATCH 064/199] Core, all worlds: Hard-deprecate old options API (by August 10th 2024) (#3284) * Core: deprecate old options API * also deprecate assigning options via option_definitions --------- Co-authored-by: alwaysintreble --- BaseClasses.py | 2 +- worlds/AutoWorld.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index ec3fa9cef1..bf115e3f9c 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -223,7 +223,7 @@ class MultiWorld(): AutoWorld.AutoWorldRegister.world_types[self.game[player]].options_dataclass.type_hints} for option_key in all_keys: option = Utils.DeprecateDict(f"Getting options from multiworld is now deprecated. " - f"Please use `self.options.{option_key}` instead.") + f"Please use `self.options.{option_key}` instead.", True) option.update(getattr(args, option_key, {})) setattr(self, option_key, option) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index d1f4a772ee..b4ff24190f 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -12,6 +12,7 @@ from typing import (Any, Callable, ClassVar, Dict, FrozenSet, Iterable, List, Ma from Options import item_and_loc_options, ItemsAccessibility, OptionGroup, PerGameCommonOptions from BaseClasses import CollectionState +from Utils import deprecate if TYPE_CHECKING: from BaseClasses import MultiWorld, Item, Location, Tutorial, Region, Entrance @@ -75,9 +76,8 @@ class AutoWorldRegister(type): # TODO - remove this once all worlds use options dataclasses if "options_dataclass" not in dct and "option_definitions" in dct: # TODO - switch to deprecate after a version - if __debug__: - logging.warning(f"{name} Assigned options through option_definitions which is now deprecated. " - "Please use options_dataclass instead.") + deprecate(f"{name} Assigned options through option_definitions which is now deprecated. " + "Please use options_dataclass instead.") dct["options_dataclass"] = make_dataclass(f"{name}Options", dct["option_definitions"].items(), bases=(PerGameCommonOptions,)) From 6613c296523185ffd4ea9c37c4c6ffe21e797935 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 21 Apr 2025 00:53:40 +0200 Subject: [PATCH 065/199] Core: print both world source paths in case of conflict (#4751) --- worlds/AutoWorld.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index b4ff24190f..67455a1a21 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -83,11 +83,13 @@ class AutoWorldRegister(type): # construct class new_class = super().__new__(mcs, name, bases, dct) + new_class.__file__ = sys.modules[new_class.__module__].__file__ if "game" in dct: if dct["game"] in AutoWorldRegister.world_types: - raise RuntimeError(f"""Game {dct["game"]} already registered.""") + raise RuntimeError(f"""Game {dct["game"]} already registered in + {AutoWorldRegister.world_types[dct["game"]].__file__} when attempting to register from + {new_class.__file__}.""") AutoWorldRegister.world_types[dct["game"]] = new_class - new_class.__file__ = sys.modules[new_class.__module__].__file__ if ".apworld" in new_class.__file__: new_class.zip_path = pathlib.Path(new_class.__file__).parents[1] if "settings_key" not in dct: From d5d56ede8bfa71b7ec4818b2467fbe16354c82d7 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 21 Apr 2025 15:20:22 -0400 Subject: [PATCH 066/199] TUNIC: Remove Outdated Plando Code (#4908) --- worlds/tunic/__init__.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 86a91a336b..29791b4f43 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -678,18 +678,6 @@ class TunicWorld(World): for _ in range(self.options.start_inventory_from_pool[start_item]): slot_data[start_item].extend(["Your Pocket", self.player]) - for plando_item in self.multiworld.plando_items[self.player]: - if plando_item["from_pool"]: - items_to_find = set() - for item_type in [key for key in ["item", "items"] if key in plando_item]: - for item in plando_item[item_type]: - items_to_find.add(item) - for item in items_to_find: - if item in slot_data_item_names: - slot_data[item] = [] - for item_location in self.multiworld.find_item_locations(item, self.player): - slot_data[item].extend(self.get_real_location(item_location)) - return slot_data # for the universal tracker, doesn't get called in standard gen From d309de25570e5132388aee1fecc569f77dce4975 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 21 Apr 2025 16:06:24 -0400 Subject: [PATCH 067/199] Lingo: Rework Early Good Items (#4910) --- worlds/lingo/__init__.py | 37 ++++++++++++++++++++++++---------- worlds/lingo/player_logic.py | 39 ++++++++---------------------------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/worlds/lingo/__init__.py b/worlds/lingo/__init__.py index 05509a394b..c27aaed73a 100644 --- a/worlds/lingo/__init__.py +++ b/worlds/lingo/__init__.py @@ -3,7 +3,7 @@ Archipelago init file for Lingo """ from logging import warning -from BaseClasses import CollectionState, Item, ItemClassification, Tutorial +from BaseClasses import CollectionState, Item, ItemClassification, Tutorial, Location, LocationProgressType from Options import OptionError from worlds.AutoWorld import WebWorld, World from .datatypes import Room, RoomEntrance @@ -80,10 +80,6 @@ class LingoWorld(World): for item in self.player_logic.real_items: state.collect(self.create_item(item), True) - # Exception to the above: a forced good item is not considered a "real item", but needs to be here anyway. - if self.player_logic.forced_good_item != "": - state.collect(self.create_item(self.player_logic.forced_good_item), True) - all_locations = self.multiworld.get_locations(self.player) state.sweep_for_advancements(locations=all_locations) @@ -105,11 +101,6 @@ class LingoWorld(World): def create_items(self): pool = [self.create_item(name) for name in self.player_logic.real_items] - if self.player_logic.forced_good_item != "": - new_item = self.create_item(self.player_logic.forced_good_item) - location_obj = self.multiworld.get_location("Second Room - Good Luck", self.player) - location_obj.place_locked_item(new_item) - item_difference = len(self.player_logic.real_locations) - len(pool) if item_difference: trap_percentage = self.options.trap_percentage @@ -138,7 +129,7 @@ class LingoWorld(World): trap_counts = {name: int(weight * traps / total_weight) for name, weight in self.options.trap_weights.items()} - + trap_difference = traps - sum(trap_counts.values()) if trap_difference > 0: allowed_traps = [name for name in TRAP_ITEMS if self.options.trap_weights[name] > 0] @@ -169,6 +160,30 @@ class LingoWorld(World): def set_rules(self): self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) + def place_good_item(self, progitempool: list[Item], fill_locations: list[Location]): + if len(self.player_logic.good_item_options) == 0: + return + + good_location = self.get_location("Second Room - Good Luck") + if good_location.progress_type == LocationProgressType.EXCLUDED or good_location not in fill_locations: + return + + good_items = list(filter(lambda progitem: progitem.player == self.player and + progitem.name in self.player_logic.good_item_options, progitempool)) + + if len(good_items) == 0: + return + + good_item = self.random.choice(good_items) + good_location.place_locked_item(good_item) + + progitempool.remove(good_item) + fill_locations.remove(good_location) + + def fill_hook(self, progitempool: list[Item], usefulitempool: list[Item], filleritempool: list[Item], + fill_locations: list[Location]): + self.place_good_item(progitempool, fill_locations) + def fill_slot_data(self): slot_options = [ "death_link", "victory_condition", "shuffle_colors", "shuffle_doors", "shuffle_paintings", "shuffle_panels", diff --git a/worlds/lingo/player_logic.py b/worlds/lingo/player_logic.py index 83217d7311..9363dfedb6 100644 --- a/worlds/lingo/player_logic.py +++ b/worlds/lingo/player_logic.py @@ -95,7 +95,7 @@ class LingoPlayerLogic: painting_mapping: Dict[str, str] - forced_good_item: str + good_item_options: List[str] panel_reqs: Dict[str, Dict[str, AccessRequirements]] door_reqs: Dict[str, Dict[str, AccessRequirements]] @@ -151,7 +151,7 @@ class LingoPlayerLogic: self.mastery_location = "" self.level_2_location = "" self.painting_mapping = {} - self.forced_good_item = "" + self.good_item_options = [] self.panel_reqs = {} self.door_reqs = {} self.mastery_reqs = [] @@ -344,23 +344,23 @@ class LingoPlayerLogic: # Starting Room - Back Right Door gives access to OPEN and DEAD END. # Starting Room - Exit Door gives access to OPEN and TRACE. - good_item_options: List[str] = ["Starting Room - Back Right Door", "Second Room - Exit Door"] + self.good_item_options = ["Starting Room - Back Right Door", "Second Room - Exit Door"] if not color_shuffle: if not world.options.enable_pilgrimage: # HOT CRUST and THIS. - good_item_options.append("Pilgrim Room - Sun Painting") + self.good_item_options.append("Pilgrim Room - Sun Painting") if world.options.group_doors: # WELCOME BACK, CLOCKWISE, and DRAWL + RUNS. - good_item_options.append("Welcome Back Doors") + self.good_item_options.append("Welcome Back Doors") else: # WELCOME BACK and CLOCKWISE. - good_item_options.append("Welcome Back Area - Shortcut to Starting Room") + self.good_item_options.append("Welcome Back Area - Shortcut to Starting Room") if world.options.group_doors: # Color hallways access (NOTE: reconsider when sunwarp shuffling exists). - good_item_options.append("Rhyme Room Doors") + self.good_item_options.append("Rhyme Room Doors") # When painting shuffle is off, most Starting Room paintings give color hallways access. The Wondrous's # painting does not, but it gives access to SHRINK and WELCOME BACK. @@ -376,30 +376,7 @@ class LingoPlayerLogic: continue pdoor = DOORS_BY_ROOM[painting_obj.required_door.room][painting_obj.required_door.door] - good_item_options.append(pdoor.item_name) - - # Copied from The Witness -- remove any plandoed items from the possible good items set. - for v in world.multiworld.plando_items[world.player]: - if v.get("from_pool", True): - for item_key in {"item", "items"}: - if item_key in v: - if type(v[item_key]) is str: - if v[item_key] in good_item_options: - good_item_options.remove(v[item_key]) - elif type(v[item_key]) is dict: - for item, weight in v[item_key].items(): - if weight and item in good_item_options: - good_item_options.remove(item) - else: - # Other type of iterable - for item in v[item_key]: - if item in good_item_options: - good_item_options.remove(item) - - if len(good_item_options) > 0: - self.forced_good_item = world.random.choice(good_item_options) - self.real_items.remove(self.forced_good_item) - self.real_locations.remove("Second Room - Good Luck") + self.good_item_options.append(pdoor.item_name) def randomize_paintings(self, world: "LingoWorld") -> bool: self.painting_mapping.clear() From 57d3c52df96a8af1980397b140e91477893712d2 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 21 Apr 2025 17:41:20 -0400 Subject: [PATCH 068/199] TUNIC: More varied reserved locations for local_fill option (#4653) * Make reserved locations more varied * Use CollectionState(self.multiworld) instead of whatever it used to be --- worlds/tunic/__init__.py | 7 ++++--- worlds/tunic/locations.py | 17 ----------------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 29791b4f43..9d97e5711b 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -3,7 +3,7 @@ from logging import warning from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState from .items import (item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names, combat_items) -from .locations import location_table, location_name_groups, standard_location_name_to_id, hexagon_locations, sphere_one +from .locations import location_table, location_name_groups, standard_location_name_to_id, hexagon_locations from .rules import set_location_rules, set_region_rules, randomize_ability_unlocks, gold_hexagon from .er_rules import set_er_location_rules from .regions import tunic_regions @@ -451,9 +451,10 @@ class TunicWorld(World): def pre_fill(self) -> None: if self.options.local_fill > 0 and self.multiworld.players > 1: # we need to reserve a couple locations so that we don't fill up every sphere 1 location - reserved_locations: Set[str] = set(self.random.sample(sphere_one, 2)) + sphere_one_locs = self.multiworld.get_reachable_locations(CollectionState(self.multiworld), self.player) + reserved_locations: Set[Location] = set(self.random.sample(sphere_one_locs, 2)) viable_locations = [loc for loc in self.multiworld.get_unfilled_locations(self.player) - if loc.name not in reserved_locations + if loc not in reserved_locations and loc.name not in self.options.priority_locations.value] if len(viable_locations) < self.amount_to_local_fill: diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index 18c0fb3c13..ced3d2233b 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -322,23 +322,6 @@ hexagon_locations: Dict[str, str] = { "Blue Questagon": "Rooted Ziggurat Lower - Hexagon Blue", } -sphere_one: List[str] = [ - "Overworld - [Central] Chest Across From Well", - "Overworld - [Northwest] Chest Near Quarry Gate", - "Overworld - [Northwest] Shadowy Corner Chest", - "Overworld - [Southwest] Chest Guarded By Turret", - "Overworld - [Southwest] South Chest Near Guard", - "Overworld - [Southwest] Obscured in Tunnel to Beach", - "Overworld - [Northwest] Chest Near Turret", - "Overworld - [Northwest] Page By Well", - "Overworld - [West] Chest Behind Moss Wall", - "Overworld - [Southwest] Key Pickup", - "Overworld - [West] Key Pickup", - "Overworld - [West] Obscured Behind Windmill", - "Overworld - [West] Obscured Near Well", - "Overworld - [West] Page On Teleporter" -] - standard_location_name_to_id: Dict[str, int] = {name: location_base_id + index for index, name in enumerate(location_table)} all_locations = location_table.copy() From bad6a4b211f99d9f439a9971b78e1d06e9f05fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Wed, 23 Apr 2025 11:31:08 -0400 Subject: [PATCH 069/199] Stardew Valley: remove BaseLogic generic so importing mixins is no longer needed (#4916) * remove BaseLogic generic so importing mixins is no longer needed * self review --- worlds/stardew_valley/logic/ability_logic.py | 17 +------------- worlds/stardew_valley/logic/action_logic.py | 8 +------ worlds/stardew_valley/logic/animal_logic.py | 7 +----- worlds/stardew_valley/logic/arcade_logic.py | 6 +---- worlds/stardew_valley/logic/artisan_logic.py | 6 +---- worlds/stardew_valley/logic/base_logic.py | 16 +++++++------ worlds/stardew_valley/logic/book_logic.py | 6 +---- worlds/stardew_valley/logic/building_logic.py | 12 +--------- worlds/stardew_valley/logic/bundle_logic.py | 14 ++--------- worlds/stardew_valley/logic/combat_logic.py | 7 +----- worlds/stardew_valley/logic/cooking_logic.py | 13 +---------- worlds/stardew_valley/logic/crafting_logic.py | 13 +---------- worlds/stardew_valley/logic/farming_logic.py | 9 +++----- worlds/stardew_valley/logic/festival_logic.py | 19 +-------------- worlds/stardew_valley/logic/fishing_logic.py | 14 ++--------- worlds/stardew_valley/logic/gift_logic.py | 3 +-- worlds/stardew_valley/logic/goal_logic.py | 9 +------- worlds/stardew_valley/logic/grind_logic.py | 2 +- .../stardew_valley/logic/harvesting_logic.py | 11 +-------- worlds/stardew_valley/logic/has_logic.py | 2 +- .../logic/logic_and_mods_design.md | 2 +- worlds/stardew_valley/logic/mine_logic.py | 12 +--------- worlds/stardew_valley/logic/money_logic.py | 17 +------------- worlds/stardew_valley/logic/monster_logic.py | 2 +- worlds/stardew_valley/logic/museum_logic.py | 2 +- worlds/stardew_valley/logic/pet_logic.py | 7 +----- worlds/stardew_valley/logic/quality_logic.py | 2 +- worlds/stardew_valley/logic/quest_logic.py | 21 ++--------------- worlds/stardew_valley/logic/received_logic.py | 2 +- worlds/stardew_valley/logic/region_logic.py | 2 +- .../logic/relationship_logic.py | 16 +------------ .../stardew_valley/logic/requirement_logic.py | 18 ++------------- worlds/stardew_valley/logic/season_logic.py | 2 +- worlds/stardew_valley/logic/shipping_logic.py | 2 +- worlds/stardew_valley/logic/skill_logic.py | 18 +-------------- worlds/stardew_valley/logic/source_logic.py | 15 ++---------- .../logic/special_order_logic.py | 23 ++----------------- worlds/stardew_valley/logic/time_logic.py | 2 +- worlds/stardew_valley/logic/tool_logic.py | 8 +------ .../logic/traveling_merchant_logic.py | 2 +- worlds/stardew_valley/logic/wallet_logic.py | 2 +- worlds/stardew_valley/logic/walnut_logic.py | 9 +------- .../mods/logic/deepwoods_logic.py | 13 ++--------- .../mods/logic/elevator_logic.py | 3 +-- .../stardew_valley/mods/logic/item_logic.py | 22 ++---------------- .../stardew_valley/mods/logic/magic_logic.py | 7 +----- .../stardew_valley/mods/logic/quests_logic.py | 13 ++--------- .../stardew_valley/mods/logic/skills_logic.py | 16 +------------ .../mods/logic/special_orders_logic.py | 14 +---------- worlds/stardew_valley/mods/logic/sve_logic.py | 19 ++------------- 50 files changed, 70 insertions(+), 417 deletions(-) diff --git a/worlds/stardew_valley/logic/ability_logic.py b/worlds/stardew_valley/logic/ability_logic.py index 2038d995a7..52dbd5abaf 100644 --- a/worlds/stardew_valley/logic/ability_logic.py +++ b/worlds/stardew_valley/logic/ability_logic.py @@ -1,23 +1,9 @@ -import typing -from typing import Union - from .base_logic import BaseLogicMixin, BaseLogic -from .mine_logic import MineLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .skill_logic import SkillLogicMixin -from .tool_logic import ToolLogicMixin -from ..mods.logic.magic_logic import MagicLogicMixin from ..stardew_rule import StardewRule from ..strings.region_names import Region from ..strings.skill_names import Skill, ModSkill from ..strings.tool_names import ToolMaterial, Tool -if typing.TYPE_CHECKING: - from ..mods.logic.mod_logic import ModLogicMixin -else: - ModLogicMixin = object - class AbilityLogicMixin(BaseLogicMixin): def __init__(self, *args, **kwargs): @@ -25,8 +11,7 @@ class AbilityLogicMixin(BaseLogicMixin): self.ability = AbilityLogic(*args, **kwargs) -class AbilityLogic(BaseLogic[Union[AbilityLogicMixin, RegionLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, MineLogicMixin, MagicLogicMixin, -ModLogicMixin]]): +class AbilityLogic(BaseLogic): def can_mine_perfectly(self) -> StardewRule: return self.logic.mine.can_progress_in_the_mines_from_floor(160) diff --git a/worlds/stardew_valley/logic/action_logic.py b/worlds/stardew_valley/logic/action_logic.py index 5b117de68c..64cb18c001 100644 --- a/worlds/stardew_valley/logic/action_logic.py +++ b/worlds/stardew_valley/logic/action_logic.py @@ -1,11 +1,5 @@ -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .tool_logic import ToolLogicMixin from ..stardew_rule import StardewRule, True_ from ..strings.generic_names import Generic from ..strings.geode_names import Geode @@ -19,7 +13,7 @@ class ActionLogicMixin(BaseLogicMixin): self.action = ActionLogic(*args, **kwargs) -class ActionLogic(BaseLogic[Union[ActionLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, ToolLogicMixin]]): +class ActionLogic(BaseLogic): def can_watch(self, channel: str = None): tv_rule = True_() diff --git a/worlds/stardew_valley/logic/animal_logic.py b/worlds/stardew_valley/logic/animal_logic.py index 071133d5ce..701cdeb1aa 100644 --- a/worlds/stardew_valley/logic/animal_logic.py +++ b/worlds/stardew_valley/logic/animal_logic.py @@ -6,11 +6,6 @@ from ..strings.building_names import Building from ..strings.forageable_names import Forageable from ..strings.machine_names import Machine -if typing.TYPE_CHECKING: - from .logic import StardewLogic -else: - StardewLogic = object - class AnimalLogicMixin(BaseLogicMixin): def __init__(self, *args, **kwargs): @@ -18,7 +13,7 @@ class AnimalLogicMixin(BaseLogicMixin): self.animal = AnimalLogic(*args, **kwargs) -class AnimalLogic(BaseLogic[StardewLogic]): +class AnimalLogic(BaseLogic): def can_incubate(self, egg_item: str) -> StardewRule: return self.logic.building.has_building(Building.coop) & self.logic.has(egg_item) diff --git a/worlds/stardew_valley/logic/arcade_logic.py b/worlds/stardew_valley/logic/arcade_logic.py index 5e6a02a184..74a2396410 100644 --- a/worlds/stardew_valley/logic/arcade_logic.py +++ b/worlds/stardew_valley/logic/arcade_logic.py @@ -1,8 +1,4 @@ -from typing import Union - from .base_logic import BaseLogic, BaseLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin from .. import options from ..stardew_rule import StardewRule, True_ from ..strings.region_names import Region @@ -14,7 +10,7 @@ class ArcadeLogicMixin(BaseLogicMixin): self.arcade = ArcadeLogic(*args, **kwargs) -class ArcadeLogic(BaseLogic[Union[ArcadeLogicMixin, RegionLogicMixin, ReceivedLogicMixin]]): +class ArcadeLogic(BaseLogic): def has_jotpk_power_level(self, power_level: int) -> StardewRule: if self.options.arcade_machine_locations != options.ArcadeMachineLocations.option_full_shuffling: diff --git a/worlds/stardew_valley/logic/artisan_logic.py b/worlds/stardew_valley/logic/artisan_logic.py index 23f0ae03b7..93c45530af 100644 --- a/worlds/stardew_valley/logic/artisan_logic.py +++ b/worlds/stardew_valley/logic/artisan_logic.py @@ -1,8 +1,4 @@ -from typing import Union - from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin -from .time_logic import TimeLogicMixin from ..data.artisan import MachineSource from ..data.game_item import ItemTag from ..stardew_rule import StardewRule @@ -20,7 +16,7 @@ class ArtisanLogicMixin(BaseLogicMixin): self.artisan = ArtisanLogic(*args, **kwargs) -class ArtisanLogic(BaseLogic[Union[ArtisanLogicMixin, TimeLogicMixin, HasLogicMixin]]): +class ArtisanLogic(BaseLogic): def initialize_rules(self): # TODO remove this one too once fish are converted to sources self.registry.artisan_good_rules.update({ArtisanGood.specific_smoked_fish(fish): self.can_smoke(fish) for fish in all_fish}) diff --git a/worlds/stardew_valley/logic/base_logic.py b/worlds/stardew_valley/logic/base_logic.py index 761ee54157..dce1c328a7 100644 --- a/worlds/stardew_valley/logic/base_logic.py +++ b/worlds/stardew_valley/logic/base_logic.py @@ -1,11 +1,15 @@ from __future__ import annotations -from typing import TypeVar, Generic, Dict, Collection +import typing +from typing import Dict, Collection from ..content.game_content import StardewContent from ..options import StardewValleyOptions from ..stardew_rule import StardewRule +if typing.TYPE_CHECKING: + from .logic import StardewLogic + class LogicRegistry: @@ -30,18 +34,16 @@ class BaseLogicMixin: pass -T = TypeVar("T", bound=BaseLogicMixin) - - -class BaseLogic(BaseLogicMixin, Generic[T]): +class BaseLogic(BaseLogicMixin): player: int registry: LogicRegistry options: StardewValleyOptions content: StardewContent regions: Collection[str] - logic: T + logic: StardewLogic - def __init__(self, player: int, registry: LogicRegistry, options: StardewValleyOptions, content: StardewContent, regions: Collection[str], logic: T): + def __init__(self, player: int, registry: LogicRegistry, options: StardewValleyOptions, content: StardewContent, regions: Collection[str], + logic: StardewLogic): super().__init__(player, registry, options, content, regions, logic) self.player = player self.registry = registry diff --git a/worlds/stardew_valley/logic/book_logic.py b/worlds/stardew_valley/logic/book_logic.py index 464056ee06..50cc38587b 100644 --- a/worlds/stardew_valley/logic/book_logic.py +++ b/worlds/stardew_valley/logic/book_logic.py @@ -1,9 +1,5 @@ -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin from ..stardew_rule import StardewRule @@ -13,7 +9,7 @@ class BookLogicMixin(BaseLogicMixin): self.book = BookLogic(*args, **kwargs) -class BookLogic(BaseLogic[Union[ReceivedLogicMixin, HasLogicMixin]]): +class BookLogic(BaseLogic): @cache_self1 def has_book_power(self, book: str) -> StardewRule: diff --git a/worlds/stardew_valley/logic/building_logic.py b/worlds/stardew_valley/logic/building_logic.py index 58a375d046..0d96f216e0 100644 --- a/worlds/stardew_valley/logic/building_logic.py +++ b/worlds/stardew_valley/logic/building_logic.py @@ -1,21 +1,11 @@ -import typing from functools import cached_property -from typing import Union from Utils import cache_self1 from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin from ..stardew_rule import StardewRule, true_ from ..strings.building_names import Building from ..strings.region_names import Region -if typing.TYPE_CHECKING: - from .source_logic import SourceLogicMixin -else: - SourceLogicMixin = object - AUTO_BUILDING_BUILDINGS = {Building.shipping_bin, Building.pet_bowl, Building.farm_house} @@ -25,7 +15,7 @@ class BuildingLogicMixin(BaseLogicMixin): self.building = BuildingLogic(*args, **kwargs) -class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SourceLogicMixin]]): +class BuildingLogic(BaseLogic): @cache_self1 def can_build(self, building_name: str) -> StardewRule: diff --git a/worlds/stardew_valley/logic/bundle_logic.py b/worlds/stardew_valley/logic/bundle_logic.py index 8ede4de5e7..9af91c731c 100644 --- a/worlds/stardew_valley/logic/bundle_logic.py +++ b/worlds/stardew_valley/logic/bundle_logic.py @@ -1,16 +1,7 @@ from functools import cached_property -from typing import Union, List +from typing import List from .base_logic import BaseLogicMixin, BaseLogic -from .fishing_logic import FishingLogicMixin -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .quality_logic import QualityLogicMixin -from .quest_logic import QuestLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .skill_logic import SkillLogicMixin -from .time_logic import TimeLogicMixin from ..bundles.bundle import Bundle from ..stardew_rule import StardewRule, True_ from ..strings.ap_names.community_upgrade_names import CommunityUpgrade @@ -27,8 +18,7 @@ class BundleLogicMixin(BaseLogicMixin): self.bundle = BundleLogic(*args, **kwargs) -class BundleLogic(BaseLogic[Union[ReceivedLogicMixin, HasLogicMixin, TimeLogicMixin, RegionLogicMixin, MoneyLogicMixin, QualityLogicMixin, FishingLogicMixin, -SkillLogicMixin, QuestLogicMixin]]): +class BundleLogic(BaseLogic): # Should be cached def can_complete_bundle(self, bundle: Bundle) -> StardewRule: item_rules = [] diff --git a/worlds/stardew_valley/logic/combat_logic.py b/worlds/stardew_valley/logic/combat_logic.py index 849bf14b22..14e8978de2 100644 --- a/worlds/stardew_valley/logic/combat_logic.py +++ b/worlds/stardew_valley/logic/combat_logic.py @@ -1,12 +1,7 @@ from functools import cached_property -from typing import Union from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from ..mods.logic.magic_logic import MagicLogicMixin from ..stardew_rule import StardewRule, False_ from ..strings.ap_names.ap_weapon_names import APWeapon from ..strings.performance_names import Performance @@ -20,7 +15,7 @@ class CombatLogicMixin(BaseLogicMixin): self.combat = CombatLogic(*args, **kwargs) -class CombatLogic(BaseLogic[Union[HasLogicMixin, CombatLogicMixin, RegionLogicMixin, ReceivedLogicMixin, MagicLogicMixin]]): +class CombatLogic(BaseLogic): @cache_self1 def can_fight_at_level(self, level: str) -> StardewRule: if level == Performance.basic: diff --git a/worlds/stardew_valley/logic/cooking_logic.py b/worlds/stardew_valley/logic/cooking_logic.py index 339b2b9817..0959b90a8f 100644 --- a/worlds/stardew_valley/logic/cooking_logic.py +++ b/worlds/stardew_valley/logic/cooking_logic.py @@ -1,17 +1,7 @@ from functools import cached_property -from typing import Union from Utils import cache_self1 -from .action_logic import ActionLogicMixin from .base_logic import BaseLogicMixin, BaseLogic -from .building_logic import BuildingLogicMixin -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .season_logic import SeasonLogicMixin -from .skill_logic import SkillLogicMixin from ..data.recipe_data import RecipeSource, StarterSource, ShopSource, SkillSource, FriendshipSource, \ QueenOfSauceSource, CookingRecipe, ShopFriendshipSource from ..data.recipe_source import CutsceneSource, ShopTradeSource @@ -29,8 +19,7 @@ class CookingLogicMixin(BaseLogicMixin): self.cooking = CookingLogic(*args, **kwargs) -class CookingLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, MoneyLogicMixin, ActionLogicMixin, -BuildingLogicMixin, RelationshipLogicMixin, SkillLogicMixin, CookingLogicMixin]]): +class CookingLogic(BaseLogic): @cached_property def can_cook_in_kitchen(self) -> StardewRule: return self.logic.building.has_building(Building.kitchen) | self.logic.skill.has_level(Skill.foraging, 9) diff --git a/worlds/stardew_valley/logic/crafting_logic.py b/worlds/stardew_valley/logic/crafting_logic.py index b768a74b92..01dfc5173c 100644 --- a/worlds/stardew_valley/logic/crafting_logic.py +++ b/worlds/stardew_valley/logic/crafting_logic.py @@ -1,15 +1,5 @@ -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .quest_logic import QuestLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .skill_logic import SkillLogicMixin -from .special_order_logic import SpecialOrderLogicMixin from .. import options from ..data.craftable_data import CraftingRecipe from ..data.recipe_source import CutsceneSource, ShopTradeSource, ArchipelagoSource, LogicSource, SpecialOrderSource, \ @@ -25,8 +15,7 @@ class CraftingLogicMixin(BaseLogicMixin): self.crafting = CraftingLogic(*args, **kwargs) -class CraftingLogic(BaseLogic[Union[ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, MoneyLogicMixin, RelationshipLogicMixin, -SkillLogicMixin, SpecialOrderLogicMixin, CraftingLogicMixin, QuestLogicMixin]]): +class CraftingLogic(BaseLogic): @cache_self1 def can_craft(self, recipe: CraftingRecipe = None) -> StardewRule: if recipe is None: diff --git a/worlds/stardew_valley/logic/farming_logic.py b/worlds/stardew_valley/logic/farming_logic.py index cb8a55e6b4..54c8c8af20 100644 --- a/worlds/stardew_valley/logic/farming_logic.py +++ b/worlds/stardew_valley/logic/farming_logic.py @@ -3,11 +3,6 @@ from typing import Union, Tuple from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .tool_logic import ToolLogicMixin from .. import options from ..stardew_rule import StardewRule, True_, false_ from ..strings.fertilizer_names import Fertilizer @@ -29,7 +24,7 @@ class FarmingLogicMixin(BaseLogicMixin): self.farming = FarmingLogic(*args, **kwargs) -class FarmingLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, ToolLogicMixin, FarmingLogicMixin]]): +class FarmingLogic(BaseLogic): @cached_property def has_farming_tools(self) -> StardewRule: @@ -45,6 +40,8 @@ class FarmingLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogi if tier >= 3: return self.logic.has(Fertilizer.deluxe) + return self.logic.false_ + @cache_self1 def can_plant_and_grow_item(self, seasons: Union[str, Tuple[str]]) -> StardewRule: if seasons == (): # indoor farming diff --git a/worlds/stardew_valley/logic/festival_logic.py b/worlds/stardew_valley/logic/festival_logic.py index 939e904951..b48668964d 100644 --- a/worlds/stardew_valley/logic/festival_logic.py +++ b/worlds/stardew_valley/logic/festival_logic.py @@ -1,20 +1,4 @@ -from typing import Union - -from .action_logic import ActionLogicMixin -from .animal_logic import AnimalLogicMixin -from .artisan_logic import ArtisanLogicMixin from .base_logic import BaseLogicMixin, BaseLogic -from .fishing_logic import FishingLogicMixin -from .gift_logic import GiftLogicMixin -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .monster_logic import MonsterLogicMixin -from .museum_logic import MuseumLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .skill_logic import SkillLogicMixin -from .time_logic import TimeLogicMixin from ..options import FestivalLocations from ..stardew_rule import StardewRule from ..strings.animal_product_names import AnimalProduct @@ -36,8 +20,7 @@ class FestivalLogicMixin(BaseLogicMixin): self.festival = FestivalLogic(*args, **kwargs) -class FestivalLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, FestivalLogicMixin, ArtisanLogicMixin, AnimalLogicMixin, MoneyLogicMixin, TimeLogicMixin, -SkillLogicMixin, RegionLogicMixin, ActionLogicMixin, MonsterLogicMixin, RelationshipLogicMixin, FishingLogicMixin, MuseumLogicMixin, GiftLogicMixin]]): +class FestivalLogic(BaseLogic): def initialize_rules(self): self.registry.festival_rules.update({ diff --git a/worlds/stardew_valley/logic/fishing_logic.py b/worlds/stardew_valley/logic/fishing_logic.py index 1bb4cccea6..85a9b12040 100644 --- a/worlds/stardew_valley/logic/fishing_logic.py +++ b/worlds/stardew_valley/logic/fishing_logic.py @@ -1,17 +1,8 @@ -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .skill_logic import SkillLogicMixin -from .tool_logic import ToolLogicMixin from ..data import fish_data from ..data.fish_data import FishItem -from ..options import ExcludeGingerIsland -from ..options import SpecialOrderLocations +from ..options import ExcludeGingerIsland, SpecialOrderLocations from ..stardew_rule import StardewRule, True_, False_ from ..strings.ap_names.mods.mod_items import SVEQuestItem from ..strings.craftable_names import Fishing @@ -28,8 +19,7 @@ class FishingLogicMixin(BaseLogicMixin): self.fishing = FishingLogic(*args, **kwargs) -class FishingLogic(BaseLogic[Union[HasLogicMixin, FishingLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, ToolLogicMixin, -SkillLogicMixin]]): +class FishingLogic(BaseLogic): def can_fish_in_freshwater(self) -> StardewRule: return self.logic.skill.can_fish() & self.logic.region.can_reach_any((Region.forest, Region.town, Region.mountain)) diff --git a/worlds/stardew_valley/logic/gift_logic.py b/worlds/stardew_valley/logic/gift_logic.py index 527da68764..11667783d6 100644 --- a/worlds/stardew_valley/logic/gift_logic.py +++ b/worlds/stardew_valley/logic/gift_logic.py @@ -1,7 +1,6 @@ from functools import cached_property from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin from ..stardew_rule import StardewRule from ..strings.animal_product_names import AnimalProduct from ..strings.gift_names import Gift @@ -13,7 +12,7 @@ class GiftLogicMixin(BaseLogicMixin): self.gifts = GiftLogic(*args, **kwargs) -class GiftLogic(BaseLogic[HasLogicMixin]): +class GiftLogic(BaseLogic): @cached_property def has_any_universal_love(self) -> StardewRule: diff --git a/worlds/stardew_valley/logic/goal_logic.py b/worlds/stardew_valley/logic/goal_logic.py index 6ffa4da15a..6dbb5f8987 100644 --- a/worlds/stardew_valley/logic/goal_logic.py +++ b/worlds/stardew_valley/logic/goal_logic.py @@ -1,5 +1,3 @@ -import typing - from .base_logic import BaseLogic, BaseLogicMixin from ..data.craftable_data import all_crafting_recipes_by_name from ..data.recipe_data import all_cooking_recipes_by_name @@ -12,11 +10,6 @@ from ..strings.quest_names import Quest from ..strings.season_names import Season from ..strings.wallet_item_names import Wallet -if typing.TYPE_CHECKING: - from .logic import StardewLogic -else: - StardewLogic = object - class GoalLogicMixin(BaseLogicMixin): def __init__(self, *args, **kwargs): @@ -24,7 +17,7 @@ class GoalLogicMixin(BaseLogicMixin): self.goal = GoalLogic(*args, **kwargs) -class GoalLogic(BaseLogic[StardewLogic]): +class GoalLogic(BaseLogic): def can_complete_community_center(self) -> StardewRule: return self.logic.bundle.can_complete_community_center diff --git a/worlds/stardew_valley/logic/grind_logic.py b/worlds/stardew_valley/logic/grind_logic.py index 9550a12830..e18c13c15a 100644 --- a/worlds/stardew_valley/logic/grind_logic.py +++ b/worlds/stardew_valley/logic/grind_logic.py @@ -38,7 +38,7 @@ class GrindLogicMixin(BaseLogicMixin): self.grind = GrindLogic(*args, **kwargs) -class GrindLogic(BaseLogic[Union[GrindLogicMixin, HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, BookLogicMixin, TimeLogicMixin, ToolLogicMixin]]): +class GrindLogic(BaseLogic): def can_grind_mystery_boxes(self, quantity: int) -> StardewRule: opening_rule = self.logic.region.can_reach(Region.blacksmith) diff --git a/worlds/stardew_valley/logic/harvesting_logic.py b/worlds/stardew_valley/logic/harvesting_logic.py index 3b4d41953c..6478e34953 100644 --- a/worlds/stardew_valley/logic/harvesting_logic.py +++ b/worlds/stardew_valley/logic/harvesting_logic.py @@ -1,15 +1,7 @@ from functools import cached_property -from typing import Union from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .farming_logic import FarmingLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin from ..data.harvest import ForagingSource, HarvestFruitTreeSource, HarvestCropSource from ..stardew_rule import StardewRule from ..strings.ap_names.community_upgrade_names import CommunityUpgrade @@ -22,8 +14,7 @@ class HarvestingLogicMixin(BaseLogicMixin): self.harvesting = HarvestingLogic(*args, **kwargs) -class HarvestingLogic(BaseLogic[Union[HarvestingLogicMixin, HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, ToolLogicMixin, -FarmingLogicMixin, TimeLogicMixin]]): +class HarvestingLogic(BaseLogic): @cached_property def can_harvest_from_fruit_bats(self) -> StardewRule: diff --git a/worlds/stardew_valley/logic/has_logic.py b/worlds/stardew_valley/logic/has_logic.py index 5d4b700e3b..79c4c53167 100644 --- a/worlds/stardew_valley/logic/has_logic.py +++ b/worlds/stardew_valley/logic/has_logic.py @@ -2,7 +2,7 @@ from .base_logic import BaseLogic from ..stardew_rule import StardewRule, And, Or, Has, Count, true_, false_, HasProgressionPercent -class HasLogicMixin(BaseLogic[None]): +class HasLogicMixin(BaseLogic): true_ = true_ false_ = false_ diff --git a/worlds/stardew_valley/logic/logic_and_mods_design.md b/worlds/stardew_valley/logic/logic_and_mods_design.md index bf6684a354..fc69e2c807 100644 --- a/worlds/stardew_valley/logic/logic_and_mods_design.md +++ b/worlds/stardew_valley/logic/logic_and_mods_design.md @@ -12,7 +12,7 @@ class TimeLogicMixin(BaseLogicMixin): self.time = TimeLogic(*args, **kwargs) -class TimeLogic(BaseLogic[Union[TimeLogicMixin, ReceivedLogicMixin]]): +class TimeLogic(BaseLogic): def has_lived_months(self, number: int) -> StardewRule: return self.logic.received(Event.month_end, number) diff --git a/worlds/stardew_valley/logic/mine_logic.py b/worlds/stardew_valley/logic/mine_logic.py index e332241c10..2dacf67460 100644 --- a/worlds/stardew_valley/logic/mine_logic.py +++ b/worlds/stardew_valley/logic/mine_logic.py @@ -1,14 +1,5 @@ -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .combat_logic import CombatLogicMixin -from .cooking_logic import CookingLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .skill_logic import SkillLogicMixin -from .tool_logic import ToolLogicMixin from .. import options from ..stardew_rule import StardewRule, True_ from ..strings.performance_names import Performance @@ -23,8 +14,7 @@ class MineLogicMixin(BaseLogicMixin): self.mine = MineLogic(*args, **kwargs) -class MineLogic(BaseLogic[Union[HasLogicMixin, MineLogicMixin, RegionLogicMixin, ReceivedLogicMixin, CombatLogicMixin, ToolLogicMixin, -SkillLogicMixin, CookingLogicMixin]]): +class MineLogic(BaseLogic): # Regions def can_mine_in_the_mines_floor_1_40(self) -> StardewRule: return self.logic.region.can_reach(Region.mines_floor_5) diff --git a/worlds/stardew_valley/logic/money_logic.py b/worlds/stardew_valley/logic/money_logic.py index f5ca991e72..8f459a172b 100644 --- a/worlds/stardew_valley/logic/money_logic.py +++ b/worlds/stardew_valley/logic/money_logic.py @@ -1,25 +1,11 @@ -import typing -from typing import Union - from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .grind_logic import GrindLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .time_logic import TimeLogicMixin from ..data.shop import ShopSource from ..options import SpecialOrderLocations from ..stardew_rule import StardewRule, True_, HasProgressionPercent, False_, true_ from ..strings.currency_names import Currency from ..strings.region_names import Region, LogicRegion -if typing.TYPE_CHECKING: - from .shipping_logic import ShippingLogicMixin -else: - ShippingLogicMixin = object - qi_gem_rewards = ("100 Qi Gems", "50 Qi Gems", "40 Qi Gems", "35 Qi Gems", "25 Qi Gems", "20 Qi Gems", "15 Qi Gems", "10 Qi Gems") @@ -30,8 +16,7 @@ class MoneyLogicMixin(BaseLogicMixin): self.money = MoneyLogic(*args, **kwargs) -class MoneyLogic(BaseLogic[Union[RegionLogicMixin, MoneyLogicMixin, TimeLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SeasonLogicMixin, -GrindLogicMixin, ShippingLogicMixin]]): +class MoneyLogic(BaseLogic): @cache_self1 def can_have_earned_total(self, amount: int) -> StardewRule: diff --git a/worlds/stardew_valley/logic/monster_logic.py b/worlds/stardew_valley/logic/monster_logic.py index 7e6d786972..5d2ac3d3f6 100644 --- a/worlds/stardew_valley/logic/monster_logic.py +++ b/worlds/stardew_valley/logic/monster_logic.py @@ -20,7 +20,7 @@ class MonsterLogicMixin(BaseLogicMixin): self.monster = MonsterLogic(*args, **kwargs) -class MonsterLogic(BaseLogic[Union[HasLogicMixin, MonsterLogicMixin, RegionLogicMixin, CombatLogicMixin, TimeLogicMixin]]): +class MonsterLogic(BaseLogic): @cached_property def all_monsters_by_name(self): diff --git a/worlds/stardew_valley/logic/museum_logic.py b/worlds/stardew_valley/logic/museum_logic.py index 36ba62b31f..2237cd89ea 100644 --- a/worlds/stardew_valley/logic/museum_logic.py +++ b/worlds/stardew_valley/logic/museum_logic.py @@ -22,7 +22,7 @@ class MuseumLogicMixin(BaseLogicMixin): self.museum = MuseumLogic(*args, **kwargs) -class MuseumLogic(BaseLogic[Union[ReceivedLogicMixin, HasLogicMixin, TimeLogicMixin, RegionLogicMixin, ActionLogicMixin, ToolLogicMixin, MuseumLogicMixin]]): +class MuseumLogic(BaseLogic): def can_donate_museum_items(self, number: int) -> StardewRule: return self.logic.region.can_reach(Region.museum) & self.logic.museum.can_find_museum_items(number) diff --git a/worlds/stardew_valley/logic/pet_logic.py b/worlds/stardew_valley/logic/pet_logic.py index 0438940a66..9d66e8f274 100644 --- a/worlds/stardew_valley/logic/pet_logic.py +++ b/worlds/stardew_valley/logic/pet_logic.py @@ -1,11 +1,6 @@ import math -from typing import Union from .base_logic import BaseLogicMixin, BaseLogic -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin from ..content.feature.friendsanity import pet_heart_item_name from ..stardew_rule import StardewRule, True_ from ..strings.region_names import Region @@ -17,7 +12,7 @@ class PetLogicMixin(BaseLogicMixin): self.pet = PetLogic(*args, **kwargs) -class PetLogic(BaseLogic[Union[RegionLogicMixin, ReceivedLogicMixin, TimeLogicMixin, ToolLogicMixin]]): +class PetLogic(BaseLogic): def has_pet_hearts(self, hearts: int = 1) -> StardewRule: assert hearts >= 0, "You can't have negative hearts with a pet." if hearts == 0: diff --git a/worlds/stardew_valley/logic/quality_logic.py b/worlds/stardew_valley/logic/quality_logic.py index 54e2d24265..7f5da4be53 100644 --- a/worlds/stardew_valley/logic/quality_logic.py +++ b/worlds/stardew_valley/logic/quality_logic.py @@ -14,7 +14,7 @@ class QualityLogicMixin(BaseLogicMixin): self.quality = QualityLogic(*args, **kwargs) -class QualityLogic(BaseLogic[Union[SkillLogicMixin, FarmingLogicMixin]]): +class QualityLogic(BaseLogic): @cache_self1 def can_grow_crop_quality(self, quality: str) -> StardewRule: diff --git a/worlds/stardew_valley/logic/quest_logic.py b/worlds/stardew_valley/logic/quest_logic.py index 8779848fed..e48324680d 100644 --- a/worlds/stardew_valley/logic/quest_logic.py +++ b/worlds/stardew_valley/logic/quest_logic.py @@ -1,21 +1,6 @@ -from typing import Dict, Union +from typing import Dict from .base_logic import BaseLogicMixin, BaseLogic -from .building_logic import BuildingLogicMixin -from .combat_logic import CombatLogicMixin -from .cooking_logic import CookingLogicMixin -from .fishing_logic import FishingLogicMixin -from .has_logic import HasLogicMixin -from .mine_logic import MineLogicMixin -from .money_logic import MoneyLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .season_logic import SeasonLogicMixin -from .skill_logic import SkillLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin -from .wallet_logic import WalletLogicMixin from ..stardew_rule import StardewRule, Has, True_ from ..strings.ap_names.community_upgrade_names import CommunityUpgrade from ..strings.artisan_good_names import ArtisanGood @@ -43,9 +28,7 @@ class QuestLogicMixin(BaseLogicMixin): self.quest = QuestLogic(*args, **kwargs) -class QuestLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, MoneyLogicMixin, MineLogicMixin, RegionLogicMixin, RelationshipLogicMixin, ToolLogicMixin, - FishingLogicMixin, CookingLogicMixin, CombatLogicMixin, SeasonLogicMixin, SkillLogicMixin, WalletLogicMixin, QuestLogicMixin, - BuildingLogicMixin, TimeLogicMixin]]): +class QuestLogic(BaseLogic): def initialize_rules(self): self.update_rules({ diff --git a/worlds/stardew_valley/logic/received_logic.py b/worlds/stardew_valley/logic/received_logic.py index f5c5c9f7a2..68d65040c7 100644 --- a/worlds/stardew_valley/logic/received_logic.py +++ b/worlds/stardew_valley/logic/received_logic.py @@ -8,7 +8,7 @@ from ..items import item_table from ..stardew_rule import StardewRule, Received, TotalReceived -class ReceivedLogicMixin(BaseLogic[HasLogicMixin], BaseLogicMixin): +class ReceivedLogicMixin(BaseLogic, BaseLogicMixin): def received(self, item: str, count: Optional[int] = 1) -> StardewRule: assert count >= 0, "Can't receive a negative amount of item." diff --git a/worlds/stardew_valley/logic/region_logic.py b/worlds/stardew_valley/logic/region_logic.py index 69afa624f2..083f56e167 100644 --- a/worlds/stardew_valley/logic/region_logic.py +++ b/worlds/stardew_valley/logic/region_logic.py @@ -29,7 +29,7 @@ class RegionLogicMixin(BaseLogicMixin): self.region = RegionLogic(*args, **kwargs) -class RegionLogic(BaseLogic[Union[RegionLogicMixin, HasLogicMixin]]): +class RegionLogic(BaseLogic): @cache_self1 def can_reach(self, region_name: str) -> StardewRule: diff --git a/worlds/stardew_valley/logic/relationship_logic.py b/worlds/stardew_valley/logic/relationship_logic.py index 2de82bf972..e19a6e802b 100644 --- a/worlds/stardew_valley/logic/relationship_logic.py +++ b/worlds/stardew_valley/logic/relationship_logic.py @@ -1,16 +1,8 @@ import math -import typing from typing import Union from Utils import cache_self1 from .base_logic import BaseLogic, BaseLogicMixin -from .building_logic import BuildingLogicMixin -from .gift_logic import GiftLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .time_logic import TimeLogicMixin from ..content.feature import friendsanity from ..data.villagers_data import Villager from ..stardew_rule import StardewRule, True_, false_, true_ @@ -22,11 +14,6 @@ from ..strings.region_names import Region from ..strings.season_names import Season from ..strings.villager_names import NPC, ModNPC -if typing.TYPE_CHECKING: - from ..mods.logic.mod_logic import ModLogicMixin -else: - ModLogicMixin = object - possible_kids = ("Cute Baby", "Ugly Baby") @@ -43,8 +30,7 @@ class RelationshipLogicMixin(BaseLogicMixin): self.relationship = RelationshipLogic(*args, **kwargs) -class RelationshipLogic(BaseLogic[Union[RelationshipLogicMixin, BuildingLogicMixin, SeasonLogicMixin, TimeLogicMixin, GiftLogicMixin, RegionLogicMixin, -ReceivedLogicMixin, HasLogicMixin, ModLogicMixin]]): +class RelationshipLogic(BaseLogic): def can_date(self, npc: str) -> StardewRule: return self.logic.relationship.has_hearts(npc, 8) & self.logic.has(Gift.bouquet) diff --git a/worlds/stardew_valley/logic/requirement_logic.py b/worlds/stardew_valley/logic/requirement_logic.py index 3e83950d54..1a71810003 100644 --- a/worlds/stardew_valley/logic/requirement_logic.py +++ b/worlds/stardew_valley/logic/requirement_logic.py @@ -1,20 +1,7 @@ import functools -from typing import Union, Iterable +from typing import Iterable from .base_logic import BaseLogicMixin, BaseLogic -from .book_logic import BookLogicMixin -from .combat_logic import CombatLogicMixin -from .fishing_logic import FishingLogicMixin -from .has_logic import HasLogicMixin -from .quest_logic import QuestLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .season_logic import SeasonLogicMixin -from .skill_logic import SkillLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin -from .walnut_logic import WalnutLogicMixin from ..data.game_item import Requirement from ..data.requirement import ToolRequirement, BookRequirement, SkillRequirement, SeasonRequirement, YearRequirement, CombatRequirement, QuestRequirement, \ RelationshipRequirement, FishingRequirement, WalnutRequirement, RegionRequirement @@ -26,8 +13,7 @@ class RequirementLogicMixin(BaseLogicMixin): self.requirement = RequirementLogic(*args, **kwargs) -class RequirementLogic(BaseLogic[Union[RequirementLogicMixin, HasLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, BookLogicMixin, -SeasonLogicMixin, TimeLogicMixin, CombatLogicMixin, QuestLogicMixin, RelationshipLogicMixin, FishingLogicMixin, WalnutLogicMixin, RegionLogicMixin]]): +class RequirementLogic(BaseLogic): def meet_all_requirements(self, requirements: Iterable[Requirement]): if not requirements: diff --git a/worlds/stardew_valley/logic/season_logic.py b/worlds/stardew_valley/logic/season_logic.py index 6df315c0db..eecfd48582 100644 --- a/worlds/stardew_valley/logic/season_logic.py +++ b/worlds/stardew_valley/logic/season_logic.py @@ -18,7 +18,7 @@ class SeasonLogicMixin(BaseLogicMixin): self.season = SeasonLogic(*args, **kwargs) -class SeasonLogic(BaseLogic[Union[HasLogicMixin, SeasonLogicMixin, TimeLogicMixin, ReceivedLogicMixin]]): +class SeasonLogic(BaseLogic): @cached_property def has_spring(self) -> StardewRule: diff --git a/worlds/stardew_valley/logic/shipping_logic.py b/worlds/stardew_valley/logic/shipping_logic.py index d509cc4167..9f5ff51876 100644 --- a/worlds/stardew_valley/logic/shipping_logic.py +++ b/worlds/stardew_valley/logic/shipping_logic.py @@ -20,7 +20,7 @@ class ShippingLogicMixin(BaseLogicMixin): self.shipping = ShippingLogic(*args, **kwargs) -class ShippingLogic(BaseLogic[Union[ReceivedLogicMixin, ShippingLogicMixin, BuildingLogicMixin, RegionLogicMixin, HasLogicMixin]]): +class ShippingLogic(BaseLogic): @cached_property def can_use_shipping_bin(self) -> StardewRule: diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index 6d0cd11baf..e02b180f6a 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -1,19 +1,9 @@ -import typing from functools import cached_property from typing import Union, Tuple from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .combat_logic import CombatLogicMixin -from .harvesting_logic import HarvestingLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin from ..data.harvest import HarvestCropSource -from ..mods.logic.magic_logic import MagicLogicMixin from ..mods.logic.mod_skills_levels import get_mod_skill_levels from ..stardew_rule import StardewRule, true_, True_, False_ from ..strings.craftable_names import Fishing @@ -25,11 +15,6 @@ from ..strings.skill_names import Skill, all_mod_skills, all_vanilla_skills from ..strings.tool_names import ToolMaterial, Tool from ..strings.wallet_item_names import Wallet -if typing.TYPE_CHECKING: - from ..mods.logic.mod_logic import ModLogicMixin -else: - ModLogicMixin = object - fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west) vanilla_skill_items = ("Farming Level", "Mining Level", "Foraging Level", "Fishing Level", "Combat Level") @@ -40,8 +25,7 @@ class SkillLogicMixin(BaseLogicMixin): self.skill = SkillLogic(*args, **kwargs) -class SkillLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, TimeLogicMixin, ToolLogicMixin, SkillLogicMixin, -CombatLogicMixin, MagicLogicMixin, HarvestingLogicMixin, ModLogicMixin]]): +class SkillLogic(BaseLogic): # Should be cached def can_earn_level(self, skill: str, level: int) -> StardewRule: diff --git a/worlds/stardew_valley/logic/source_logic.py b/worlds/stardew_valley/logic/source_logic.py index 67ce55177c..ecdb6f02a3 100644 --- a/worlds/stardew_valley/logic/source_logic.py +++ b/worlds/stardew_valley/logic/source_logic.py @@ -1,17 +1,7 @@ import functools -from typing import Union, Any, Iterable +from typing import Any, Iterable -from .animal_logic import AnimalLogicMixin -from .artisan_logic import ArtisanLogicMixin from .base_logic import BaseLogicMixin, BaseLogic -from .grind_logic import GrindLogicMixin -from .harvesting_logic import HarvestingLogicMixin -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .requirement_logic import RequirementLogicMixin -from .tool_logic import ToolLogicMixin from ..data.animal import IncubatorSource, OstrichIncubatorSource from ..data.artisan import MachineSource from ..data.game_item import GenericSource, Source, GameItem, CustomRuleSource @@ -26,8 +16,7 @@ class SourceLogicMixin(BaseLogicMixin): self.source = SourceLogic(*args, **kwargs) -class SourceLogic(BaseLogic[Union[SourceLogicMixin, HasLogicMixin, ReceivedLogicMixin, HarvestingLogicMixin, MoneyLogicMixin, RegionLogicMixin, -ArtisanLogicMixin, ToolLogicMixin, RequirementLogicMixin, GrindLogicMixin, AnimalLogicMixin]]): +class SourceLogic(BaseLogic): def has_access_to_item(self, item: GameItem): rules = [] diff --git a/worlds/stardew_valley/logic/special_order_logic.py b/worlds/stardew_valley/logic/special_order_logic.py index 8bcd78d7d2..a81f715c48 100644 --- a/worlds/stardew_valley/logic/special_order_logic.py +++ b/worlds/stardew_valley/logic/special_order_logic.py @@ -1,22 +1,6 @@ -from typing import Dict, Union +from typing import Dict -from .ability_logic import AbilityLogicMixin -from .arcade_logic import ArcadeLogicMixin -from .artisan_logic import ArtisanLogicMixin from .base_logic import BaseLogicMixin, BaseLogic -from .cooking_logic import CookingLogicMixin -from .has_logic import HasLogicMixin -from .mine_logic import MineLogicMixin -from .money_logic import MoneyLogicMixin -from .monster_logic import MonsterLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .relationship_logic import RelationshipLogicMixin -from .season_logic import SeasonLogicMixin -from .shipping_logic import ShippingLogicMixin -from .skill_logic import SkillLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin from ..content.vanilla.ginger_island import ginger_island_content_pack from ..content.vanilla.qi_board import qi_board_content_pack from ..stardew_rule import StardewRule, Has, false_ @@ -44,10 +28,7 @@ class SpecialOrderLogicMixin(BaseLogicMixin): self.special_order = SpecialOrderLogic(*args, **kwargs) -class SpecialOrderLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, TimeLogicMixin, MoneyLogicMixin, -ShippingLogicMixin, ArcadeLogicMixin, ArtisanLogicMixin, RelationshipLogicMixin, ToolLogicMixin, SkillLogicMixin, -MineLogicMixin, CookingLogicMixin, -AbilityLogicMixin, SpecialOrderLogicMixin, MonsterLogicMixin]]): +class SpecialOrderLogic(BaseLogic): def initialize_rules(self): self.update_rules({ diff --git a/worlds/stardew_valley/logic/time_logic.py b/worlds/stardew_valley/logic/time_logic.py index 2ba76579ff..d26723d2a5 100644 --- a/worlds/stardew_valley/logic/time_logic.py +++ b/worlds/stardew_valley/logic/time_logic.py @@ -22,7 +22,7 @@ class TimeLogicMixin(BaseLogicMixin): self.time = TimeLogic(*args, **kwargs) -class TimeLogic(BaseLogic[Union[TimeLogicMixin, HasLogicMixin]]): +class TimeLogic(BaseLogic): @cache_self1 def has_lived_months(self, number: int) -> StardewRule: diff --git a/worlds/stardew_valley/logic/tool_logic.py b/worlds/stardew_valley/logic/tool_logic.py index 8292325af7..dba8bb2980 100644 --- a/worlds/stardew_valley/logic/tool_logic.py +++ b/worlds/stardew_valley/logic/tool_logic.py @@ -2,12 +2,6 @@ from typing import Union, Iterable, Tuple from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic -from .has_logic import HasLogicMixin -from .money_logic import MoneyLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .season_logic import SeasonLogicMixin -from ..mods.logic.magic_logic import MagicLogicMixin from ..stardew_rule import StardewRule, True_, False_ from ..strings.ap_names.skill_level_names import ModSkillLevel from ..strings.region_names import Region, LogicRegion @@ -40,7 +34,7 @@ class ToolLogicMixin(BaseLogicMixin): self.tool = ToolLogic(*args, **kwargs) -class ToolLogic(BaseLogic[Union[ToolLogicMixin, HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, MoneyLogicMixin, MagicLogicMixin]]): +class ToolLogic(BaseLogic): def has_all_tools(self, tools: Iterable[Tuple[str, str]]): return self.logic.and_(*(self.logic.tool.has_tool(tool, material) for tool, material in tools)) diff --git a/worlds/stardew_valley/logic/traveling_merchant_logic.py b/worlds/stardew_valley/logic/traveling_merchant_logic.py index 4123ded5bf..743ff9949b 100644 --- a/worlds/stardew_valley/logic/traveling_merchant_logic.py +++ b/worlds/stardew_valley/logic/traveling_merchant_logic.py @@ -12,7 +12,7 @@ class TravelingMerchantLogicMixin(BaseLogicMixin): self.traveling_merchant = TravelingMerchantLogic(*args, **kwargs) -class TravelingMerchantLogic(BaseLogic[Union[TravelingMerchantLogicMixin, ReceivedLogicMixin]]): +class TravelingMerchantLogic(BaseLogic): def has_days(self, number_days: int = 1): if number_days <= 0: diff --git a/worlds/stardew_valley/logic/wallet_logic.py b/worlds/stardew_valley/logic/wallet_logic.py index 3a6d126400..eb7afb9af3 100644 --- a/worlds/stardew_valley/logic/wallet_logic.py +++ b/worlds/stardew_valley/logic/wallet_logic.py @@ -10,7 +10,7 @@ class WalletLogicMixin(BaseLogicMixin): self.wallet = WalletLogic(*args, **kwargs) -class WalletLogic(BaseLogic[ReceivedLogicMixin]): +class WalletLogic(BaseLogic): def can_speak_dwarf(self) -> StardewRule: return self.logic.received(Wallet.dwarvish_translation_guide) diff --git a/worlds/stardew_valley/logic/walnut_logic.py b/worlds/stardew_valley/logic/walnut_logic.py index 4ab3b46f70..fb83b65907 100644 --- a/worlds/stardew_valley/logic/walnut_logic.py +++ b/worlds/stardew_valley/logic/walnut_logic.py @@ -1,12 +1,6 @@ from functools import cached_property -from typing import Union -from .ability_logic import AbilityLogicMixin from .base_logic import BaseLogic, BaseLogicMixin -from .combat_logic import CombatLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin from ..options import ExcludeGingerIsland, Walnutsanity from ..stardew_rule import StardewRule, False_, True_ from ..strings.ap_names.ap_option_names import WalnutsanityOptionName @@ -24,8 +18,7 @@ class WalnutLogicMixin(BaseLogicMixin): self.walnut = WalnutLogic(*args, **kwargs) -class WalnutLogic(BaseLogic[Union[WalnutLogicMixin, ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, CombatLogicMixin, -AbilityLogicMixin]]): +class WalnutLogic(BaseLogic): def has_walnut(self, number: int) -> StardewRule: if self.options.exclude_ginger_island == ExcludeGingerIsland.option_true: diff --git a/worlds/stardew_valley/mods/logic/deepwoods_logic.py b/worlds/stardew_valley/mods/logic/deepwoods_logic.py index 6e0eadfd54..17db3c0a6f 100644 --- a/worlds/stardew_valley/mods/logic/deepwoods_logic.py +++ b/worlds/stardew_valley/mods/logic/deepwoods_logic.py @@ -1,13 +1,5 @@ -from typing import Union - +from ..mod_data import ModNames from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.combat_logic import CombatLogicMixin -from ...logic.cooking_logic import CookingLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.skill_logic import SkillLogicMixin -from ...logic.tool_logic import ToolLogicMixin -from ...mods.mod_data import ModNames from ...options import ElevatorProgression from ...stardew_rule import StardewRule, True_, true_ from ...strings.ap_names.mods.mod_items import DeepWoodsItem @@ -25,8 +17,7 @@ class DeepWoodsLogicMixin(BaseLogicMixin): self.deepwoods = DeepWoodsLogic(*args, **kwargs) -class DeepWoodsLogic(BaseLogic[Union[SkillLogicMixin, ReceivedLogicMixin, HasLogicMixin, CombatLogicMixin, ToolLogicMixin, SkillLogicMixin, -CookingLogicMixin]]): +class DeepWoodsLogic(BaseLogic): def can_reach_woods_depth(self, depth: int) -> StardewRule: # Assuming you can always do the 10 first floor diff --git a/worlds/stardew_valley/mods/logic/elevator_logic.py b/worlds/stardew_valley/mods/logic/elevator_logic.py index f1d12bcb1c..8e154492e4 100644 --- a/worlds/stardew_valley/mods/logic/elevator_logic.py +++ b/worlds/stardew_valley/mods/logic/elevator_logic.py @@ -1,5 +1,4 @@ from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.received_logic import ReceivedLogicMixin from ...mods.mod_data import ModNames from ...options import ElevatorProgression from ...stardew_rule import StardewRule, True_ @@ -11,7 +10,7 @@ class ModElevatorLogicMixin(BaseLogicMixin): self.elevator = ModElevatorLogic(*args, **kwargs) -class ModElevatorLogic(BaseLogic[ReceivedLogicMixin]): +class ModElevatorLogic(BaseLogic): def has_skull_cavern_elevator_to_floor(self, floor: int) -> StardewRule: if self.options.elevator_progression != ElevatorProgression.option_vanilla and ModNames.skull_cavern_elevator in self.options.mods: return self.logic.received("Progressive Skull Cavern Elevator", floor // 25) diff --git a/worlds/stardew_valley/mods/logic/item_logic.py b/worlds/stardew_valley/mods/logic/item_logic.py index fd87a4a0ac..7394d82ba1 100644 --- a/worlds/stardew_valley/mods/logic/item_logic.py +++ b/worlds/stardew_valley/mods/logic/item_logic.py @@ -1,23 +1,7 @@ -from typing import Dict, Union +from typing import Dict from ..mod_data import ModNames from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.combat_logic import CombatLogicMixin -from ...logic.cooking_logic import CookingLogicMixin -from ...logic.crafting_logic import CraftingLogicMixin -from ...logic.farming_logic import FarmingLogicMixin -from ...logic.fishing_logic import FishingLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.money_logic import MoneyLogicMixin -from ...logic.museum_logic import MuseumLogicMixin -from ...logic.quest_logic import QuestLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin -from ...logic.relationship_logic import RelationshipLogicMixin -from ...logic.season_logic import SeasonLogicMixin -from ...logic.skill_logic import SkillLogicMixin -from ...logic.time_logic import TimeLogicMixin -from ...logic.tool_logic import ToolLogicMixin from ...stardew_rule import StardewRule from ...strings.artisan_good_names import ModArtisanGood from ...strings.craftable_names import ModCraftable @@ -39,9 +23,7 @@ class ModItemLogicMixin(BaseLogicMixin): self.item = ModItemLogic(*args, **kwargs) -class ModItemLogic(BaseLogic[Union[CombatLogicMixin, ReceivedLogicMixin, CookingLogicMixin, FishingLogicMixin, HasLogicMixin, MoneyLogicMixin, -RegionLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MuseumLogicMixin, ToolLogicMixin, CraftingLogicMixin, SkillLogicMixin, TimeLogicMixin, QuestLogicMixin, -FarmingLogicMixin]]): +class ModItemLogic(BaseLogic): def get_modded_item_rules(self) -> Dict[str, StardewRule]: items = dict() diff --git a/worlds/stardew_valley/mods/logic/magic_logic.py b/worlds/stardew_valley/mods/logic/magic_logic.py index 662ff3acae..2e3a0e1f97 100644 --- a/worlds/stardew_valley/mods/logic/magic_logic.py +++ b/worlds/stardew_valley/mods/logic/magic_logic.py @@ -1,9 +1,4 @@ -from typing import Union - from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.has_logic import HasLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin from ...mods.mod_data import ModNames from ...stardew_rule import StardewRule, False_ from ...strings.ap_names.skill_level_names import ModSkillLevel @@ -18,7 +13,7 @@ class MagicLogicMixin(BaseLogicMixin): # TODO add logic.mods.magic for altar -class MagicLogic(BaseLogic[Union[RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin]]): +class MagicLogic(BaseLogic): def can_use_clear_debris_instead_of_tool_level(self, level: int) -> StardewRule: if ModNames.magic not in self.options.mods: return False_() diff --git a/worlds/stardew_valley/mods/logic/quests_logic.py b/worlds/stardew_valley/mods/logic/quests_logic.py index ef96982661..8b1eca7fc2 100644 --- a/worlds/stardew_valley/mods/logic/quests_logic.py +++ b/worlds/stardew_valley/mods/logic/quests_logic.py @@ -1,15 +1,7 @@ -from typing import Dict, Union +from typing import Dict from ..mod_data import ModNames from ...logic.base_logic import BaseLogic, BaseLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.monster_logic import MonsterLogicMixin -from ...logic.quest_logic import QuestLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin -from ...logic.relationship_logic import RelationshipLogicMixin -from ...logic.season_logic import SeasonLogicMixin -from ...logic.time_logic import TimeLogicMixin from ...stardew_rule import StardewRule from ...strings.animal_product_names import AnimalProduct from ...strings.ap_names.mods.mod_items import SVEQuestItem @@ -34,8 +26,7 @@ class ModQuestLogicMixin(BaseLogicMixin): self.quest = ModQuestLogic(*args, **kwargs) -class ModQuestLogic(BaseLogic[Union[HasLogicMixin, QuestLogicMixin, ReceivedLogicMixin, RegionLogicMixin, -TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]): +class ModQuestLogic(BaseLogic): def get_modded_quest_rules(self) -> Dict[str, StardewRule]: quests = dict() quests.update(self._get_juna_quest_rules()) diff --git a/worlds/stardew_valley/mods/logic/skills_logic.py b/worlds/stardew_valley/mods/logic/skills_logic.py index ba9d277418..b1f10d08b9 100644 --- a/worlds/stardew_valley/mods/logic/skills_logic.py +++ b/worlds/stardew_valley/mods/logic/skills_logic.py @@ -1,17 +1,4 @@ -from typing import Union - -from .magic_logic import MagicLogicMixin -from ...logic.action_logic import ActionLogicMixin from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.building_logic import BuildingLogicMixin -from ...logic.cooking_logic import CookingLogicMixin -from ...logic.crafting_logic import CraftingLogicMixin -from ...logic.fishing_logic import FishingLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin -from ...logic.relationship_logic import RelationshipLogicMixin -from ...logic.tool_logic import ToolLogicMixin from ...mods.mod_data import ModNames from ...stardew_rule import StardewRule, False_, True_, And from ...strings.building_names import Building @@ -30,8 +17,7 @@ class ModSkillLogicMixin(BaseLogicMixin): self.skill = ModSkillLogic(*args, **kwargs) -class ModSkillLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, ActionLogicMixin, RelationshipLogicMixin, BuildingLogicMixin, -ToolLogicMixin, FishingLogicMixin, CookingLogicMixin, CraftingLogicMixin, MagicLogicMixin]]): +class ModSkillLogic(BaseLogic): def has_mod_level(self, skill: str, level: int) -> StardewRule: if level <= 0: return True_() diff --git a/worlds/stardew_valley/mods/logic/special_orders_logic.py b/worlds/stardew_valley/mods/logic/special_orders_logic.py index 1a0934282e..f697661419 100644 --- a/worlds/stardew_valley/mods/logic/special_orders_logic.py +++ b/worlds/stardew_valley/mods/logic/special_orders_logic.py @@ -1,17 +1,6 @@ -from typing import Union - from ..mod_data import ModNames from ...data.craftable_data import all_crafting_recipes_by_name -from ...logic.action_logic import ActionLogicMixin -from ...logic.artisan_logic import ArtisanLogicMixin from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.crafting_logic import CraftingLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin -from ...logic.relationship_logic import RelationshipLogicMixin -from ...logic.season_logic import SeasonLogicMixin -from ...logic.wallet_logic import WalletLogicMixin from ...strings.ap_names.community_upgrade_names import CommunityUpgrade from ...strings.artisan_good_names import ArtisanGood from ...strings.craftable_names import Consumable, Edible, Bomb @@ -33,8 +22,7 @@ class ModSpecialOrderLogicMixin(BaseLogicMixin): self.special_order = ModSpecialOrderLogic(*args, **kwargs) -class ModSpecialOrderLogic(BaseLogic[Union[ActionLogicMixin, ArtisanLogicMixin, CraftingLogicMixin, HasLogicMixin, RegionLogicMixin, -ReceivedLogicMixin, RelationshipLogicMixin, SeasonLogicMixin, WalletLogicMixin]]): +class ModSpecialOrderLogic(BaseLogic): def get_modded_special_orders_rules(self): special_orders = {} if ModNames.juna in self.options.mods: diff --git a/worlds/stardew_valley/mods/logic/sve_logic.py b/worlds/stardew_valley/mods/logic/sve_logic.py index faca8d332d..7f0c12bc4f 100644 --- a/worlds/stardew_valley/mods/logic/sve_logic.py +++ b/worlds/stardew_valley/mods/logic/sve_logic.py @@ -1,21 +1,7 @@ -from typing import Union - from ..mod_regions import SVERegion from ...logic.base_logic import BaseLogicMixin, BaseLogic -from ...logic.combat_logic import CombatLogicMixin -from ...logic.cooking_logic import CookingLogicMixin -from ...logic.has_logic import HasLogicMixin -from ...logic.money_logic import MoneyLogicMixin -from ...logic.quest_logic import QuestLogicMixin -from ...logic.received_logic import ReceivedLogicMixin -from ...logic.region_logic import RegionLogicMixin -from ...logic.relationship_logic import RelationshipLogicMixin -from ...logic.season_logic import SeasonLogicMixin -from ...logic.time_logic import TimeLogicMixin -from ...logic.tool_logic import ToolLogicMixin from ...strings.ap_names.mods.mod_items import SVELocation, SVERunes, SVEQuestItem -from ...strings.quest_names import ModQuest -from ...strings.quest_names import Quest +from ...strings.quest_names import Quest, ModQuest from ...strings.region_names import Region from ...strings.tool_names import Tool, ToolMaterial from ...strings.wallet_item_names import Wallet @@ -27,8 +13,7 @@ class SVELogicMixin(BaseLogicMixin): self.sve = SVELogic(*args, **kwargs) -class SVELogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, QuestLogicMixin, RegionLogicMixin, RelationshipLogicMixin, TimeLogicMixin, ToolLogicMixin, - CookingLogicMixin, MoneyLogicMixin, CombatLogicMixin, SeasonLogicMixin]]): +class SVELogic(BaseLogic): def initialize_rules(self): self.registry.sve_location_rules.update({ SVELocation.tempered_galaxy_sword: self.logic.money.can_spend_at(SVERegion.alesia_shop, 350000), From 73964b374c6d502b588e33c6c3c93045f267920b Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 23 Apr 2025 15:40:36 +0000 Subject: [PATCH 070/199] MultiServer: import get_settings from the correct module (#4914) * MultiServer: import get_settings from the correct module * MultiServer: settings: use attr inbstead of dict access --- MultiServer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MultiServer.py b/MultiServer.py index 4295f28c58..bdc6b8c84f 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -2419,8 +2419,10 @@ async def console(ctx: Context): def parse_args() -> argparse.Namespace: + from settings import get_settings + parser = argparse.ArgumentParser() - defaults = Utils.get_settings()["server_options"].as_dict() + defaults = get_settings().server_options.as_dict() parser.add_argument('multidata', nargs="?", default=defaults["multidata"]) parser.add_argument('--host', default=defaults["host"]) parser.add_argument('--port', default=defaults["port"], type=int) From febd280fba57c2d015b7e9c8a820150b11268ec8 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 23 Apr 2025 20:30:15 +0200 Subject: [PATCH 071/199] Setup: use sha256 for timestamp server (#4892) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 00a65330a0..ebef215e2d 100644 --- a/setup.py +++ b/setup.py @@ -154,7 +154,7 @@ if os.path.exists("X:/pw.txt"): with open("X:/pw.txt", encoding="utf-8-sig") as f: pw = f.read() signtool = r'signtool sign /f X:/_SITS_Zertifikat_.pfx /p "' + pw + \ - r'" /fd sha256 /tr http://timestamp.digicert.com/ ' + r'" /fd sha256 /td sha256 /tr http://timestamp.digicert.com/ ' else: signtool = None From 29e6a10e4271ad5ae024acc32051a102c2f0eed2 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 24 Apr 2025 08:50:34 +0200 Subject: [PATCH 072/199] Setup: offer the default-on option to clean /lib folder on update (#4890) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- inno_setup.iss | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/inno_setup.iss b/inno_setup.iss index 9d03ca7baf..adf9acc834 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -45,7 +45,8 @@ MinVersion={#min_windows} Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; +Name: "deletelib"; Description: "Clean existing /lib folder and subfolders including /worlds (leave checked if unsure)"; Check: ShouldShowDeleteLibTask [Types] Name: "full"; Description: "Full installation" @@ -83,18 +84,8 @@ Filename: "{app}\ArchipelagoLauncher"; Description: "{cm:LaunchProgram,{#StringC Type: dirifempty; Name: "{app}" [InstallDelete] -Type: files; Name: "{app}\lib\worlds\_bizhawk.apworld" -Type: files; Name: "{app}\ArchipelagoLttPClient.exe" -Type: files; Name: "{app}\ArchipelagoPokemonClient.exe" +Type: files; Name: "{app}\*.exe" Type: files; Name: "{app}\data\lua\connector_pkmn_rb.lua" -Type: filesandordirs; Name: "{app}\lib\worlds\rogue-legacy" -Type: dirifempty; Name: "{app}\lib\worlds\rogue-legacy" -Type: files; Name: "{app}\lib\worlds\sc2wol.apworld" -Type: filesandordirs; Name: "{app}\lib\worlds\sc2wol" -Type: dirifempty; Name: "{app}\lib\worlds\sc2wol" -Type: filesandordirs; Name: "{app}\lib\worlds\bk_sudoku" -Type: dirifempty; Name: "{app}\lib\worlds\bk_sudoku" -Type: files; Name: "{app}\ArchipelagoLauncher(DEBUG).exe" Type: filesandordirs; Name: "{app}\SNI\lua*" Type: filesandordirs; Name: "{app}\EnemizerCLI*" #include "installdelete.iss" @@ -261,3 +252,17 @@ begin Result := True; end; end; + +function ShouldShowDeleteLibTask: Boolean; +begin + Result := DirExists(ExpandConstant('{app}\lib')); +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssInstall then + begin + if WizardIsTaskSelected('deletelib') then + DelTree(ExpandConstant('{app}\lib'), True, True, True); + end; +end; From a84366368f8509485b44e109c775183e8022aefc Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Thu, 24 Apr 2025 09:38:30 -0400 Subject: [PATCH 073/199] Docs: Update comment for create_item (#4919) --- docs/world api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/world api.md b/docs/world api.md index e55d4fb9f5..013b02cc20 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -561,7 +561,7 @@ from .items import is_progression # this is just a dummy def create_item(self, item: str) -> MyGameItem: - # this is called when AP wants to create an item by name (for plando) or when you call it from your own code + # this is called when AP wants to create an item by name (for plando, start inventory, item links) or when you call it from your own code classification = ItemClassification.progression if is_progression(item) else ItemClassification.filler return MyGameItem(item, classification, self.item_name_to_id[item], self.player) From 03768a5f90b44bafc7ca5a37aed7f46067bb8732 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 24 Apr 2025 14:23:51 -0500 Subject: [PATCH 074/199] Tests: Test that a world can generate with item links (#2081) Co-authored-by: Fabian Dill Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- test/general/test_items.py | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/test/general/test_items.py b/test/general/test_items.py index f9488e1b25..1b376b2838 100644 --- a/test/general/test_items.py +++ b/test/general/test_items.py @@ -1,7 +1,11 @@ import unittest +from argparse import Namespace +from typing import Type -from BaseClasses import CollectionState -from worlds.AutoWorld import AutoWorldRegister, call_all +from BaseClasses import CollectionState, MultiWorld +from Fill import distribute_items_restrictive +from Options import ItemLinks +from worlds.AutoWorld import AutoWorldRegister, World, call_all from . import setup_solo_multiworld @@ -83,6 +87,47 @@ class TestBase(unittest.TestCase): multiworld = setup_solo_multiworld(world_type) for item in multiworld.itempool: self.assertIn(item.name, world_type.item_name_to_id) + + def test_item_links(self) -> None: + """ + Tests item link creation by creating a multiworld of 2 worlds for every game and linking their items together. + """ + def setup_link_multiworld(world: Type[World], link_replace: bool) -> None: + multiworld = MultiWorld(2) + multiworld.game = {1: world.game, 2: world.game} + multiworld.player_name = {1: "Linker 1", 2: "Linker 2"} + multiworld.set_seed() + item_link_group = [{ + "name": "ItemLinkTest", + "item_pool": ["Everything"], + "link_replacement": link_replace, + "replacement_item": None, + }] + args = Namespace() + for name, option in world.options_dataclass.type_hints.items(): + setattr(args, name, {1: option.from_any(option.default), 2: option.from_any(option.default)}) + setattr(args, "item_links", + {1: ItemLinks.from_any(item_link_group), 2: ItemLinks.from_any(item_link_group)}) + multiworld.set_options(args) + multiworld.set_item_links() + # groups get added to state during its constructor so this has to be after item links are set + multiworld.state = CollectionState(multiworld) + gen_steps = ("generate_early", "create_regions", "create_items", "set_rules", "connect_entrances", "generate_basic") + for step in gen_steps: + call_all(multiworld, step) + # link the items together and attempt to fill + multiworld.link_items() + multiworld._all_state = None + call_all(multiworld, "pre_fill") + distribute_items_restrictive(multiworld) + call_all(multiworld, "post_fill") + self.assertTrue(multiworld.can_beat_game(CollectionState(multiworld)), f"seed = {multiworld.seed}") + + for game_name, world_type in AutoWorldRegister.world_types.items(): + with self.subTest("Can generate with link replacement", game=game_name): + setup_link_multiworld(world_type, True) + with self.subTest("Can generate without link replacement", game=game_name): + setup_link_multiworld(world_type, False) def test_itempool_not_modified(self): """Test that worlds don't modify the itempool after `create_items`""" From 5bb87c6da5b38f097ff49342470f82cd8b8a140a Mon Sep 17 00:00:00 2001 From: Jarno Date: Thu, 24 Apr 2025 21:33:30 +0200 Subject: [PATCH 075/199] Tests: Make overlapping test actually print out the overlaps (#4431) --- test/general/test_ids.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/test/general/test_ids.py b/test/general/test_ids.py index e51a070c1f..ad8aad11d1 100644 --- a/test/general/test_ids.py +++ b/test/general/test_ids.py @@ -47,13 +47,39 @@ class TestIDs(unittest.TestCase): """Test that a game doesn't have item id overlap within its own datapackage""" for gamename, world_type in AutoWorldRegister.world_types.items(): with self.subTest(game=gamename): - self.assertEqual(len(world_type.item_id_to_name), len(world_type.item_name_to_id)) + len_item_id_to_name = len(world_type.item_id_to_name) + len_item_name_to_id = len(world_type.item_name_to_id) + + if len_item_id_to_name != len_item_name_to_id: + self.assertCountEqual( + world_type.item_id_to_name.values(), + world_type.item_name_to_id.keys(), + "\nThese items have overlapping ids with other items in its own world") + self.assertCountEqual( + world_type.item_id_to_name.keys(), + world_type.item_name_to_id.values(), + "\nThese items have overlapping names with other items in its own world") + + self.assertEqual(len_item_id_to_name, len_item_name_to_id) def test_duplicate_location_ids(self): """Test that a game doesn't have location id overlap within its own datapackage""" for gamename, world_type in AutoWorldRegister.world_types.items(): with self.subTest(game=gamename): - self.assertEqual(len(world_type.location_id_to_name), len(world_type.location_name_to_id)) + len_location_id_to_name = len(world_type.location_id_to_name) + len_location_name_to_id = len(world_type.location_name_to_id) + + if len_location_id_to_name != len_location_name_to_id: + self.assertCountEqual( + world_type.location_id_to_name.values(), + world_type.location_name_to_id.keys(), + "\nThese locations have overlapping ids with other locations in its own world") + self.assertCountEqual( + world_type.location_id_to_name.keys(), + world_type.location_name_to_id.values(), + "\nThese locations have overlapping names with other locations in its own world") + + self.assertEqual(len_location_id_to_name, len_location_name_to_id) def test_postgen_datapackage(self): """Generates a solo multiworld and checks that the datapackage is still valid""" From f288e3469c9fbc1a5a96fd5fdf7574fd0c58aa10 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:55:48 +0200 Subject: [PATCH 076/199] Core: Add a function docstring to roll_settings to hopefully prevent the weights fiasco from being repeated (#3388) * Add an option docstring to roll_settings to hopefully prevent the weights fiasco from being repeated * Update Generate.py * Update Generate.py --- Generate.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Generate.py b/Generate.py index 82386644e7..5b5219841d 100644 --- a/Generate.py +++ b/Generate.py @@ -456,6 +456,14 @@ def handle_option(ret: argparse.Namespace, game_weights: dict, option_key: str, def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.bosses): + """ + Roll options from specified weights, usually originating from a .yaml options file. + + Important note: + The same weights dict is shared between all slots using the same yaml (e.g. generic weights file for filler slots). + This means it should never be modified without making a deepcopy first. + """ + from worlds import AutoWorldRegister if "linked_options" in weights: From e52d8b4dbdbf72050046f98bc8b0fb228b52c7f8 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:56:05 +0200 Subject: [PATCH 077/199] The Witness: Remove first-stage requirements of progressive items from the logic files (#4257) * Remove extraneous symbol requirements * Some missed Full Dots cases * Bruh * merge error * merge error 2 --- worlds/witness/data/WitnessLogic.txt | 162 ++++---- worlds/witness/data/WitnessLogicExpert.txt | 400 ++++++++++---------- worlds/witness/data/WitnessLogicVanilla.txt | 116 +++--- worlds/witness/data/WitnessLogicVariety.txt | 252 ++++++------ 4 files changed, 465 insertions(+), 465 deletions(-) diff --git a/worlds/witness/data/WitnessLogic.txt b/worlds/witness/data/WitnessLogic.txt index edc45222b5..3eea52b85e 100644 --- a/worlds/witness/data/WitnessLogic.txt +++ b/worlds/witness/data/WitnessLogic.txt @@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial): 158651 - 0x03481 (Vault Box) - True - True Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: -158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots +158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots Door - 0x0A170 (Outpost Entry) - 0x0A171 Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: -158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Black/White Squares & Full Dots +158012 - 0x04CA4 (Outpost Exit Panel) - True - Black/White Squares & Full Dots Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Triangles @@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True Symmetry Island Upper (Symmetry Island): -158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots -158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots -158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots -158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots -158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots -158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots +158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots +158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots +158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots +158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots +158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots +158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots 158700 - 0x0360D (Laser Panel) - 0x00A68 - True Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True @@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True: 159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: -158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots +158652 - 0x0CC7B (Vault Panel) - True - Shapers & Rotated Shapers & Negative Shapers & Full Dots Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Triangles 158076 - 0x00698 (Surface 1) - True - True @@ -335,13 +335,13 @@ Quarry Boathouse Upper Middle (Quarry Boathouse) - Quarry Boathouse Upper Back - Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x3865F: 158155 - 0x38663 (Second Barrier Panel) - True - True Door - 0x3865F (Second Barrier) - 0x38663 -158156 - 0x021B5 (Back First Row 1) - True - Stars & Stars + Same Colored Symbol & Eraser -158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser -158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser -158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser -158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser -158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser -158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser +158156 - 0x021B5 (Back First Row 1) - True - Stars + Same Colored Symbol & Eraser +158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser +158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars + Same Colored Symbol & Eraser +158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser +158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser +158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser +158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser 158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Eraser & Shapers 158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Eraser & Shapers 158165 - 0x275FA (Hook Control) - True - Shapers & Eraser @@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True: 158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True -158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars & Stars + Same Colored Symbol & Black/White Squares +158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars + Same Colored Symbol & Black/White Squares Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9 Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5: @@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F: 158206 - 0x0361B (Tower Shortcut Panel) - True - True Door - 0x04F8F (Tower Shortcut) - 0x0361B 158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Dots Laser - 0x014BB (Laser) - 0x0360E | 0x03317 159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True 159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True @@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True -158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots -158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Dots & Full Dots -158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots & Full Dots -158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots -158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots +158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots +158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Full Dots +158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Full Dots +158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots +158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers Door - 0x28A61 (RGB House Entry) - 0x28998 @@ -575,7 +575,7 @@ Town Red Rooftop (Town): 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True Town Wooden Rooftop (Town): -158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser & Full Dots +158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Eraser & Full Dots Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True @@ -934,29 +934,29 @@ Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17 158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB: -158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol -158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares & Stars + Same Colored Symbol -158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol -158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol -158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol -158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol -158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol -158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol -158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol -158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Black/White Squares & Stars + Same Colored Symbol -158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol -158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol +158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol +158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Black/White Squares & Stars + Same Colored Symbol +158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol +158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol +158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol +158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol +158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol +158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol +158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol +158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Black/White Squares & Stars + Same Colored Symbol +158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol +158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61: 158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers 158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers 158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Rotated Shapers 158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers -158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Stars + Same Colored Symbol -158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol +158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Stars + Same Colored Symbol +158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol 158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Rotated Shapers Treehouse Green Bridge Front House (Treehouse): @@ -1005,7 +1005,7 @@ Mountainside Vault (Mountainside): Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: 158405 - 0x0042D (River Shape) - True - True 158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True -158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol +158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares & Stars + Same Colored Symbol 158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True 159300 - 0x001A3 (River Shape EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True @@ -1023,11 +1023,11 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots 158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Dots 158413 - 0x09E7B (Right Row 5) - 0x09E69 - Black/White Squares & Dots -158414 - 0x09E73 (Left Row 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol -158415 - 0x09E75 (Left Row 2) - 0x09E73 - Stars & Black/White Squares & Stars + Same Colored Symbol +158414 - 0x09E73 (Left Row 1) - True - Black/White Squares & Stars + Same Colored Symbol +158415 - 0x09E75 (Left Row 2) - 0x09E73 - Black/White Squares & Stars + Same Colored Symbol 158416 - 0x09E78 (Left Row 3) - 0x09E75 - Shapers 158417 - 0x09E79 (Left Row 4) - 0x09E78 - Shapers & Rotated Shapers -158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Black/White Squares & Stars + Same Colored Symbol +158418 - 0x09E6C (Left Row 5) - 0x09E79 - Black/White Squares & Stars + Same Colored Symbol 158419 - 0x09E6F (Left Row 6) - 0x09E6C - Stars & Rotated Shapers & Shapers 158420 - 0x09E6B (Left Row 7) - 0x09E6F - Stars & Dots 158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers @@ -1044,10 +1044,10 @@ Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay: -158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol -158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Colored Squares & Stars + Same Colored Symbol -158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol -158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers +158426 - 0x09FD3 (Near Row 1) - True - Colored Squares & Stars + Same Colored Symbol +158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Colored Squares & Stars + Same Colored Symbol +158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Colored Squares & Stars + Same Colored Symbol +158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Colored Squares & Stars + Same Colored Symbol & Shapers 158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Symmetry & Colored Dots Door - 0x09FFB (Staircase Near) - 0x09FD8 @@ -1055,19 +1055,19 @@ Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86 Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): -158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser +158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8: 158432 - 0x09FCC (Far Row 1) - True - Dots 158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares 158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars 158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Rotated Shapers -158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Stars & Colored Squares & Stars + Same Colored Symbol +158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Colored Squares & Stars + Same Colored Symbol 158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Shapers Door - 0x09E07 (Staircase Far) - 0x09FD2 Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2): -158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser +158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay: 158613 - 0x17F93 (Elevator Discard) - True - Triangles @@ -1095,7 +1095,7 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: 158522 - 0x0383A (Right Pillar 1) - True - Stars 158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots -158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots +158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots 158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry 158526 - 0x0383D (Left Pillar 1) - True - Dots 158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares @@ -1127,16 +1127,16 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots -158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles & Full Dots -158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles & Full Dots -158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles & Full Dots -158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles & Full Dots +158454 - 0x00190 (Blue Tunnel Right First 1) - True - Triangles & Full Dots +158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Triangles & Full Dots +158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Triangles & Full Dots +158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Triangles & Full Dots 158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles 158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Black/White Squares & Triangles 158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Stars & Triangles -158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Stars & Triangles & Stars + Same Colored Symbol -158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles -158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Stars & Black/White Squares & Stars + Same Colored Symbol & Colored Squares +158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Stars + Same Colored Symbol +158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Black/White Squares & Stars + Same Colored Symbol & Triangles +158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Black/White Squares & Stars + Same Colored Symbol & Colored Squares 158464 - 0x00994 (Blue Tunnel Right Second 1) - True - Rotated Shapers & Triangles 158465 - 0x334D5 (Blue Tunnel Right Second 2) - 0x00994 - Rotated Shapers & Triangles 158466 - 0x00995 (Blue Tunnel Right Second 3) - 0x334D5 - Rotated Shapers & Triangles @@ -1146,40 +1146,40 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Shapers & Symmetry 158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Shapers & Negative Shapers 158472 - 0x32962 (First Floor Left) - True - Rotated Shapers -158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares & Stars + Same Colored Symbol +158473 - 0x32966 (First Floor Grounded) - True - Black/White Squares & Stars + Same Colored Symbol 158474 - 0x01A31 (First Floor Middle) - True - Colored Squares -158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser +158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser 158478 - 0x288EA (First Wooden Beam) - True - Shapers 158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers 158480 - 0x289E7 (Third Wooden Beam) - True - Stars & Black/White Squares 158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers -158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers & Full Dots -158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots -158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Dots & Full Dots -158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Black/White Squares & Stars + Same Colored Symbol & Stars & Full Dots -158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots & Full Dots -158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Dots & Full Dots -158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots -158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots -158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots -158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots & Invisible Dots -158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots & Invisible Dots -158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots & Invisible Dots -158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots & Invisible Dots -158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Invisible Dots -158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Invisible Dots & Symmetry -158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Invisible Dots & Symmetry -158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Invisible Dots & Symmetry +158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Negative Shapers & Full Dots +158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots +158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Full Dots +158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Black/White Squares & Stars + Same Colored Symbol & Full Dots +158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Full Dots +158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Full Dots +158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots +158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots +158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots +158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots +158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots +158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots +158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots +158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots +158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Symmetry +158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Symmetry +158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Symmetry 158476 - 0x09DD5 (Lone Pillar) - True - Triangles Door - 0x019A5 (Pillar Door) - 0x09DD5 -158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles & Stars & Stars + Same Colored Symbol +158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles & Stars + Same Colored Symbol Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7 158450 - 0x17CF2 (Swamp Shortcut Panel) - True - Triangles Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True Caves Path to Challenge (Caves) - Challenge - 0x0A19A: -158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol +158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E ==Challenge== diff --git a/worlds/witness/data/WitnessLogicExpert.txt b/worlds/witness/data/WitnessLogicExpert.txt index 23521dddeb..936001c243 100644 --- a/worlds/witness/data/WitnessLogicExpert.txt +++ b/worlds/witness/data/WitnessLogicExpert.txt @@ -13,8 +13,8 @@ Tutorial (Tutorial) - Outside Tutorial - True: 158002 - 0x00293 (Front Center) - True - Dots 158003 - 0x00295 (Center Left) - 0x00293 - Dots 158004 - 0x002C2 (Front Left) - 0x00295 - Dots -158005 - 0x0A3B5 (Back Left) - True - Dots & Full Dots -158006 - 0x0A3B2 (Back Right) - True - Dots & Full Dots +158005 - 0x0A3B5 (Back Left) - True - Full Dots +158006 - 0x0A3B2 (Back Right) - True - Full Dots 158007 - 0x03629 (Gate Open) - 0x002C2 - Symmetry & Dots 158008 - 0x03505 (Gate Close) - 0x2FAF6 & 0x03629 - True 158009 - 0x0C335 (Pillar) - True - Triangles @@ -26,22 +26,22 @@ Tutorial (Tutorial) - Outside Tutorial - True: ==Tutorial (Outside)== Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0: -158650 - 0x033D4 (Vault Panel) - True - Dots & Full Dots & Squares & Black/White Squares +158650 - 0x033D4 (Vault Panel) - True - Full Dots & Black/White Squares Door - 0x033D0 (Vault Door) - 0x033D4 -158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots -158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots -158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots -158016 - 0x00060 (Shed Row 4) - 0x0005F - Dots & Full Dots -158017 - 0x00061 (Shed Row 5) - 0x00060 - Dots & Full Dots -158018 - 0x018AF (Tree Row 1) - True - Squares & Black/White Squares -158019 - 0x0001B (Tree Row 2) - 0x018AF - Squares & Black/White Squares -158020 - 0x012C9 (Tree Row 3) - 0x0001B - Squares & Black/White Squares -158021 - 0x0001C (Tree Row 4) - 0x012C9 - Squares & Black/White Squares & Dots -158022 - 0x0001D (Tree Row 5) - 0x0001C - Squares & Black/White Squares & Dots -158023 - 0x0001E (Tree Row 6) - 0x0001D - Squares & Black/White Squares & Dots -158024 - 0x0001F (Tree Row 7) - 0x0001E - Squares & Black/White Squares & Dots & Full Dots -158025 - 0x00020 (Tree Row 8) - 0x0001F - Squares & Black/White Squares & Dots & Full Dots -158026 - 0x00021 (Tree Row 9) - 0x00020 - Squares & Black/White Squares & Dots & Full Dots +158013 - 0x0005D (Shed Row 1) - True - Full Dots +158014 - 0x0005E (Shed Row 2) - 0x0005D - Full Dots +158015 - 0x0005F (Shed Row 3) - 0x0005E - Full Dots +158016 - 0x00060 (Shed Row 4) - 0x0005F - Full Dots +158017 - 0x00061 (Shed Row 5) - 0x00060 - Full Dots +158018 - 0x018AF (Tree Row 1) - True - Black/White Squares +158019 - 0x0001B (Tree Row 2) - 0x018AF - Black/White Squares +158020 - 0x012C9 (Tree Row 3) - 0x0001B - Black/White Squares +158021 - 0x0001C (Tree Row 4) - 0x012C9 - Black/White Squares & Dots +158022 - 0x0001D (Tree Row 5) - 0x0001C - Black/White Squares & Dots +158023 - 0x0001E (Tree Row 6) - 0x0001D - Black/White Squares & Dots +158024 - 0x0001F (Tree Row 7) - 0x0001E - Black/White Squares & Full Dots +158025 - 0x00020 (Tree Row 8) - 0x0001F - Black/White Squares & Full Dots +158026 - 0x00021 (Tree Row 9) - 0x00020 - Black/White Squares & Full Dots Door - 0x03BA2 (Outpost Path) - 0x0A3B5 159511 - 0x03D06 (Garden EP) - True - True 159514 - 0x28A2F (Town Sewer EP) - True - True @@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial): 158651 - 0x03481 (Vault Box) - True - True Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: -158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles +158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots & Triangles Door - 0x0A170 (Outpost Entry) - 0x0A171 Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: -158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots & Shapers & Rotated Shapers +158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots & Shapers & Rotated Shapers Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Arrows @@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True Symmetry Island Upper (Symmetry Island): -158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots -158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots -158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots -158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots -158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots -158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots +158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots +158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots +158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots +158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots +158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots +158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots 158700 - 0x0360D (Laser Panel) - 0x00A68 - True Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True @@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True: 159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: -158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares +158652 - 0x0CC7B (Vault Panel) - True - Full Dots & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Arrows 158076 - 0x00698 (Surface 1) - True - True @@ -249,9 +249,9 @@ Quarry Obelisk (Quarry) - Entry - True: 159749 - 0x22073 (Obelisk) - True - True Outside Quarry (Quarry) - Main Island - True - Quarry Between Entry Doors - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: -158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles +158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares & Triangles 158603 - 0x17CF0 (Discard) - True - Arrows -158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol +158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars + Same Colored Symbol Laser - 0x01539 (Laser) - 0x03612 Door - 0x09D6F (Entry 1) - 0x09E57 159404 - 0x28A4A (Shore EP) - True - True @@ -270,7 +270,7 @@ Door - 0x17C07 (Entry 2) - 0x17C09 Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010: 159802 - 0xFFD01 (Inside Reached Independently) - True - True -158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Squares & Black/White Squares & Stars & Stars + Same Colored Symbol +158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol 158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A @@ -295,23 +295,23 @@ Quarry Stoneworks Lift (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x03675 - Quarry Stoneworks Ground Floor - 0x0368A: 158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser 158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser -158134 - 0x00557 (Upper Row 1) - True - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158135 - 0x005F1 (Upper Row 2) - 0x00557 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158136 - 0x00620 (Upper Row 3) - 0x005F1 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158137 - 0x009F5 (Upper Row 4) - 0x00620 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158138 - 0x0146C (Upper Row 5) - 0x009F5 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158139 - 0x3C12D (Upper Row 6) - 0x0146C - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158140 - 0x03686 (Upper Row 7) - 0x3C12D - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158141 - 0x014E9 (Upper Row 8) - 0x03686 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol -158142 - 0x03677 (Stairs Panel) - True - Squares & Colored Squares & Eraser +158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser & Stars + Same Colored Symbol +158135 - 0x005F1 (Upper Row 2) - 0x00557 - Colored Squares & Eraser & Stars + Same Colored Symbol +158136 - 0x00620 (Upper Row 3) - 0x005F1 - Colored Squares & Eraser & Stars + Same Colored Symbol +158137 - 0x009F5 (Upper Row 4) - 0x00620 - Colored Squares & Eraser & Stars + Same Colored Symbol +158138 - 0x0146C (Upper Row 5) - 0x009F5 - Colored Squares & Eraser & Stars + Same Colored Symbol +158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser & Stars + Same Colored Symbol +158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser & Stars + Same Colored Symbol +158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser & Stars + Same Colored Symbol +158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser Door - 0x0368A (Stairs) - 0x03677 -158143 - 0x3C125 (Control Room Left) - 0x014E9 - Squares & Black/White Squares & Dots & Full Dots & Eraser -158144 - 0x0367C (Control Room Right) - 0x014E9 - Squares & Colored Squares & Triangles & Eraser & Stars & Stars + Same Colored Symbol +158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Full Dots & Eraser +158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Triangles & Eraser & Stars + Same Colored Symbol 159411 - 0x0069D (Ramp EP) - 0x03676 & 0x275FF - True 159413 - 0x00614 (Lift EP) - 0x275FF & 0x03675 - True Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Front - 0x03852 - Quarry Boathouse Behind Staircase - 0x2769B: -158146 - 0x034D4 (Intro Left) - True - Stars & Stars + Same Colored Symbol & Eraser +158146 - 0x034D4 (Intro Left) - True - Stars + Same Colored Symbol & Eraser 158147 - 0x021D5 (Intro Right) - True - Shapers & Eraser 158148 - 0x03852 (Ramp Height Control) - 0x034D4 & 0x021D5 - Rotated Shapers 158166 - 0x17CA6 (Boat Spawn) - True - Boat @@ -335,19 +335,19 @@ Quarry Boathouse Upper Middle (Quarry Boathouse) - Quarry Boathouse Upper Back - Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x3865F: 158155 - 0x38663 (Second Barrier Panel) - True - True Door - 0x3865F (Second Barrier) - 0x38663 -158156 - 0x021B5 (Back First Row 1) - True - Stars & Stars + Same Colored Symbol & Eraser -158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser -158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser -158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser -158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser +158156 - 0x021B5 (Back First Row 1) - True - Stars + Same Colored Symbol & Eraser +158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser +158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars + Same Colored Symbol & Eraser +158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser +158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser 158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Eraser & Shapers 158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Eraser & Shapers -158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Eraser & Shapers & Stars & Stars + Same Colored Symbol -158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Eraser & Shapers & Stars & Stars + Same Colored Symbol +158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Eraser & Shapers & Stars + Same Colored Symbol +158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Eraser & Shapers & Stars + Same Colored Symbol 158165 - 0x275FA (Hook Control) - True - Shapers & Eraser -158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol -158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol -158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol +158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol +158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol +158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True ==Shadows== @@ -400,7 +400,7 @@ Outside Keep (Keep) - Main Island - True: Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True 158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True -158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars & Stars + Same Colored Symbol +158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars + Same Colored Symbol Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA @@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True: 158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True -158200 - 0x01BE9 (Pressure Plates 2) - PP2 Weirdness - Stars & Stars + Same Colored Symbol & Squares & Black/White Squares & Shapers & Rotated Shapers +158200 - 0x01BE9 (Pressure Plates 2) - PP2 Weirdness - Stars + Same Colored Symbol & Black/White Squares & Shapers & Rotated Shapers Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9 Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5: @@ -431,7 +431,7 @@ Door - 0x01CD5 (Pressure Plates 3 Exit) - 0x01CD3 Keep 4th Pressure Plate (Keep) - Shadows - 0x09E3D - Keep Tower - 0x01D40: 158203 - 0x0A3AD (Reset Pressure Plates 4) - True - True -158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Triangles & Stars & Stars + Same Colored Symbol +158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Triangles & Stars + Same Colored Symbol Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F 158604 - 0x17D27 (Discard) - True - Arrows 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True @@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F: 158206 - 0x0361B (Tower Shortcut Panel) - True - True Door - 0x04F8F (Tower Shortcut) - 0x0361B 158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars & Stars + Same Colored Symbol & Colored Squares & Black/White Squares +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars + Same Colored Symbol & Colored Squares & Black/White Squares Laser - 0x014BB (Laser) - 0x0360E | 0x03317 159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True 159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True @@ -530,20 +530,20 @@ Town Obelisk (Town) - Entry - True: Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - Town RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat -158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles +158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers & Triangles Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 158707 - 0x09F98 (Desert Laser Redirect Control) - True - True 158220 - 0x18590 (Transparent) - True - Symmetry 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True -158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Triangles & Dots & Full Dots -158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Triangles & Dots & Full Dots -158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Triangles & Dots & Full Dots -158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Dots & Full Dots -158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Dots & Full Dots +158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Triangles & Full Dots +158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Triangles & Full Dots +158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Triangles & Full Dots +158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Full Dots +158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Full Dots Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 -158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers & Stars + Same Colored Symbol +158225 - 0x28998 (RGB House Entry Panel) - True - Rotated Shapers & Stars + Same Colored Symbol Door - 0x28A61 (RGB House Entry) - 0x28A0D 158226 - 0x28A0D (Church Entry Panel) - 0x28998 - Stars Door - 0x03BB0 (Church Entry) - 0x03C08 @@ -575,7 +575,7 @@ Town Red Rooftop (Town): 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True Town Wooden Rooftop (Town): -158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Triangles & Dots & Full Dots & Eraser +158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Triangles & Full Dots & Eraser Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True @@ -587,8 +587,8 @@ Town RGB House (Town RGB House) - Town RGB House Upstairs - 0x2897B: Door - 0x2897B (Stairs) - 0x034E4 & 0x034E3 Town RGB House Upstairs (Town RGB House Upstairs): -158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Squares & Colored Squares & Triangles -158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser +158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Colored Squares & Triangles +158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares & Eraser 158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles Town Tower Bottom (Town Tower) - Town - True - Town Tower After First Door - 0x27799: @@ -620,7 +620,7 @@ Door - 0x1845B (Entry) - 0x17F5F Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots -158248 - 0x17F89 (Theater Entry Panel) - True - Squares & Black/White Squares & Eraser & Triangles +158248 - 0x17F89 (Theater Entry Panel) - True - Black/White Squares & Eraser & Triangles Door - 0x17F88 (Theater Entry) - 0x17F89 Theater (Theater) - Town - 0x0A16D | 0x3CCDF: @@ -631,7 +631,7 @@ Theater (Theater) - Town - 0x0A16D | 0x3CCDF: 158660 - 0x03549 (Challenge Video) - 0x00815 & 0x0356B - True 158661 - 0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True 158662 - 0x03545 (Mountain Video) - 0x00815 & 0x03542 - True -158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser +158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Eraser 158250 - 0x33AB2 (Exit Right Panel) - True - Eraser & Triangles & Shapers Door - 0x0A16D (Exit Left) - 0x0A168 Door - 0x3CCDF (Exit Right) - 0x33AB2 @@ -693,33 +693,33 @@ Jungle Vault (Jungle): ==Bunker== Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: -158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares +158268 - 0x17C2E (Entry Panel) - True - Black/White Squares Door - 0x0C2A4 (Entry) - 0x17C2E Bunker (Bunker) - Bunker Glass Room - 0x17C79: -158269 - 0x09F7D (Intro Left 1) - True - Squares & Colored Squares -158270 - 0x09FDC (Intro Left 2) - 0x09F7D - Squares & Colored Squares & Black/White Squares -158271 - 0x09FF7 (Intro Left 3) - 0x09FDC - Squares & Colored Squares & Black/White Squares -158272 - 0x09F82 (Intro Left 4) - 0x09FF7 - Squares & Colored Squares & Black/White Squares -158273 - 0x09FF8 (Intro Left 5) - 0x09F82 - Squares & Colored Squares & Black/White Squares -158274 - 0x09D9F (Intro Back 1) - 0x09FF8 - Squares & Colored Squares & Black/White Squares -158275 - 0x09DA1 (Intro Back 2) - 0x09D9F - Squares & Colored Squares -158276 - 0x09DA2 (Intro Back 3) - 0x09DA1 - Squares & Colored Squares -158277 - 0x09DAF (Intro Back 4) - 0x09DA2 - Squares & Colored Squares +158269 - 0x09F7D (Intro Left 1) - True - Colored Squares +158270 - 0x09FDC (Intro Left 2) - 0x09F7D - Colored Squares & Black/White Squares +158271 - 0x09FF7 (Intro Left 3) - 0x09FDC - Colored Squares & Black/White Squares +158272 - 0x09F82 (Intro Left 4) - 0x09FF7 - Colored Squares & Black/White Squares +158273 - 0x09FF8 (Intro Left 5) - 0x09F82 - Colored Squares & Black/White Squares +158274 - 0x09D9F (Intro Back 1) - 0x09FF8 - Colored Squares & Black/White Squares +158275 - 0x09DA1 (Intro Back 2) - 0x09D9F - Colored Squares +158276 - 0x09DA2 (Intro Back 3) - 0x09DA1 - Colored Squares +158277 - 0x09DAF (Intro Back 4) - 0x09DA2 - Colored Squares 158278 - 0x0A099 (Tinted Glass Door Panel) - 0x09DAF - True Door - 0x17C79 (Tinted Glass Door) - 0x0A099 Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3: -158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Squares & Colored Squares -158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Squares & Colored Squares & Black/White Squares -158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Squares & Colored Squares & Black/White Squares +158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Colored Squares +158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Colored Squares & Black/White Squares +158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Colored Squares & Black/White Squares Door - 0x0C2A3 (UV Room Entry) - 0x0A01F Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: 158282 - 0x34BC5 (Drop-Down Door Open) - True - True 158283 - 0x34BC6 (Drop-Down Door Close) - 0x34BC5 - True -158284 - 0x17E63 (UV Room 1) - 0x34BC5 - Squares & Colored Squares -158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Squares & Colored Squares & Black/White Squares +158284 - 0x17E63 (UV Room 1) - 0x34BC5 - Colored Squares +158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Colored Squares & Black/White Squares Door - 0x0A08D (Elevator Room Entry) - 0x17E67 Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform: @@ -797,31 +797,31 @@ Swamp Between Bridges Near (Swamp) - Swamp Between Bridges Far - 0x18507: Door - 0x18507 (Between Bridges Second Door) - 0x009A1 Swamp Between Bridges Far (Swamp) - Swamp Red Underwater - 0x183F2 - Swamp Rotating Bridge - TrueOneWay: -158319 - 0x00007 (Between Bridges Far Row 1) - 0x009A1 - Rotated Shapers & Dots & Full Dots -158320 - 0x00008 (Between Bridges Far Row 2) - 0x00007 - Rotated Shapers & Dots & Full Dots -158321 - 0x00009 (Between Bridges Far Row 3) - 0x00008 - Rotated Shapers & Shapers & Dots & Full Dots -158322 - 0x0000A (Between Bridges Far Row 4) - 0x00009 - Rotated Shapers & Shapers & Dots & Full Dots +158319 - 0x00007 (Between Bridges Far Row 1) - 0x009A1 - Rotated Shapers & Full Dots +158320 - 0x00008 (Between Bridges Far Row 2) - 0x00007 - Rotated Shapers & Full Dots +158321 - 0x00009 (Between Bridges Far Row 3) - 0x00008 - Rotated Shapers & Shapers & Full Dots +158322 - 0x0000A (Between Bridges Far Row 4) - 0x00009 - Rotated Shapers & Shapers & Full Dots Door - 0x183F2 (Red Water Pump) - 0x00596 Swamp Red Underwater (Swamp) - Swamp Maze - 0x305D5: -158323 - 0x00001 (Red Underwater 1) - True - Shapers & Negative Shapers & Dots & Full Dots -158324 - 0x014D2 (Red Underwater 2) - True - Shapers & Negative Shapers & Dots & Full Dots -158325 - 0x014D4 (Red Underwater 3) - True - Shapers & Negative Shapers & Dots & Full Dots -158326 - 0x014D1 (Red Underwater 4) - True - Shapers & Negative Shapers & Dots & Full Dots +158323 - 0x00001 (Red Underwater 1) - True - Shapers & Negative Shapers & Full Dots +158324 - 0x014D2 (Red Underwater 2) - True - Shapers & Negative Shapers & Full Dots +158325 - 0x014D4 (Red Underwater 3) - True - Shapers & Negative Shapers & Full Dots +158326 - 0x014D1 (Red Underwater 4) - True - Shapers & Negative Shapers & Full Dots Door - 0x305D5 (Red Underwater Exit) - 0x014D1 Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near Boat - 0x181F5 - Swamp Purple Area - 0x181F5: -158327 - 0x181F5 (Rotating Bridge) - True - Rotated Shapers & Shapers & Stars & Colored Squares & Triangles & Stars + Same Colored Symbol +158327 - 0x181F5 (Rotating Bridge) - True - Rotated Shapers & Shapers & Colored Squares & Triangles & Stars + Same Colored Symbol 159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True 159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482 - Swamp Long Bridge - 0xFFD00 & 0xFFD02 - The Ocean - 0x09DB8: 159803 - 0xFFD02 (Beyond Rotating Bridge Reached Independently) - True - True 158328 - 0x09DB8 (Boat Spawn) - True - Boat -158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Dots & Full Dots -158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Dots & Full Dots -158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Dots & Full Dots -158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Dots & Full Dots +158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Full Dots +158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Full Dots +158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Full Dots +158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Full Dots Door - 0x18482 (Blue Water Pump) - 0x00E3A 159332 - 0x3365F (Boat EP) - 0x09DB8 - True 159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True @@ -833,7 +833,7 @@ Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Un Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A Swamp Purple Underwater (Swamp): -158333 - 0x009A6 (Purple Underwater) - True - Shapers & Triangles & Black/White Squares & Rotated Shapers & Dots & Full Dots +158333 - 0x009A6 (Purple Underwater) - True - Shapers & Triangles & Black/White Squares & Rotated Shapers & Full Dots 159330 - 0x03A9E (Purple Underwater Right EP) - True - True 159336 - 0x03A93 (Purple Underwater Left EP) - True - True @@ -851,8 +851,8 @@ Swamp Maze (Swamp) - Swamp Laser Area - 0x17C0A & 0x17E07: Swamp Laser Area (Swamp) - Outside Swamp - 0x2D880: 158711 - 0x03615 (Laser Panel) - True - True Laser - 0x00BF6 (Laser) - 0x03615 -158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol -158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol +158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol +158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars + Same Colored Symbol Door - 0x2D880 (Laser Shortcut) - 0x17C02 ==Treehouse== @@ -873,91 +873,91 @@ Treehouse Beach (Treehouse Beach) - Main Island - True: Treehouse Entry Area (Treehouse) - Treehouse Between Entry Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat -158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles +158344 - 0x0288C (First Door Panel) - True - Stars + Same Colored Symbol & Triangles Door - 0x0C309 (First Door) - 0x0288C 159210 - 0x33721 (Buoy EP) - 0x17C95 - True Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: -158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles +158345 - 0x02886 (Second Door Panel) - True - Stars + Same Colored Symbol & Triangles Door - 0x0C310 (Second Door) - 0x02886 Treehouse Yellow Bridge (Treehouse) - Treehouse After Yellow Bridge - 0x17DC4: -158346 - 0x17D72 (Yellow Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles -158347 - 0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars & Stars + Same Colored Symbol & Triangles -158348 - 0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars & Stars + Same Colored Symbol & Triangles -158349 - 0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars & Stars + Same Colored Symbol & Triangles -158350 - 0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars & Stars + Same Colored Symbol & Triangles -158351 - 0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars & Stars + Same Colored Symbol & Triangles -158352 - 0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars & Stars + Same Colored Symbol & Triangles -158353 - 0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars & Stars + Same Colored Symbol & Triangles -158354 - 0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars & Stars + Same Colored Symbol & Triangles +158346 - 0x17D72 (Yellow Bridge 1) - True - Stars + Same Colored Symbol & Triangles +158347 - 0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars + Same Colored Symbol & Triangles +158348 - 0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars + Same Colored Symbol & Triangles +158349 - 0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars + Same Colored Symbol & Triangles +158350 - 0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars + Same Colored Symbol & Triangles +158351 - 0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars + Same Colored Symbol & Triangles +158352 - 0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars + Same Colored Symbol & Triangles +158353 - 0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars + Same Colored Symbol & Triangles +158354 - 0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars + Same Colored Symbol & Triangles Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181: -158355 - 0x0A182 (Third Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Colored Squares +158355 - 0x0A182 (Third Door Panel) - True - Stars + Same Colored Symbol & Triangles & Colored Squares Door - 0x0A181 (Third Door) - 0x0A182 Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True: 158356 - 0x2700B (Laser House Door Timer Outside) - True - True Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C: -158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots & Full Dots -158358 - 0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Dots & Full Dots -158359 - 0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Dots & Full Dots -158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots & Full Dots -158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots & Full Dots +158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Full Dots +158358 - 0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Full Dots +158359 - 0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Full Dots +158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Full Dots +158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Full Dots Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2: -158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles -158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars & Stars + Same Colored Symbol & Triangles -158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars & Stars + Same Colored Symbol & Triangles +158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars + Same Colored Symbol & Triangles +158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars + Same Colored Symbol & Triangles +158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars + Same Colored Symbol & Triangles 158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Triangles -158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars & Stars + Same Colored Symbol & Triangles -158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars & Stars + Same Colored Symbol & Triangles -158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars & Stars + Same Colored Symbol & Triangles -158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars & Stars + Same Colored Symbol & Triangles -158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars & Stars + Same Colored Symbol & Triangles +158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars + Same Colored Symbol & Triangles +158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars + Same Colored Symbol & Triangles +158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars + Same Colored Symbol & Triangles +158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars + Same Colored Symbol & Triangles +158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars + Same Colored Symbol & Triangles 158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Triangles -158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars & Stars + Same Colored Symbol & Triangles -158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Triangles +158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars + Same Colored Symbol & Triangles +158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars + Same Colored Symbol & Triangles Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D: 158404 - 0x037FF (Drawbridge Panel) - True - Stars Door - 0x0C32D (Drawbridge) - 0x037FF Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6: -158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol -158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol -158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol -158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Black/White Squares & Colored Squares & Triangles & Stars + Same Colored Symbol -158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol -158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol -158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol +158362 - 0x17D9B (Second Purple Bridge 1) - True - Black/White Squares & Triangles & Stars + Same Colored Symbol +158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Black/White Squares & Triangles & Stars + Same Colored Symbol +158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Black/White Squares & Triangles & Stars + Same Colored Symbol +158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Black/White Squares & Colored Squares & Triangles & Stars + Same Colored Symbol +158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Colored Squares & Triangles & Stars + Same Colored Symbol +158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Colored Squares & Triangles & Stars + Same Colored Symbol +158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Colored Squares & Triangles & Stars + Same Colored Symbol Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDE - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB: -158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares -158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares -158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares -158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares -158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC & 0x03613 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Triangles -158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol -158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol +158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares +158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares +158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares +158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares +158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC & 0x03613 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Triangles +158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol +158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61: -158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles -158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles +158369 - 0x17E3C (Green Bridge 1) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol +158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Shapers & Negative Shapers & Stars + Same Colored Symbol +158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Shapers & Negative Shapers & Stars + Same Colored Symbol +158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Shapers & Negative Shapers & Stars + Same Colored Symbol +158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Negative Shapers & Stars + Same Colored Symbol +158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles +158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles Treehouse Green Bridge Front House (Treehouse): 158610 - 0x17FA9 (Green Bridge Discard) - True - Arrows @@ -993,7 +993,7 @@ Mountainside Obelisk (Mountainside) - Entry - True: Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: 159550 - 0x28B91 (Thundercloud EP) - 0xFFD03 - True 158612 - 0x17C42 (Discard) - True - Arrows -158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol +158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars + Same Colored Symbol Door - 0x00085 (Vault Door) - 0x002A6 159301 - 0x335AE (Cloud Cycle EP) - True - True 159325 - 0x33505 (Bush EP) - True - True @@ -1005,7 +1005,7 @@ Mountainside Vault (Mountainside): Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: 158405 - 0x0042D (River Shape) - True - True 158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True -158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles +158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares & Stars + Same Colored Symbol & Triangles 158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True 159300 - 0x001A3 (River Shape EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True @@ -1018,18 +1018,18 @@ Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: -158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol +158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars + Same Colored Symbol 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles -158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol -158412 - 0x09E69 (Right Row 4) - 0x09E72 - Stars & Black/White Squares & Stars + Same Colored Symbol & Rotated Shapers -158413 - 0x09E7B (Right Row 5) - 0x09E69 - Stars & Black/White Squares & Stars + Same Colored Symbol & Eraser & Dots & Triangles & Shapers +158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars + Same Colored Symbol +158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Stars + Same Colored Symbol & Rotated Shapers +158413 - 0x09E7B (Right Row 5) - 0x09E69 - Black/White Squares & Stars + Same Colored Symbol & Eraser & Dots & Triangles & Shapers 158414 - 0x09E73 (Left Row 1) - True - Dots & Black/White Squares & Triangles 158415 - 0x09E75 (Left Row 2) - 0x09E73 - Dots & Black/White Squares & Shapers & Rotated Shapers -158416 - 0x09E78 (Left Row 3) - 0x09E75 - Stars & Triangles & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158417 - 0x09E79 (Left Row 4) - 0x09E78 - Stars & Colored Squares & Stars + Same Colored Symbol & Triangles & Eraser -158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Stars & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry & Eraser -158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Dots & Full Dots & Triangles +158416 - 0x09E78 (Left Row 3) - 0x09E75 - Triangles & Stars + Same Colored Symbol & Shapers & Rotated Shapers +158417 - 0x09E79 (Left Row 4) - 0x09E78 - Colored Squares & Stars + Same Colored Symbol & Triangles & Eraser +158418 - 0x09E6C (Left Row 5) - 0x09E79 - Shapers & Negative Shapers & Stars + Same Colored Symbol +158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry & Eraser +158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Full Dots & Triangles 158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles @@ -1037,18 +1037,18 @@ Mountain Floor 1 Trash Pillar (Mountain Floor 1): Mountain Floor 1 Back Section (Mountain Floor 1): 158421 - 0x33AF5 (Back Row 1) - True - Symmetry & Black/White Squares & Triangles -158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Stars & Triangles & Stars + Same Colored Symbol -158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Stars & Shapers & Stars + Same Colored Symbol +158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Triangles & Stars + Same Colored Symbol +158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Shapers & Stars + Same Colored Symbol Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay: -158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol -158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Triangles & Stars + Same Colored Symbol -158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol +158426 - 0x09FD3 (Near Row 1) - True - Colored Squares & Stars + Same Colored Symbol +158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Triangles & Stars + Same Colored Symbol +158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Shapers & Negative Shapers & Stars + Same Colored Symbol 158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars -158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser +158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Stars + Same Colored Symbol & Rotated Shapers & Eraser Door - 0x09FFB (Staircase Near) - 0x09FD8 Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD & 0x09ED8 & 0x09E86: @@ -1059,8 +1059,8 @@ Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8: 158432 - 0x09FCC (Far Row 1) - True - Triangles -158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars & Stars + Same Colored Symbol -158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars & Triangles & Stars + Same Colored Symbol +158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars + Same Colored Symbol +158434 - 0x09FCF (Far Row 3) - 0x09FCE - Triangles & Stars + Same Colored Symbol 158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Rotated Shapers & Negative Shapers 158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Dots 158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Rotated Shapers @@ -1088,19 +1088,19 @@ Door - 0x09F89 (Exit) - 0x09FDA Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141: 158614 - 0x17FA2 (Discard) - 0xFFF00 - Arrows 158445 - 0x01983 (Pillars Room Entry Left) - True - Shapers & Stars -158446 - 0x01987 (Pillars Room Entry Right) - True - Squares & Colored Squares & Dots +158446 - 0x01987 (Pillars Room Entry Right) - True - Colored Squares & Dots Door - 0x0C141 (Pillars Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: -158522 - 0x0383A (Right Pillar 1) - True - Stars & Eraser & Triangles & Stars + Same Colored Symbol -158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Dots & Full Dots & Triangles & Symmetry -158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry -158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars & Stars + Same Colored Symbol & Negative Shapers & Shapers -158526 - 0x0383D (Left Pillar 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol +158522 - 0x0383A (Right Pillar 1) - True - Eraser & Triangles & Stars + Same Colored Symbol +158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Full Dots & Triangles & Symmetry +158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Negative Shapers & Stars + Same Colored Symbol & Symmetry +158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars + Same Colored Symbol & Negative Shapers & Shapers +158526 - 0x0383D (Left Pillar 1) - True - Black/White Squares & Stars + Same Colored Symbol 158527 - 0x0383F (Left Pillar 2) - 0x0383D - Triangles & Symmetry 158528 - 0x03859 (Left Pillar 3) - 0x0383F - Symmetry & Shapers & Black/White Squares -158529 - 0x339BB (Left Pillar 4) - 0x03859 - Symmetry & Black/White Squares & Stars & Stars + Same Colored Symbol & Triangles & Colored Dots +158529 - 0x339BB (Left Pillar 4) - 0x03859 - Symmetry & Black/White Squares & Stars + Same Colored Symbol & Triangles & Colored Dots Elevator (Mountain Bottom Floor): 158530 - 0x3D9A6 (Elevator Door Close Left) - True - True @@ -1124,9 +1124,9 @@ Door - 0x2D77D (Caves Entry) - 0x00FF8 Caves Entry Door (Caves): Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay: -158451 - 0x335AB (Elevator Inside Control) - True - Dots & Squares & Black/White Squares -158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Squares & Black/White Squares -158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Squares & Black/White Squares & Dots +158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares +158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares +158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots 158454 - 0x00190 (Blue Tunnel Right First 1) - True - Arrows 158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Arrows 158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Arrows @@ -1145,41 +1145,41 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158469 - 0x009A4 (Blue Tunnel Left Third 1) - True - Arrows & Stars 158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Arrows & Symmetry 158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Arrows & Shapers & Negative Shapers -158472 - 0x32962 (First Floor Left) - True - Dots & Full Dots & Rotated Shapers -158473 - 0x32966 (First Floor Grounded) - True - Stars & Triangles & Rotated Shapers & Black/White Squares & Stars + Same Colored Symbol +158472 - 0x32962 (First Floor Left) - True - Full Dots & Rotated Shapers +158473 - 0x32966 (First Floor Grounded) - True - Triangles & Rotated Shapers & Black/White Squares & Stars + Same Colored Symbol 158474 - 0x01A31 (First Floor Middle) - True - Stars -158475 - 0x00B71 (First Floor Right) - True - Dots & Full Dots & Eraser & Stars & Stars + Same Colored Symbol & Colored Squares & Shapers & Negative Shapers +158475 - 0x00B71 (First Floor Right) - True - Full Dots & Eraser & Stars + Same Colored Symbol & Colored Squares & Shapers & Negative Shapers 158478 - 0x288EA (First Wooden Beam) - True - Stars 158479 - 0x288FC (Second Wooden Beam) - True - Shapers & Eraser 158480 - 0x289E7 (Third Wooden Beam) - True - Eraser & Triangles -158481 - 0x288AA (Fourth Wooden Beam) - True - Dots & Full Dots & Negative Shapers & Shapers -158482 - 0x17FB9 (Left Upstairs Single) - True - Dots & Full Dots & Arrows & Black/White Squares -158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots & Arrows -158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots & Arrows -158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots & Arrows -158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots & Arrows -158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots & Arrows +158481 - 0x288AA (Fourth Wooden Beam) - True - Full Dots & Negative Shapers & Shapers +158482 - 0x17FB9 (Left Upstairs Single) - True - Full Dots & Arrows & Black/White Squares +158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots & Arrows +158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots & Arrows +158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots & Arrows +158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots & Arrows +158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots & Arrows 158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Black/White Squares & Colored Squares -158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Triangles -158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers -158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser & Triangles +158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Triangles +158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Stars + Same Colored Symbol & Shapers & Rotated Shapers +158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser & Triangles 158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Shapers & Negative Shapers & Dots 158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars & Dots -158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Stars & Stars + Same Colored Symbol & Eraser +158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Stars + Same Colored Symbol & Eraser 158496 - 0x00027 (Right Upstairs Right Row 1) - True - Colored Squares & Black/White Squares & Eraser 158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Shapers & Symmetry 158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Symmetry & Triangles & Eraser 158476 - 0x09DD5 (Lone Pillar) - True - Arrows Door - 0x019A5 (Pillar Door) - 0x09DD5 -158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Eraser +158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars + Same Colored Symbol & Triangles & Eraser Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7 158450 - 0x17CF2 (Swamp Shortcut Panel) - True - Arrows Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True Caves Path to Challenge (Caves) - Challenge - 0x0A19A: -158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol +158477 - 0x0A16E (Challenge Entry Panel) - True - Arrows & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E ==Challenge== diff --git a/worlds/witness/data/WitnessLogicVanilla.txt b/worlds/witness/data/WitnessLogicVanilla.txt index a967a12e28..f3fa51bb9d 100644 --- a/worlds/witness/data/WitnessLogicVanilla.txt +++ b/worlds/witness/data/WitnessLogicVanilla.txt @@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial): 158651 - 0x03481 (Vault Box) - True - True Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: -158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots +158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots Door - 0x0A170 (Outpost Entry) - 0x0A171 Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: -158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots +158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Triangles @@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True Symmetry Island Upper (Symmetry Island): -158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots -158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots -158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots -158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots -158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots -158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots +158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots +158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots +158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots +158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots +158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots +158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots 158700 - 0x0360D (Laser Panel) - 0x00A68 - True Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True @@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True: 159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: -158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots +158652 - 0x0CC7B (Vault Panel) - True - Shapers & Rotated Shapers & Negative Shapers & Full Dots Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Triangles 158076 - 0x00698 (Surface 1) - True - True @@ -285,7 +285,7 @@ Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - Tr 158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser 158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser 158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser -158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Full Dots & Eraser +158128 - 0x014D9 (Lower Row 4) - 0x0148A - Full Dots & Eraser 158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots 158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser @@ -336,12 +336,12 @@ Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 158155 - 0x38663 (Second Barrier Panel) - True - True Door - 0x3865F (Second Barrier) - 0x38663 158156 - 0x021B5 (Back First Row 1) - True - Stars & Eraser -158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser +158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser 158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Eraser -158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser -158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser -158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser -158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser +158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser +158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser +158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser +158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser 158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Eraser & Shapers 158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Eraser & Shapers 158165 - 0x275FA (Hook Control) - True - Shapers & Eraser @@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True -158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots -158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Rotated Shapers & Dots & Full Dots -158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots & Full Dots -158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots -158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots +158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots +158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Rotated Shapers & Full Dots +158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Full Dots +158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots +158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers Door - 0x28A61 (RGB House Entry) - 0x28998 @@ -575,7 +575,7 @@ Town Red Rooftop (Town): 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True Town Wooden Rooftop (Town): -158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Shapers & Dots & Eraser & Full Dots +158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Shapers & Eraser & Full Dots Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True @@ -934,28 +934,28 @@ Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17 158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB: -158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol +158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol 158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares -158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol -158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol -158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Stars + Same Colored Symbol -158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol -158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol -158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol -158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol -158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol -158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol -158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Black/White Squares & Stars + Same Colored Symbol -158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol -158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol +158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol +158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol +158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Stars + Same Colored Symbol +158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol +158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol +158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol +158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol +158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol +158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Black/White Squares & Stars + Same Colored Symbol +158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol +158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61: 158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers 158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers 158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Rotated Shapers 158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers -158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Stars + Same Colored Symbol +158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Stars + Same Colored Symbol 158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Negative Shapers & Rotated Shapers 158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Rotated Shapers @@ -1046,8 +1046,8 @@ Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay: 158426 - 0x09FD3 (Near Row 1) - True - Colored Squares 158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Colored Squares & Dots -158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol -158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers +158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Colored Squares & Stars + Same Colored Symbol +158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Colored Squares & Stars + Same Colored Symbol & Shapers 158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Colored Squares Door - 0x09FFB (Staircase Near) - 0x09FD8 @@ -1095,9 +1095,9 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: 158522 - 0x0383A (Right Pillar 1) - True - Stars 158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots -158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots +158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots 158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry -158526 - 0x0383D (Left Pillar 1) - True - Dots & Full Dots +158526 - 0x0383D (Left Pillar 1) - True - Full Dots 158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares 158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers 158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry @@ -1148,28 +1148,28 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158472 - 0x32962 (First Floor Left) - True - Rotated Shapers & Shapers 158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares 158474 - 0x01A31 (First Floor Middle) - True - Colored Squares -158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser +158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser 158478 - 0x288EA (First Wooden Beam) - True - Rotated Shapers 158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers 158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares 158481 - 0x288AA (Fourth Wooden Beam) - True - Black/White Squares & Shapers 158482 - 0x17FB9 (Left Upstairs Single) - True - Dots -158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots -158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots -158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots -158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots -158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots -158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots -158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots -158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots -158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots & Invisible Dots -158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots & Invisible Dots -158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots & Invisible Dots -158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots & Invisible Dots -158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Invisible Dots -158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Invisible Dots & Symmetry -158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Invisible Dots & Symmetry -158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Invisible Dots & Symmetry +158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots +158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots +158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots +158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots +158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots +158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots +158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots +158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots +158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots +158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots +158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots +158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots +158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots +158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Symmetry +158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Symmetry +158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Symmetry 158476 - 0x09DD5 (Lone Pillar) - True - Triangles Door - 0x019A5 (Pillar Door) - 0x09DD5 158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars @@ -1179,7 +1179,7 @@ Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True Caves Path to Challenge (Caves) - Challenge - 0x0A19A: -158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol +158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E ==Challenge== diff --git a/worlds/witness/data/WitnessLogicVariety.txt b/worlds/witness/data/WitnessLogicVariety.txt index bc9a40f566..1014558a66 100644 --- a/worlds/witness/data/WitnessLogicVariety.txt +++ b/worlds/witness/data/WitnessLogicVariety.txt @@ -28,11 +28,11 @@ Tutorial (Tutorial) - Outside Tutorial - True: Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0: 158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares & Colored Squares & Symmetry Door - 0x033D0 (Vault Door) - 0x033D4 -158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots & Black/White Squares & Colored Squares -158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots & Stars -158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots & Shapers & Negative Shapers -158016 - 0x00060 (Shed Row 4) - 0x0005F - Dots & Full Dots & Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser -158017 - 0x00061 (Shed Row 5) - 0x00060 - Dots & Full Dots & Triangles +158013 - 0x0005D (Shed Row 1) - True - Full Dots & Black/White Squares & Colored Squares +158014 - 0x0005E (Shed Row 2) - 0x0005D - Full Dots & Stars +158015 - 0x0005F (Shed Row 3) - 0x0005E - Full Dots & Shapers & Negative Shapers +158016 - 0x00060 (Shed Row 4) - 0x0005F - Full Dots & Black/White Squares & Stars + Same Colored Symbol & Eraser +158017 - 0x00061 (Shed Row 5) - 0x00060 - Full Dots & Triangles 158018 - 0x018AF (Tree Row 1) - True - Arrows 158019 - 0x0001B (Tree Row 2) - 0x018AF - Arrows 158020 - 0x012C9 (Tree Row 3) - 0x0001B - Arrows @@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial): 158651 - 0x03481 (Vault Box) - True - True Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: -158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles & Black/White Squares +158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots & Triangles & Black/White Squares Door - 0x0A170 (Outpost Entry) - 0x0A171 Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: -158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots & Triangles & Black/White Squares +158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots & Triangles & Black/White Squares Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Arrows & Triangles @@ -108,11 +108,11 @@ Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Door - 0x17F3E (Lower) - 0x000B0 Symmetry Island Lower (Symmetry Island) - Symmetry Island Upper - 0x18269: -158041 - 0x00022 (Right 1) - True - Symmetry & Dots & Full Dots & Triangles -158042 - 0x00023 (Right 2) - 0x00022 - Symmetry & Dots & Full Dots & Triangles -158043 - 0x00024 (Right 3) - 0x00023 - Symmetry & Dots & Full Dots & Triangles -158044 - 0x00025 (Right 4) - 0x00024 - Symmetry & Dots & Full Dots & Triangles -158045 - 0x00026 (Right 5) - 0x00025 - Symmetry & Dots & Full Dots & Triangles +158041 - 0x00022 (Right 1) - True - Symmetry & Full Dots & Triangles +158042 - 0x00023 (Right 2) - 0x00022 - Symmetry & Full Dots & Triangles +158043 - 0x00024 (Right 3) - 0x00023 - Symmetry & Full Dots & Triangles +158044 - 0x00025 (Right 4) - 0x00024 - Symmetry & Full Dots & Triangles +158045 - 0x00026 (Right 5) - 0x00025 - Symmetry & Full Dots & Triangles 158046 - 0x0007C (Back 1) - 0x00026 - Symmetry & Dots & Colored Dots 158047 - 0x0007E (Back 2) - 0x0007C - Symmetry & Dots & Colored Dots 158048 - 0x00075 (Back 3) - 0x0007E - Symmetry & Dots & Colored Dots @@ -122,8 +122,8 @@ Symmetry Island Lower (Symmetry Island) - Symmetry Island Upper - 0x18269: 158052 - 0x00065 (Left 1) - 0x00079 - Symmetry & Dots & Colored Dots 158053 - 0x0006D (Left 2) - 0x00065 - Symmetry & Colored Squares 158054 - 0x00072 (Left 3) - 0x0006D - Symmetry & Stars -158055 - 0x0006F (Left 4) - 0x00072 - Symmetry & Stars & Stars + Same Colored Symbol & Colored Squares -158056 - 0x00070 (Left 5) - 0x0006F - Symmetry & Stars & Stars + Same Colored Symbol & Colored Squares +158055 - 0x0006F (Left 4) - 0x00072 - Symmetry & Stars + Same Colored Symbol & Colored Squares +158056 - 0x00070 (Left 5) - 0x0006F - Symmetry & Stars + Same Colored Symbol & Colored Squares 158057 - 0x00071 (Left 6) - 0x00070 - Symmetry & Colored Dots & Eraser 158058 - 0x00076 (Left 7) - 0x00071 - Symmetry & Dots & Eraser 158059 - 0x009B8 (Scenery Outlines 1) - True - Symmetry @@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True Symmetry Island Upper (Symmetry Island): -158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots -158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots -158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots -158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots -158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots -158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots +158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots +158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots +158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots +158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots +158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots +158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots 158700 - 0x0360D (Laser Panel) - 0x00A68 - True Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True @@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True: 159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: -158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Rotated Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol +158652 - 0x0CC7B (Vault Panel) - True - Full Dots & Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Arrows & Triangles 158076 - 0x00698 (Surface 1) - True - True @@ -270,7 +270,7 @@ Door - 0x17C07 (Entry 2) - 0x17C09 Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010: 159802 - 0xFFD01 (Inside Reached Independently) - True - True -158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Stars & Stars + Same Colored Symbol & Eraser +158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Stars + Same Colored Symbol & Eraser 158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A @@ -299,14 +299,14 @@ Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x0 158135 - 0x005F1 (Upper Row 2) - 0x00557 - Colored Squares & Eraser 158136 - 0x00620 (Upper Row 3) - 0x005F1 - Colored Squares & Eraser 158137 - 0x009F5 (Upper Row 4) - 0x00620 - Colored Squares & Eraser -158138 - 0x0146C (Upper Row 5) - 0x009F5 - Stars & Stars + Same Colored Symbol & Eraser -158139 - 0x3C12D (Upper Row 6) - 0x0146C - Stars & Stars + Same Colored Symbol & Eraser -158140 - 0x03686 (Upper Row 7) - 0x3C12D - Stars & Stars + Same Colored Symbol & Eraser -158141 - 0x014E9 (Upper Row 8) - 0x03686 - Stars & Stars + Same Colored Symbol & Eraser +158138 - 0x0146C (Upper Row 5) - 0x009F5 - Stars + Same Colored Symbol & Eraser +158139 - 0x3C12D (Upper Row 6) - 0x0146C - Stars + Same Colored Symbol & Eraser +158140 - 0x03686 (Upper Row 7) - 0x3C12D - Stars + Same Colored Symbol & Eraser +158141 - 0x014E9 (Upper Row 8) - 0x03686 - Stars + Same Colored Symbol & Eraser 158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser Door - 0x0368A (Stairs) - 0x03677 158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser & Symmetry -158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser & Stars & Stars + Same Colored Symbol +158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser & Stars + Same Colored Symbol 159411 - 0x0069D (Ramp EP) - 0x03676 & 0x275FF - True 159413 - 0x00614 (Lift EP) - 0x275FF & 0x03675 - True @@ -340,13 +340,13 @@ Door - 0x3865F (Second Barrier) - 0x38663 158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Shapers & Negative Shapers & Eraser 158159 - 0x021BB (Back First Row 4) - 0x021B7 - Shapers & Negative Shapers & Eraser 158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Shapers & Negative Shapers & Eraser -158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares -158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares -158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles -158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles +158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser & Colored Squares +158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser & Colored Squares +158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles +158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles 158165 - 0x275FA (Hook Control) - True - Shapers & Eraser 158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Black/White Squares & Colored Squares & Eraser & Shapers -158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars & Stars + Same Colored Symbol & Eraser & Shapers +158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars + Same Colored Symbol & Eraser & Shapers 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Triangles & Eraser & Shapers 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True @@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True: 158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True -158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars & Stars + Same Colored Symbol & Triangles +158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars + Same Colored Symbol & Triangles Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9 Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5: @@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F: 158206 - 0x0361B (Tower Shortcut Panel) - True - True Door - 0x04F8F (Tower Shortcut) - 0x0361B 158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Colored Squares & Stars + Same Colored Symbol Laser - 0x014BB (Laser) - 0x0360E | 0x03317 159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True 159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True @@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True -158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots & Colored Squares -158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Rotated Shapers & Dots & Full Dots & Stars -158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Negative Shapers & Dots & Full Dots -158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots -158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots & Triangles +158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots & Colored Squares +158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Rotated Shapers & Full Dots & Stars +158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Negative Shapers & Full Dots +158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots +158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots & Triangles Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers Door - 0x28A61 (RGB House Entry) - 0x28998 @@ -575,7 +575,7 @@ Town Red Rooftop (Town): 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True Town Wooden Rooftop (Town): -158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser & Full Dots +158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Eraser & Full Dots Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True @@ -631,8 +631,8 @@ Theater (Theater) - Town - 0x0A16D | 0x3CCDF: 158660 - 0x03549 (Challenge Video) - 0x00815 & 0x0356B - True 158661 - 0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True 158662 - 0x03545 (Mountain Video) - 0x00815 & 0x03542 - True -158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers -158250 - 0x33AB2 (Exit Right Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers +158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers +158250 - 0x33AB2 (Exit Right Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers Door - 0x0A16D (Exit Left) - 0x0A168 Door - 0x3CCDF (Exit Right) - 0x33AB2 158608 - 0x17CF7 (Discard) - True - Arrows & Triangles @@ -851,8 +851,8 @@ Swamp Maze (Swamp) - Swamp Laser Area - 0x17C0A & 0x17E07: Swamp Laser Area (Swamp) - Outside Swamp - 0x2D880: 158711 - 0x03615 (Laser Panel) - True - True Laser - 0x00BF6 (Laser) - 0x03615 -158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Colored Squares & Stars & Stars + Same Colored Symbol -158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Colored Squares & Stars & Stars + Same Colored Symbol +158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Colored Squares & Stars + Same Colored Symbol +158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Colored Squares & Stars + Same Colored Symbol Door - 0x2D880 (Laser Shortcut) - 0x17C02 ==Treehouse== @@ -878,7 +878,7 @@ Door - 0x0C309 (First Door) - 0x0288C 159210 - 0x33721 (Buoy EP) - 0x17C95 - True Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: -158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles +158345 - 0x02886 (Second Door Panel) - True - Stars + Same Colored Symbol & Triangles Door - 0x0C310 (Second Door) - 0x02886 Treehouse Yellow Bridge (Treehouse) - Treehouse After Yellow Bridge - 0x17DC4: @@ -907,57 +907,57 @@ Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x1 158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots & Triangles Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2: -158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Colored Squares -158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars & Stars + Same Colored Symbol & Colored Squares -158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars & Stars + Same Colored Symbol & Colored Squares -158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Stars & Stars + Same Colored Symbol & Colored Squares -158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars & Stars + Same Colored Symbol & Colored Squares -158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars & Stars + Same Colored Symbol & Colored Squares -158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars & Stars + Same Colored Symbol & Colored Squares -158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars & Stars + Same Colored Symbol & Colored Squares -158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars & Stars + Same Colored Symbol & Colored Squares -158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Stars & Stars + Same Colored Symbol & Colored Squares -158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars & Stars + Same Colored Symbol & Colored Squares -158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Colored Squares +158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars + Same Colored Symbol & Colored Squares +158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars + Same Colored Symbol & Colored Squares +158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars + Same Colored Symbol & Colored Squares +158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Stars + Same Colored Symbol & Colored Squares +158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars + Same Colored Symbol & Colored Squares +158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars + Same Colored Symbol & Colored Squares +158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars + Same Colored Symbol & Colored Squares +158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars + Same Colored Symbol & Colored Squares +158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars + Same Colored Symbol & Colored Squares +158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Stars + Same Colored Symbol & Colored Squares +158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars + Same Colored Symbol & Colored Squares +158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars + Same Colored Symbol & Colored Squares Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D: 158404 - 0x037FF (Drawbridge Panel) - True - Stars Door - 0x0C32D (Drawbridge) - 0x037FF Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6: -158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares -158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares -158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares -158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares -158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Stars + Same Colored Symbol & Colored Squares -158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares -158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Stars + Same Colored Symbol & Colored Squares +158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars + Same Colored Symbol & Black/White Squares & Colored Squares +158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars + Same Colored Symbol & Black/White Squares & Colored Squares +158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars + Same Colored Symbol & Black/White Squares & Colored Squares +158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars + Same Colored Symbol & Black/White Squares & Colored Squares +158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars + Same Colored Symbol & Colored Squares +158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars + Same Colored Symbol & Black/White Squares & Colored Squares +158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars + Same Colored Symbol & Colored Squares Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB: -158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles -158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Stars + Same Colored Symbol & Triangles -158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Stars + Same Colored Symbol & Triangles -158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Stars + Same Colored Symbol & Triangles -158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Black/White Squares & Stars + Same Colored Symbol -158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Stars + Same Colored Symbol & Shapers -158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Stars + Same Colored Symbol & Shapers -158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Stars + Same Colored Symbol & Shapers & Triangles -158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers -158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Stars + Same Colored Symbol & Shapers & Triangles +158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars + Same Colored Symbol & Triangles +158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars + Same Colored Symbol & Triangles +158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars + Same Colored Symbol & Triangles +158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars + Same Colored Symbol & Triangles +158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Stars + Same Colored Symbol & Shapers +158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Stars + Same Colored Symbol & Shapers +158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Stars + Same Colored Symbol & Shapers +158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Black/White Squares & Stars + Same Colored Symbol & Shapers +158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Black/White Squares & Stars + Same Colored Symbol +158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars + Same Colored Symbol & Shapers +158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars + Same Colored Symbol & Shapers +158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol & Shapers +158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars + Same Colored Symbol & Shapers & Triangles +158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol & Shapers +158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars + Same Colored Symbol & Shapers & Triangles Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61: -158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol -158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol -158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol +158369 - 0x17E3C (Green Bridge 1) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol +158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Shapers & Negative Shapers & Stars + Same Colored Symbol +158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Shapers & Negative Shapers & Stars + Same Colored Symbol +158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol +158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Negative Shapers & Stars + Same Colored Symbol +158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol +158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Shapers & Negative Shapers & Stars + Same Colored Symbol Treehouse Green Bridge Front House (Treehouse): 158610 - 0x17FA9 (Green Bridge Discard) - True - Arrows & Triangles @@ -1019,17 +1019,17 @@ Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots -158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol -158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol -158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Eraser & Stars & Stars + Same Colored Symbol -158413 - 0x09E7B (Right Row 5) - 0x09E69 - Dots & Full Dots & Triangles +158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots & Stars + Same Colored Symbol +158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars + Same Colored Symbol +158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Eraser & Stars + Same Colored Symbol +158413 - 0x09E7B (Right Row 5) - 0x09E69 - Full Dots & Triangles 158414 - 0x09E73 (Left Row 1) - True - Dots & Black/White Squares 158415 - 0x09E75 (Left Row 2) - 0x09E73 - Arrows & Black/White Squares 158416 - 0x09E78 (Left Row 3) - 0x09E75 - Arrows & Stars 158417 - 0x09E79 (Left Row 4) - 0x09E78 - Arrows & Shapers & Rotated Shapers -158418 - 0x09E6C (Left Row 5) - 0x09E79 - Arrows & Black/White Squares & Stars & Stars + Same Colored Symbol -158419 - 0x09E6F (Left Row 6) - 0x09E6C - Arrows & Dots & Full Dots -158420 - 0x09E6B (Left Row 7) - 0x09E6F - Arrows & Dots & Full Dots +158418 - 0x09E6C (Left Row 5) - 0x09E79 - Arrows & Black/White Squares & Stars + Same Colored Symbol +158419 - 0x09E6F (Left Row 6) - 0x09E6C - Arrows & Full Dots +158420 - 0x09E6B (Left Row 7) - 0x09E6F - Arrows & Full Dots 158424 - 0x09EAD (Trash Pillar 1) - True - Triangles & Arrows 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Triangles & Arrows @@ -1044,10 +1044,10 @@ Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay: -158426 - 0x09FD3 (Near Row 1) - True - Stars & Stars + Same Colored Symbol & Colored Squares -158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Stars + Same Colored Symbol & Triangles -158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Stars + Same Colored Symbol & Colored Squares & Eraser -158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Stars + Same Colored Symbol & Shapers & Eraser +158426 - 0x09FD3 (Near Row 1) - True - Stars + Same Colored Symbol & Colored Squares +158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars + Same Colored Symbol & Triangles +158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars + Same Colored Symbol & Colored Squares & Eraser +158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars + Same Colored Symbol & Shapers & Eraser 158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Symmetry & Triangles Door - 0x09FFB (Staircase Near) - 0x09FD8 @@ -1055,19 +1055,19 @@ Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86 Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): -158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser +158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8: 158432 - 0x09FCC (Far Row 1) - True - Black/White Squares 158433 - 0x09FCE (Far Row 2) - 0x09FCC - Triangles 158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars -158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Stars & Stars + Same Colored Symbol & Colored Squares +158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Stars + Same Colored Symbol & Colored Squares 158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Dots 158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Shapers Door - 0x09E07 (Staircase Far) - 0x09FD2 Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2): -158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser +158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay: 158613 - 0x17F93 (Elevator Discard) - True - Arrows & Triangles @@ -1095,10 +1095,10 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: 158522 - 0x0383A (Right Pillar 1) - True - Stars 158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots -158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots & Triangles +158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots & Triangles 158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry & Triangles 158526 - 0x0383D (Left Pillar 1) - True - Triangles -158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares & Stars & Stars + Same Colored Symbol +158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares & Stars + Same Colored Symbol 158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers 158529 - 0x339BB (Left Pillar 4) - 0x03859 - Triangles & Symmetry @@ -1127,16 +1127,16 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots -158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Full Dots & Triangles & Arrows -158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Full Dots & Triangles & Arrows -158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Full Dots & Triangles & Arrows -158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Full Dots & Triangles & Arrows +158454 - 0x00190 (Blue Tunnel Right First 1) - True - Full Dots & Triangles & Arrows +158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Full Dots & Triangles & Arrows +158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Full Dots & Triangles & Arrows +158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Full Dots & Triangles & Arrows 158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles & Arrows 158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Triangles & Colored Squares & Arrows 158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Triangles & Colored Squares & Arrows -158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol -158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol -158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol +158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol +158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol +158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol 158464 - 0x00994 (Blue Tunnel Right Second 1) - True - Rotated Shapers & Triangles 158465 - 0x334D5 (Blue Tunnel Right Second 2) - 0x00994 - Rotated Shapers & Triangles 158466 - 0x00995 (Blue Tunnel Right Second 3) - 0x334D5 - Rotated Shapers & Triangles @@ -1146,30 +1146,30 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01 158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Shapers & Symmetry & Eraser 158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Shapers & Negative Shapers & Triangles 158472 - 0x32962 (First Floor Left) - True - Rotated Shapers & Dots -158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Triangles +158473 - 0x32966 (First Floor Grounded) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Triangles 158474 - 0x01A31 (First Floor Middle) - True - Colored Squares -158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser & Shapers & Negative Shapers & Dots +158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser & Shapers & Negative Shapers & Dots 158478 - 0x288EA (First Wooden Beam) - True - Colored Squares & Black/White Squares & Eraser -158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser -158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser +158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Stars + Same Colored Symbol & Eraser +158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser 158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers & Eraser -158482 - 0x17FB9 (Left Upstairs Single) - True - Stars & Dots & Full Dots -158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots & Black/White Squares -158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots & Stars -158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots & Shapers -158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots & Triangles -158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots & Triangles & Eraser +158482 - 0x17FB9 (Left Upstairs Single) - True - Stars & Full Dots +158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots & Black/White Squares +158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots & Stars +158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots & Shapers +158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots & Triangles +158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots & Triangles & Eraser 158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots 158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Black/White Squares & Colored Squares -158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol -158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Shapers -158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol -158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Rotated Shapers -158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars & Stars + Same Colored Symbol & Shapers & Negative Shapers +158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Shapers +158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Black/White Squares & Colored Squares & Stars + Same Colored Symbol +158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Rotated Shapers +158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars + Same Colored Symbol & Shapers & Negative Shapers 158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Shapers & Negative Shapers & Eraser 158496 - 0x00027 (Right Upstairs Right Row 1) - True - Black/White Squares & Colored Squares & Eraser & Symmetry 158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Black/White Squares & Colored Squares & Eraser & Symmetry -158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Stars & Stars + Same Colored Symbol & Eraser & Symmetry +158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Stars + Same Colored Symbol & Eraser & Symmetry 158476 - 0x09DD5 (Lone Pillar) - True - Triangles & Dots Door - 0x019A5 (Pillar Door) - 0x09DD5 158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles @@ -1179,7 +1179,7 @@ Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True Caves Path to Challenge (Caves) - Challenge - 0x0A19A: -158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol & Triangles +158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol & Triangles Door - 0x0A19A (Challenge Entry) - 0x0A16E ==Challenge== From 6ad042b3498d293e8dff5c8dde1539a1e70ca073 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:56:52 +0200 Subject: [PATCH 078/199] Core: Add Region.add_event (#2965) * region.add_event function * Make it return the location bc why not * Actually item bc that seems more useful * Update BaseClasses.py Co-authored-by: Aaron Wagener * Update BaseClasses.py Co-authored-by: Aaron Wagener * add all the requested features from code review * oop * roughly sort args in order of importance (imo) * Fix typing --------- Co-authored-by: Aaron Wagener --- BaseClasses.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/BaseClasses.py b/BaseClasses.py index bf115e3f9c..e59e96e17d 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1198,6 +1198,48 @@ class Region: for location, address in locations.items(): self.locations.append(location_type(self.player, location, address, self)) + def add_event( + self, + location_name: str, + item_name: str | None = None, + rule: Callable[[CollectionState], bool] | None = None, + location_type: type[Location] | None = None, + item_type: type[Item] | None = None, + show_in_spoiler: bool = True, + ) -> Item: + """ + Adds an event location/item pair to the region. + + :param location_name: Name for the event location. + :param item_name: Name for the event item. If not provided, defaults to location_name. + :param rule: Callable to determine access for this event location within its region. + :param location_type: Location class to create the event location with. Defaults to BaseClasses.Location. + :param item_type: Item class to create the event item with. Defaults to BaseClasses.Item. + :param show_in_spoiler: Will be passed along to the created event Location's show_in_spoiler attribute. + :return: The created Event Item + """ + if location_type is None: + location_type = Location + + if item_name is None: + item_name = location_name + + if item_type is None: + item_type = Item + + event_location = location_type(self.player, location_name, None, self) + event_location.show_in_spoiler = show_in_spoiler + if rule is not None: + event_location.access_rule = rule + + event_item = item_type(item_name, ItemClassification.progression, None, self.player) + + event_location.place_locked_item(event_item) + + self.locations.append(event_location) + + return event_item + def connect(self, connecting_region: Region, name: Optional[str] = None, rule: Optional[Callable[[CollectionState], bool]] = None) -> Entrance: """ From 05c1751d293ea27fa4ee7c6f4797be772d111ae2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 24 Apr 2025 22:06:41 +0200 Subject: [PATCH 079/199] Core: Add "OptionCounter", use it for generic "StartInventory" and Witness "TrapWeights" (#3756) * CounterOption * bring back the negative exception for ItemDict * Backwards compatibility * ruff on witness * fix in calls * move the contains * comment * comment * Add option min and max values for CounterOption * Use min 0 for TrapWeights * This is safe now * ruff * This fits on one line again now * OptionCounter * Update Options.py * Couple more typing things * Update Options.py * Make StartInventory work again, also make LocationCounter theoretically work * Docs * more forceful wording * forced line break * Fix unit test (that wasn't breaking?) * Add trapweights to witness option presets to 'prove' that the unit test passes * Make it so you can order stuff * Update macros.html --- Options.py | 47 ++++++++++++++++--- Utils.py | 3 ++ WebHostLib/options.py | 4 +- .../templates/playerOptions/macros.html | 13 ++++- .../playerOptions/playerOptions.html | 12 +++-- .../templates/weightedOptions/macros.html | 13 ++++- .../weightedOptions/weightedOptions.html | 6 ++- docs/options api.md | 9 +++- test/webhost/test_option_presets.py | 4 +- worlds/witness/options.py | 28 ++++++----- worlds/witness/presets.py | 6 +++ 11 files changed, 111 insertions(+), 34 deletions(-) diff --git a/Options.py b/Options.py index 95b9b468c6..6a6bbe5e77 100644 --- a/Options.py +++ b/Options.py @@ -1,6 +1,7 @@ from __future__ import annotations import abc +import collections import functools import logging import math @@ -866,15 +867,49 @@ class OptionDict(Option[typing.Dict[str, typing.Any]], VerifyKeys, typing.Mappin def __len__(self) -> int: return self.value.__len__() + # __getitem__ fallback fails for Counters, so we define this explicitly + def __contains__(self, item) -> bool: + return item in self.value -class ItemDict(OptionDict): + +class OptionCounter(OptionDict): + min: int | None = None + max: int | None = None + + def __init__(self, value: dict[str, int]) -> None: + super(OptionCounter, self).__init__(collections.Counter(value)) + + def verify(self, world: type[World], player_name: str, plando_options: PlandoOptions) -> None: + super(OptionCounter, self).verify(world, player_name, plando_options) + + range_errors = [] + + if self.max is not None: + range_errors += [ + f"\"{key}: {value}\" is higher than maximum allowed value {self.max}." + for key, value in self.value.items() if value > self.max + ] + + if self.min is not None: + range_errors += [ + f"\"{key}: {value}\" is lower than minimum allowed value {self.min}." + for key, value in self.value.items() if value < self.min + ] + + if range_errors: + range_errors = [f"For option {getattr(self, 'display_name', self)}:"] + range_errors + raise OptionError("\n".join(range_errors)) + + +class ItemDict(OptionCounter): verify_item_name = True - def __init__(self, value: typing.Dict[str, int]): - if any(item_count is None for item_count in value.values()): - raise Exception("Items must have counts associated with them. Please provide positive integer values in the format \"item\": count .") - if any(item_count < 1 for item_count in value.values()): - raise Exception("Cannot have non-positive item counts.") + min = 0 + + def __init__(self, value: dict[str, int]) -> None: + # Backwards compatibility: Cull 0s to make "in" checks behave the same as when this wasn't a OptionCounter + value = {item_name: amount for item_name, amount in value.items() if amount != 0} + super(ItemDict, self).__init__(value) diff --git a/Utils.py b/Utils.py index e4e94a45f6..46a0d106ef 100644 --- a/Utils.py +++ b/Utils.py @@ -429,6 +429,9 @@ class RestrictedUnpickler(pickle.Unpickler): def find_class(self, module: str, name: str) -> type: if module == "builtins" and name in safe_builtins: return getattr(builtins, name) + # used by OptionCounter + if module == "collections" and name == "Counter": + return collections.Counter # used by MultiServer -> savegame/multidata if module == "NetUtils" and name in {"NetworkItem", "ClientStatus", "Hint", "SlotType", "NetworkSlot", "HintStatus"}: diff --git a/WebHostLib/options.py b/WebHostLib/options.py index 711762ee5f..38489cee3c 100644 --- a/WebHostLib/options.py +++ b/WebHostLib/options.py @@ -108,7 +108,7 @@ def option_presets(game: str) -> Response: f"Expected {option.special_range_names.keys()} or {option.range_start}-{option.range_end}." presets[preset_name][preset_option_name] = option.value - elif isinstance(option, (Options.Range, Options.OptionSet, Options.OptionList, Options.ItemDict)): + elif isinstance(option, (Options.Range, Options.OptionSet, Options.OptionList, Options.OptionCounter)): presets[preset_name][preset_option_name] = option.value elif isinstance(preset_option, str): # Ensure the option value is valid for Choice and Toggle options @@ -222,7 +222,7 @@ def generate_yaml(game: str): for key, val in options.copy().items(): key_parts = key.rsplit("||", 2) - # Detect and build ItemDict options from their name pattern + # Detect and build OptionCounter options from their name pattern if key_parts[-1] == "qty": if key_parts[0] not in options: options[key_parts[0]] = {} diff --git a/WebHostLib/templates/playerOptions/macros.html b/WebHostLib/templates/playerOptions/macros.html index 972f03175d..bbb3c75d12 100644 --- a/WebHostLib/templates/playerOptions/macros.html +++ b/WebHostLib/templates/playerOptions/macros.html @@ -111,10 +111,19 @@
{% endmacro %} -{% macro ItemDict(option_name, option) %} +{% macro OptionCounter(option_name, option) %} + {% set relevant_keys = option.valid_keys %} + {% if not relevant_keys %} + {% if option.verify_item_name %} + {% set relevant_keys = world.item_names %} + {% elif option.verify_location_name %} + {% set relevant_keys = world.location_names %} + {% endif %} + {% endif %} + {{ OptionTitle(option_name, option) }}
- {% for item_name in (option.valid_keys|sort if (option.valid_keys|length > 0) else world.item_names|sort) %} + {% for item_name in (relevant_keys if relevant_keys is ordered else relevant_keys|sort) %}
diff --git a/WebHostLib/templates/playerOptions/playerOptions.html b/WebHostLib/templates/playerOptions/playerOptions.html index 7e2f0ee11c..5e82342126 100644 --- a/WebHostLib/templates/playerOptions/playerOptions.html +++ b/WebHostLib/templates/playerOptions/playerOptions.html @@ -93,8 +93,10 @@ {% elif issubclass(option, Options.FreeText) %} {{ inputs.FreeText(option_name, option) }} - {% elif issubclass(option, Options.ItemDict) and option.verify_item_name %} - {{ inputs.ItemDict(option_name, option) }} + {% elif issubclass(option, Options.OptionCounter) and ( + option.valid_keys or option.verify_item_name or option.verify_location_name + ) %} + {{ inputs.OptionCounter(option_name, option) }} {% elif issubclass(option, Options.OptionList) and option.valid_keys %} {{ inputs.OptionList(option_name, option) }} @@ -133,8 +135,10 @@ {% elif issubclass(option, Options.FreeText) %} {{ inputs.FreeText(option_name, option) }} - {% elif issubclass(option, Options.ItemDict) and option.verify_item_name %} - {{ inputs.ItemDict(option_name, option) }} + {% elif issubclass(option, Options.OptionCounter) and ( + option.valid_keys or option.verify_item_name or option.verify_location_name + ) %} + {{ inputs.OptionCounter(option_name, option) }} {% elif issubclass(option, Options.OptionList) and option.valid_keys %} {{ inputs.OptionList(option_name, option) }} diff --git a/WebHostLib/templates/weightedOptions/macros.html b/WebHostLib/templates/weightedOptions/macros.html index d18d0f0b89..89ba0a0e6e 100644 --- a/WebHostLib/templates/weightedOptions/macros.html +++ b/WebHostLib/templates/weightedOptions/macros.html @@ -113,9 +113,18 @@ {{ TextChoice(option_name, option) }} {% endmacro %} -{% macro ItemDict(option_name, option, world) %} +{% macro OptionCounter(option_name, option, world) %} + {% set relevant_keys = option.valid_keys %} + {% if not relevant_keys %} + {% if option.verify_item_name %} + {% set relevant_keys = world.item_names %} + {% elif option.verify_location_name %} + {% set relevant_keys = world.location_names %} + {% endif %} + {% endif %} +
- {% for item_name in (option.valid_keys|sort if (option.valid_keys|length > 0) else world.item_names|sort) %} + {% for item_name in (relevant_keys if relevant_keys is ordered else relevant_keys|sort) %}
= 0) - for trap_name, item_definition in static_witness_logic.ALL_ITEMS.items() - if isinstance(item_definition, WeightedItemDefinition) and item_definition.category is ItemCategory.TRAP - }) - default = { - trap_name: item_definition.weight - for trap_name, item_definition in static_witness_logic.ALL_ITEMS.items() - if isinstance(item_definition, WeightedItemDefinition) and item_definition.category is ItemCategory.TRAP - } + valid_keys = _default_trap_weights.keys() + + min = 0 + + default = _default_trap_weights class PuzzleSkipAmount(Range): diff --git a/worlds/witness/presets.py b/worlds/witness/presets.py index 687d74f771..81dd28d68d 100644 --- a/worlds/witness/presets.py +++ b/worlds/witness/presets.py @@ -40,6 +40,8 @@ witness_option_presets: Dict[str, Dict[str, Any]] = { "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": PuzzleSkipAmount.default, + "trap_weights": TrapWeights.default, + "hint_amount": HintAmount.default, "area_hint_percentage": AreaHintPercentage.default, "laser_hints": LaserHints.default, @@ -79,6 +81,8 @@ witness_option_presets: Dict[str, Dict[str, Any]] = { "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": 15, + "trap_weights": TrapWeights.default, + "hint_amount": HintAmount.default, "area_hint_percentage": AreaHintPercentage.default, "laser_hints": LaserHints.default, @@ -118,6 +122,8 @@ witness_option_presets: Dict[str, Dict[str, Any]] = { "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": 15, + "trap_weights": TrapWeights.default, + "hint_amount": HintAmount.default, "area_hint_percentage": AreaHintPercentage.default, "laser_hints": LaserHints.default, From d4110d3b2a0186b8498b140bc24667641f0def8b Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 24 Apr 2025 23:10:58 +0200 Subject: [PATCH 080/199] LttP: make progression health optional (#4918) --- worlds/alttp/ItemPool.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 0bcc189f9c..57ad01b9e4 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -490,12 +490,16 @@ def generate_itempool(world): # Otherwise, logic has some branches where having 4 hearts is one possible requirement (of several alternatives) # rather than making all hearts/heart pieces progression items (which slows down generation considerably) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) - if world.options.item_pool in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0): - next(item for item in items if item.name == 'Boss Heart Container').classification = ItemClassification.progression - elif world.options.item_pool in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4): + try: + next(item for item in items if item.name == 'Boss Heart Container').classification \ + |= ItemClassification.progression + except StopIteration: adv_heart_pieces = (item for item in items if item.name == 'Piece of Heart') for i in range(4): - next(adv_heart_pieces).classification = ItemClassification.progression + try: + next(adv_heart_pieces).classification |= ItemClassification.progression + except StopIteration: + break # logically health tanking is an option, so rules should still resolve to something beatable world.required_medallions = (world.options.misery_mire_medallion.current_key.title(), world.options.turtle_rock_medallion.current_key.title()) From fc04192c992af1ec7288a774332107293cbbe06b Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 24 Apr 2025 17:14:42 -0400 Subject: [PATCH 081/199] Lingo: Use OptionCounter for trap_weights (#4920) --- worlds/lingo/options.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/lingo/options.py b/worlds/lingo/options.py index f9d04f68fc..faf5316e90 100644 --- a/worlds/lingo/options.py +++ b/worlds/lingo/options.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from schema import And, Schema -from Options import Toggle, Choice, DefaultOnToggle, Range, PerGameCommonOptions, StartInventoryPool, OptionDict, \ +from Options import Toggle, Choice, DefaultOnToggle, Range, PerGameCommonOptions, StartInventoryPool, OptionCounter, \ OptionGroup from .items import TRAP_ITEMS @@ -222,13 +222,14 @@ class TrapPercentage(Range): default = 20 -class TrapWeights(OptionDict): +class TrapWeights(OptionCounter): """Specify the distribution of traps that should be placed into the pool. If you don't want a specific type of trap, set the weight to zero. """ display_name = "Trap Weights" - schema = Schema({trap_name: And(int, lambda n: n >= 0) for trap_name in TRAP_ITEMS}) + valid_keys = TRAP_ITEMS + min = 0 default = {trap_name: 1 for trap_name in TRAP_ITEMS} From abb6d7fbdb71ac8d29a867067a4a1abc15a24d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:36:25 -0400 Subject: [PATCH 082/199] Stardew Valley: Replace all add_rule by set_rule #4909 --- worlds/stardew_valley/rules.py | 376 ++++++++++++++++----------------- 1 file changed, 188 insertions(+), 188 deletions(-) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 4b1ff2ad56..4257f856c8 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -3,7 +3,7 @@ import logging from typing import List, Dict, Set from BaseClasses import MultiWorld, CollectionState -from worlds.generic import Rules as MultiWorldRules +from worlds.generic.Rules import set_rule from . import locations from .bundles.bundle_room import BundleRoom from .content import StardewContent @@ -98,28 +98,28 @@ def set_rules(world): def set_isolated_locations_rules(logic: StardewLogic, multiworld, player): - MultiWorldRules.add_rule(multiworld.get_location("Old Master Cannoli", player), - logic.has(Fruit.sweet_gem_berry)) - MultiWorldRules.add_rule(multiworld.get_location("Galaxy Sword Shrine", player), - logic.has("Prismatic Shard")) - MultiWorldRules.add_rule(multiworld.get_location("Krobus Stardrop", player), - logic.money.can_spend(20000)) - MultiWorldRules.add_rule(multiworld.get_location("Demetrius's Breakthrough", player), - logic.money.can_have_earned_total(25000)) - MultiWorldRules.add_rule(multiworld.get_location("Pot Of Gold", player), - logic.season.has(Season.spring)) + set_rule(multiworld.get_location("Old Master Cannoli", player), + logic.has(Fruit.sweet_gem_berry)) + set_rule(multiworld.get_location("Galaxy Sword Shrine", player), + logic.has("Prismatic Shard")) + set_rule(multiworld.get_location("Krobus Stardrop", player), + logic.money.can_spend(20000)) + set_rule(multiworld.get_location("Demetrius's Breakthrough", player), + logic.money.can_have_earned_total(25000)) + set_rule(multiworld.get_location("Pot Of Gold", player), + logic.season.has(Season.spring)) def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewContent): if not content.features.tool_progression.is_progressive: return - MultiWorldRules.add_rule(multiworld.get_location("Purchase Fiberglass Rod", player), - (logic.skill.has_level(Skill.fishing, 2) & logic.money.can_spend(1800))) - MultiWorldRules.add_rule(multiworld.get_location("Purchase Iridium Rod", player), - (logic.skill.has_level(Skill.fishing, 6) & logic.money.can_spend(7500))) + set_rule(multiworld.get_location("Purchase Fiberglass Rod", player), + (logic.skill.has_level(Skill.fishing, 2) & logic.money.can_spend(1800))) + set_rule(multiworld.get_location("Purchase Iridium Rod", player), + (logic.skill.has_level(Skill.fishing, 6) & logic.money.can_spend(7500))) - MultiWorldRules.add_rule(multiworld.get_location("Copper Pan Cutscene", player), logic.received("Glittering Boulder Removed")) + set_rule(multiworld.get_location("Copper Pan Cutscene", player), logic.received("Glittering Boulder Removed")) materials = [None, "Copper", "Iron", "Gold", "Iridium"] tool = [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can, Tool.pan] @@ -127,7 +127,7 @@ def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewCont if previous is None: continue tool_upgrade_location = multiworld.get_location(f"{material} {tool} Upgrade", player) - MultiWorldRules.set_rule(tool_upgrade_location, logic.tool.has_tool(tool, previous)) + set_rule(tool_upgrade_location, logic.tool.has_tool(tool, previous)) def set_building_rules(logic: StardewLogic, multiworld, player, content: StardewContent): @@ -141,8 +141,8 @@ def set_building_rules(logic: StardewLogic, multiworld, player, content: Stardew location_name = building_progression.to_location_name(building.name) - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), - logic.building.can_build(building.name)) + set_rule(multiworld.get_location(location_name, player), + logic.building.can_build(building.name)) def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -160,11 +160,11 @@ def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiw previous_bundle_name = f"Raccoon Request {num - 1}" bundle_rules = bundle_rules & logic.region.can_reach_location(previous_bundle_name) room_rules.append(bundle_rules) - MultiWorldRules.set_rule(location, bundle_rules) + set_rule(location, bundle_rules) if bundle_room.name == CCRoom.abandoned_joja_mart or bundle_room.name == CCRoom.raccoon_requests: continue room_location = f"Complete {bundle_room.name}" - MultiWorldRules.add_rule(multiworld.get_location(room_location, player), And(*room_rules)) + set_rule(multiworld.get_location(room_location, player), And(*room_rules)) def set_skills_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, content: StardewContent): @@ -176,12 +176,12 @@ def set_skills_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, c for level, level_name in skill_progression.get_randomized_level_names_by_level(skill): rule = logic.skill.can_earn_level(skill.name, level) location = multiworld.get_location(level_name, player) - MultiWorldRules.set_rule(location, rule) + set_rule(location, rule) if skill_progression.is_mastery_randomized(skill): rule = logic.skill.can_earn_mastery(skill.name) location = multiworld.get_location(skill.mastery_name, player) - MultiWorldRules.set_rule(location, rule) + set_rule(location, rule) def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -339,20 +339,20 @@ def set_ginger_island_rules(logic: StardewLogic, multiworld, player, world_optio set_boat_repair_rules(logic, multiworld, player) set_island_parrot_rules(logic, multiworld, player) - MultiWorldRules.add_rule(multiworld.get_location("Open Professor Snail Cave", player), - logic.has(Bomb.cherry_bomb)) - MultiWorldRules.add_rule(multiworld.get_location("Complete Island Field Office", player), - logic.walnut.can_complete_field_office()) + set_rule(multiworld.get_location("Open Professor Snail Cave", player), + logic.has(Bomb.cherry_bomb)) + set_rule(multiworld.get_location("Complete Island Field Office", player), + logic.walnut.can_complete_field_office()) set_walnut_rules(logic, multiworld, player, world_options) def set_boat_repair_rules(logic: StardewLogic, multiworld, player): - MultiWorldRules.add_rule(multiworld.get_location("Repair Boat Hull", player), - logic.has(Material.hardwood)) - MultiWorldRules.add_rule(multiworld.get_location("Repair Boat Anchor", player), - logic.has(MetalBar.iridium)) - MultiWorldRules.add_rule(multiworld.get_location("Repair Ticket Machine", player), - logic.has(ArtisanGood.battery_pack)) + set_rule(multiworld.get_location("Repair Boat Hull", player), + logic.has(Material.hardwood)) + set_rule(multiworld.get_location("Repair Boat Anchor", player), + logic.has(MetalBar.iridium)) + set_rule(multiworld.get_location("Repair Ticket Machine", player), + logic.has(ArtisanGood.battery_pack)) def set_island_entrances_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -403,29 +403,29 @@ def set_island_parrot_rules(logic: StardewLogic, multiworld, player): has_5_walnut = logic.walnut.has_walnut(15) has_10_walnut = logic.walnut.has_walnut(40) has_20_walnut = logic.walnut.has_walnut(60) - MultiWorldRules.add_rule(multiworld.get_location("Leo's Parrot", player), - has_walnut) - MultiWorldRules.add_rule(multiworld.get_location("Island West Turtle", player), - has_10_walnut & logic.received("Island North Turtle")) - MultiWorldRules.add_rule(multiworld.get_location("Island Farmhouse", player), - has_20_walnut) - MultiWorldRules.add_rule(multiworld.get_location("Island Mailbox", player), - has_5_walnut & logic.received("Island Farmhouse")) - MultiWorldRules.add_rule(multiworld.get_location(Transportation.farm_obelisk, player), - has_20_walnut & logic.received("Island Mailbox")) - MultiWorldRules.add_rule(multiworld.get_location("Dig Site Bridge", player), - has_10_walnut & logic.received("Island West Turtle")) - MultiWorldRules.add_rule(multiworld.get_location("Island Trader", player), - has_10_walnut & logic.received("Island Farmhouse")) - MultiWorldRules.add_rule(multiworld.get_location("Volcano Bridge", player), - has_5_walnut & logic.received("Island West Turtle") & - logic.region.can_reach(Region.volcano_floor_10)) - MultiWorldRules.add_rule(multiworld.get_location("Volcano Exit Shortcut", player), - has_5_walnut & logic.received("Island West Turtle")) - MultiWorldRules.add_rule(multiworld.get_location("Island Resort", player), - has_20_walnut & logic.received("Island Farmhouse")) - MultiWorldRules.add_rule(multiworld.get_location(Transportation.parrot_express, player), - has_10_walnut) + set_rule(multiworld.get_location("Leo's Parrot", player), + has_walnut) + set_rule(multiworld.get_location("Island West Turtle", player), + has_10_walnut & logic.received("Island North Turtle")) + set_rule(multiworld.get_location("Island Farmhouse", player), + has_20_walnut) + set_rule(multiworld.get_location("Island Mailbox", player), + has_5_walnut & logic.received("Island Farmhouse")) + set_rule(multiworld.get_location(Transportation.farm_obelisk, player), + has_20_walnut & logic.received("Island Mailbox")) + set_rule(multiworld.get_location("Dig Site Bridge", player), + has_10_walnut & logic.received("Island West Turtle")) + set_rule(multiworld.get_location("Island Trader", player), + has_10_walnut & logic.received("Island Farmhouse")) + set_rule(multiworld.get_location("Volcano Bridge", player), + has_5_walnut & logic.received("Island West Turtle") & + logic.region.can_reach(Region.volcano_floor_10)) + set_rule(multiworld.get_location("Volcano Exit Shortcut", player), + has_5_walnut & logic.received("Island West Turtle")) + set_rule(multiworld.get_location("Island Resort", player), + has_20_walnut & logic.received("Island Farmhouse")) + set_rule(multiworld.get_location(Transportation.parrot_express, player), + has_10_walnut) def set_walnut_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -442,27 +442,27 @@ def set_walnut_puzzle_rules(logic: StardewLogic, multiworld, player, world_optio if WalnutsanityOptionName.puzzles not in world_options.walnutsanity: return - MultiWorldRules.add_rule(multiworld.get_location("Open Golden Coconut", player), logic.has(Geode.golden_coconut)) - MultiWorldRules.add_rule(multiworld.get_location("Banana Altar", player), logic.has(Fruit.banana)) - MultiWorldRules.add_rule(multiworld.get_location("Leo's Tree", player), logic.tool.has_tool(Tool.axe)) - MultiWorldRules.add_rule(multiworld.get_location("Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) & - logic.has(Mineral.emerald) & logic.has(Mineral.ruby) & logic.has(Mineral.topaz) & - logic.region.can_reach_all((Region.island_north, Region.island_west, Region.island_east, Region.island_south))) - MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west)) - MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) & - logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Melon")) - MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) & - logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Wheat")) - MultiWorldRules.add_rule(multiworld.get_location("Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium)) - MultiWorldRules.add_rule(multiworld.get_location("Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection()) - MultiWorldRules.add_rule(multiworld.get_location("Complete Snake Collection", player), logic.walnut.can_complete_snake_collection()) - MultiWorldRules.add_rule(multiworld.get_location("Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection()) - MultiWorldRules.add_rule(multiworld.get_location("Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection()) - MultiWorldRules.add_rule(multiworld.get_location("Purple Flowers Island Survey", player), logic.walnut.can_start_field_office) - MultiWorldRules.add_rule(multiworld.get_location("Purple Starfish Island Survey", player), logic.walnut.can_start_field_office) - MultiWorldRules.add_rule(multiworld.get_location("Protruding Tree Walnut", player), logic.combat.has_slingshot) - MultiWorldRules.add_rule(multiworld.get_location("Starfish Tide Pool", player), logic.tool.has_fishing_rod(1)) - MultiWorldRules.add_rule(multiworld.get_location("Mermaid Song", player), logic.has(Furniture.flute_block)) + set_rule(multiworld.get_location("Open Golden Coconut", player), logic.has(Geode.golden_coconut)) + set_rule(multiworld.get_location("Banana Altar", player), logic.has(Fruit.banana)) + set_rule(multiworld.get_location("Leo's Tree", player), logic.tool.has_tool(Tool.axe)) + set_rule(multiworld.get_location("Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) & + logic.has(Mineral.emerald) & logic.has(Mineral.ruby) & logic.has(Mineral.topaz) & + logic.region.can_reach_all((Region.island_north, Region.island_west, Region.island_east, Region.island_south))) + set_rule(multiworld.get_location("Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west)) + set_rule(multiworld.get_location("Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) & + logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Melon")) + set_rule(multiworld.get_location("Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) & + logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Wheat")) + set_rule(multiworld.get_location("Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium)) + set_rule(multiworld.get_location("Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection()) + set_rule(multiworld.get_location("Complete Snake Collection", player), logic.walnut.can_complete_snake_collection()) + set_rule(multiworld.get_location("Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection()) + set_rule(multiworld.get_location("Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection()) + set_rule(multiworld.get_location("Purple Flowers Island Survey", player), logic.walnut.can_start_field_office) + set_rule(multiworld.get_location("Purple Starfish Island Survey", player), logic.walnut.can_start_field_office) + set_rule(multiworld.get_location("Protruding Tree Walnut", player), logic.combat.has_slingshot) + set_rule(multiworld.get_location("Starfish Tide Pool", player), logic.tool.has_fishing_rod(1)) + set_rule(multiworld.get_location("Mermaid Song", player), logic.has(Furniture.flute_block)) def set_walnut_bushes_rules(logic, multiworld, player, world_options): @@ -482,20 +482,20 @@ def set_walnut_dig_spot_rules(logic, multiworld, player, world_options): rule = rule & logic.has(Forageable.journal_scrap) if "Starfish Diamond" in dig_spot_walnut.name: rule = rule & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron) - MultiWorldRules.set_rule(multiworld.get_location(dig_spot_walnut.name, player), rule) + set_rule(multiworld.get_location(dig_spot_walnut.name, player), rule) def set_walnut_repeatable_rules(logic, multiworld, player, world_options): if WalnutsanityOptionName.repeatables not in world_options.walnutsanity: return for i in range(1, 6): - MultiWorldRules.set_rule(multiworld.get_location(f"Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1)) - MultiWorldRules.set_rule(multiworld.get_location(f"Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp) - MultiWorldRules.set_rule(multiworld.get_location(f"Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) - MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) - MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon) - MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon) - MultiWorldRules.set_rule(multiworld.get_location(f"Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime)) + set_rule(multiworld.get_location(f"Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1)) + set_rule(multiworld.get_location(f"Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp) + set_rule(multiworld.get_location(f"Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) + set_rule(multiworld.get_location(f"Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) + set_rule(multiworld.get_location(f"Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon) + set_rule(multiworld.get_location(f"Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon) + set_rule(multiworld.get_location(f"Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime)) def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content: StardewContent): @@ -505,7 +505,7 @@ def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content: for item in world_content.find_tagged_items(ItemTag.CROPSANITY): location = world_content.features.cropsanity.to_location_name(item.name) harvest_sources = (source for source in item.sources if isinstance(source, (HarvestFruitTreeSource, HarvestCropSource))) - MultiWorldRules.set_rule(multiworld.get_location(location, player), logic.source.has_access_to_any(harvest_sources)) + set_rule(multiworld.get_location(location, player), logic.source.has_access_to_any(harvest_sources)) def set_story_quests_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -513,8 +513,8 @@ def set_story_quests_rules(all_location_names: Set[str], logic: StardewLogic, mu return for quest in locations.locations_by_tag[LocationTags.STORY_QUEST]: if quest.name in all_location_names and (quest.mod_name is None or quest.mod_name in world_options.mods): - MultiWorldRules.set_rule(multiworld.get_location(quest.name, player), - logic.registry.quest_rules[quest.name]) + set_rule(multiworld.get_location(quest.name, player), + logic.registry.quest_rules[quest.name]) def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, @@ -524,7 +524,7 @@ def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, m for board_order in locations.locations_by_tag[LocationTags.SPECIAL_ORDER_BOARD]: if board_order.name in all_location_names: order_rule = board_rule & logic.registry.special_order_rules[board_order.name] - MultiWorldRules.set_rule(multiworld.get_location(board_order.name, player), order_rule) + set_rule(multiworld.get_location(board_order.name, player), order_rule) if world_options.exclude_ginger_island == ExcludeGingerIsland.option_true: return @@ -533,7 +533,7 @@ def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, m for qi_order in locations.locations_by_tag[LocationTags.SPECIAL_ORDER_QI]: if qi_order.name in all_location_names: order_rule = qi_rule & logic.registry.special_order_rules[qi_order.name] - MultiWorldRules.set_rule(multiworld.get_location(qi_order.name, player), order_rule) + set_rule(multiworld.get_location(qi_order.name, player), order_rule) help_wanted_prefix = "Help Wanted:" @@ -565,22 +565,22 @@ def set_help_wanted_quests_rules(logic: StardewLogic, multiworld, player, world_ def set_help_wanted_delivery_rule(multiworld, player, month_rule, quest_number): location_name = f"{help_wanted_prefix} {item_delivery} {quest_number}" - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule) + set_rule(multiworld.get_location(location_name, player), month_rule) def set_help_wanted_gathering_rule(multiworld, player, month_rule, quest_number): location_name = f"{help_wanted_prefix} {gathering} {quest_number}" - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule) + set_rule(multiworld.get_location(location_name, player), month_rule) def set_help_wanted_fishing_rule(multiworld, player, month_rule, quest_number): location_name = f"{help_wanted_prefix} {fishing} {quest_number}" - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule) + set_rule(multiworld.get_location(location_name, player), month_rule) def set_help_wanted_slay_monsters_rule(multiworld, player, month_rule, quest_number): location_name = f"{help_wanted_prefix} {slay_monsters} {quest_number}" - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule) + set_rule(multiworld.get_location(location_name, player), month_rule) def set_fishsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld: MultiWorld, player: int): @@ -588,8 +588,8 @@ def set_fishsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult for fish_location in locations.locations_by_tag[LocationTags.FISHSANITY]: if fish_location.name in all_location_names: fish_name = fish_location.name[len(fish_prefix):] - MultiWorldRules.set_rule(multiworld.get_location(fish_location.name, player), - logic.has(fish_name)) + set_rule(multiworld.get_location(fish_location.name, player), + logic.has(fish_name)) def set_museumsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld: MultiWorld, player: int, @@ -612,8 +612,8 @@ def set_museum_individual_donations_rules(all_location_names, logic: StardewLogi donation_name = museum_location.name[len(museum_prefix):] required_detectors = counter * 3 // number_donations rule = logic.museum.can_find_museum_item(all_museum_items_by_name[donation_name]) & logic.received(Wallet.metal_detector, required_detectors) - MultiWorldRules.set_rule(multiworld.get_location(museum_location.name, player), - rule) + set_rule(multiworld.get_location(museum_location.name, player), + rule) counter += 1 @@ -643,7 +643,7 @@ def set_museum_milestone_rule(logic: StardewLogic, multiworld: MultiWorld, museu rule = logic.museum.can_find_museum_item(Artifact.ancient_seed) & logic.received(metal_detector, 2) if rule is None: return - MultiWorldRules.set_rule(multiworld.get_location(museum_milestone.name, player), rule) + set_rule(multiworld.get_location(museum_milestone.name, player), rule) def get_museum_item_count_rule(logic: StardewLogic, suffix, milestone_name, accepted_items, donation_func): @@ -656,14 +656,14 @@ def get_museum_item_count_rule(logic: StardewLogic, suffix, milestone_name, acce def set_backpack_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): if world_options.backpack_progression != BackpackProgression.option_vanilla: - MultiWorldRules.set_rule(multiworld.get_location("Large Pack", player), - logic.money.can_spend(2000)) - MultiWorldRules.set_rule(multiworld.get_location("Deluxe Pack", player), - (logic.money.can_spend(10000) & logic.received("Progressive Backpack"))) + set_rule(multiworld.get_location("Large Pack", player), + logic.money.can_spend(2000)) + set_rule(multiworld.get_location("Deluxe Pack", player), + (logic.money.can_spend(10000) & logic.received("Progressive Backpack"))) if ModNames.big_backpack in world_options.mods: - MultiWorldRules.set_rule(multiworld.get_location("Premium Pack", player), - (logic.money.can_spend(150000) & - logic.received("Progressive Backpack", 2))) + set_rule(multiworld.get_location("Premium Pack", player), + (logic.money.can_spend(150000) & + logic.received("Progressive Backpack", 2))) def set_festival_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player): @@ -672,8 +672,8 @@ def set_festival_rules(all_location_names: Set[str], logic: StardewLogic, multiw festival_locations.extend(locations.locations_by_tag[LocationTags.FESTIVAL_HARD]) for festival in festival_locations: if festival.name in all_location_names: - MultiWorldRules.set_rule(multiworld.get_location(festival.name, player), - logic.registry.festival_rules[festival.name]) + set_rule(multiworld.get_location(festival.name, player), + logic.registry.festival_rules[festival.name]) monster_eradication_prefix = "Monster Eradication: " @@ -705,7 +705,7 @@ def set_monstersanity_monster_rules(all_location_names: Set[str], logic: Stardew rule = logic.monster.can_kill_many(logic.monster.all_monsters_by_name[monster_name]) else: rule = logic.monster.can_kill(logic.monster.all_monsters_by_name[monster_name]) - MultiWorldRules.set_rule(location, rule) + set_rule(location, rule) def set_monstersanity_progressive_category_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player): @@ -732,7 +732,7 @@ def set_monstersanity_progressive_category_rule(all_location_names: Set[str], lo rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], goal_index + 1) else: rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], goal_index * 2) - MultiWorldRules.set_rule(location, rule) + set_rule(location, rule) def get_monster_eradication_number(location_name, monster_category) -> int: @@ -753,7 +753,7 @@ def set_monstersanity_category_rules(all_location_names: Set[str], logic: Starde rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category]) else: rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], MAX_MONTHS) - MultiWorldRules.set_rule(location, rule) + set_rule(location, rule) def set_shipsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -766,7 +766,7 @@ def set_shipsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult if location.name not in all_location_names: continue item_to_ship = location.name[len(shipsanity_prefix):] - MultiWorldRules.set_rule(multiworld.get_location(location.name, player), logic.shipping.can_ship(item_to_ship)) + set_rule(multiworld.get_location(location.name, player), logic.shipping.can_ship(item_to_ship)) def set_cooksanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -781,7 +781,7 @@ def set_cooksanity_rules(all_location_names: Set[str], logic: StardewLogic, mult recipe_name = location.name[len(cooksanity_prefix):] recipe = all_cooking_recipes_by_name[recipe_name] cook_rule = logic.cooking.can_cook(recipe) - MultiWorldRules.set_rule(multiworld.get_location(location.name, player), cook_rule) + set_rule(multiworld.get_location(location.name, player), cook_rule) def set_chefsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -796,7 +796,7 @@ def set_chefsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult recipe_name = location.name[:-len(chefsanity_suffix)] recipe = all_cooking_recipes_by_name[recipe_name] learn_rule = logic.cooking.can_learn_recipe(recipe.source) - MultiWorldRules.set_rule(multiworld.get_location(location.name, player), learn_rule) + set_rule(multiworld.get_location(location.name, player), learn_rule) def set_craftsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): @@ -817,7 +817,7 @@ def set_craftsanity_rules(all_location_names: Set[str], logic: StardewLogic, mul recipe_name = location.name[len(craft_prefix):] recipe = all_crafting_recipes_by_name[recipe_name] craft_rule = logic.crafting.can_craft(recipe) - MultiWorldRules.set_rule(multiworld.get_location(location.name, player), craft_rule) + set_rule(multiworld.get_location(location.name, player), craft_rule) def set_booksanity_rules(logic: StardewLogic, multiworld, player, content: StardewContent): @@ -827,12 +827,12 @@ def set_booksanity_rules(logic: StardewLogic, multiworld, player, content: Stard for book in content.find_tagged_items(ItemTag.BOOK): if booksanity.is_included(book): - MultiWorldRules.set_rule(multiworld.get_location(booksanity.to_location_name(book.name), player), logic.has(book.name)) + set_rule(multiworld.get_location(booksanity.to_location_name(book.name), player), logic.has(book.name)) for i, book in enumerate(booksanity.get_randomized_lost_books()): if i <= 0: continue - MultiWorldRules.set_rule(multiworld.get_location(booksanity.to_location_name(book), player), logic.received(booksanity.progressive_lost_book, i)) + set_rule(multiworld.get_location(booksanity.to_location_name(book), player), logic.received(booksanity.progressive_lost_book, i)) def set_traveling_merchant_day_rules(logic: StardewLogic, multiworld: MultiWorld, player: int): @@ -856,102 +856,102 @@ def set_arcade_machine_rules(logic: StardewLogic, multiworld: MultiWorld, player set_entrance_rule(multiworld, player, Entrance.play_journey_of_the_prairie_king, logic.has("JotPK Small Buff")) set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_2, logic.has("JotPK Medium Buff")) set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_3, logic.has("JotPK Big Buff")) - MultiWorldRules.add_rule(multiworld.get_location("Journey of the Prairie King Victory", player), - logic.has("JotPK Max Buff")) + set_rule(multiworld.get_location("Journey of the Prairie King Victory", player), + logic.has("JotPK Max Buff")) def set_friendsanity_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, content: StardewContent): if not content.features.friendsanity.is_enabled: return - MultiWorldRules.add_rule(multiworld.get_location("Spouse Stardrop", player), - logic.relationship.has_hearts_with_any_bachelor(13)) - MultiWorldRules.add_rule(multiworld.get_location("Have a Baby", player), - logic.relationship.can_reproduce(1)) - MultiWorldRules.add_rule(multiworld.get_location("Have Another Baby", player), - logic.relationship.can_reproduce(2)) + set_rule(multiworld.get_location("Spouse Stardrop", player), + logic.relationship.has_hearts_with_any_bachelor(13)) + set_rule(multiworld.get_location("Have a Baby", player), + logic.relationship.can_reproduce(1)) + set_rule(multiworld.get_location("Have Another Baby", player), + logic.relationship.can_reproduce(2)) for villager in content.villagers.values(): for heart in content.features.friendsanity.get_randomized_hearts(villager): rule = logic.relationship.can_earn_relationship(villager.name, heart) location_name = friendsanity.to_location_name(villager.name, heart) - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), rule) + set_rule(multiworld.get_location(location_name, player), rule) for heart in content.features.friendsanity.get_pet_randomized_hearts(): rule = logic.pet.can_befriend_pet(heart) location_name = friendsanity.to_location_name(NPC.pet, heart) - MultiWorldRules.set_rule(multiworld.get_location(location_name, player), rule) + set_rule(multiworld.get_location(location_name, player), rule) def set_deepwoods_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): if ModNames.deepwoods in world_options.mods: - MultiWorldRules.add_rule(multiworld.get_location("Breaking Up Deep Woods Gingerbread House", player), - logic.tool.has_tool(Tool.axe, "Gold")) - MultiWorldRules.add_rule(multiworld.get_location("Chop Down a Deep Woods Iridium Tree", player), - logic.tool.has_tool(Tool.axe, "Iridium")) + set_rule(multiworld.get_location("Breaking Up Deep Woods Gingerbread House", player), + logic.tool.has_tool(Tool.axe, "Gold")) + set_rule(multiworld.get_location("Chop Down a Deep Woods Iridium Tree", player), + logic.tool.has_tool(Tool.axe, "Iridium")) set_entrance_rule(multiworld, player, DeepWoodsEntrance.use_woods_obelisk, logic.received("Woods Obelisk")) for depth in range(10, 100 + 10, 10): set_entrance_rule(multiworld, player, move_to_woods_depth(depth), logic.mod.deepwoods.can_chop_to_depth(depth)) - MultiWorldRules.add_rule(multiworld.get_location("The Sword in the Stone", player), - logic.mod.deepwoods.can_pull_sword() & logic.mod.deepwoods.can_chop_to_depth(100)) + set_rule(multiworld.get_location("The Sword in the Stone", player), + logic.mod.deepwoods.can_pull_sword() & logic.mod.deepwoods.can_chop_to_depth(100)) def set_magic_spell_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): if ModNames.magic not in world_options.mods: return - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Clear Debris", player), - (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic"))) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Till", player), - logic.tool.has_tool("Hoe", "Basic")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Water", player), - logic.tool.has_tool("Watering Can", "Basic")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze All Toil School Locations", player), - (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic") - & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")))) + set_rule(multiworld.get_location("Analyze: Clear Debris", player), + (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic"))) + set_rule(multiworld.get_location("Analyze: Till", player), + logic.tool.has_tool("Hoe", "Basic")) + set_rule(multiworld.get_location("Analyze: Water", player), + logic.tool.has_tool("Watering Can", "Basic")) + set_rule(multiworld.get_location("Analyze All Toil School Locations", player), + (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic") + & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")))) # Do I *want* to add boots into logic when you get them even in vanilla without effort? idk - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Evac", player), - logic.ability.can_mine_perfectly()) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Haste", player), - logic.has("Coffee")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Heal", player), - logic.has("Life Elixir")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze All Life School Locations", player), - (logic.has("Coffee") & logic.has("Life Elixir") - & logic.ability.can_mine_perfectly())) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Descend", player), - logic.region.can_reach(Region.mines)) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Fireball", player), - logic.has("Fire Quartz")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Frostbolt", player), - logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) - MultiWorldRules.add_rule(multiworld.get_location("Analyze All Elemental School Locations", player), - logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) - # MultiWorldRules.add_rule(multiworld.get_location("Analyze: Lantern", player),) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Tendrils", player), - logic.region.can_reach(Region.farm)) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Shockwave", player), - logic.has("Earth Crystal")) - MultiWorldRules.add_rule(multiworld.get_location("Analyze All Nature School Locations", player), - (logic.has("Earth Crystal") & logic.region.can_reach("Farm"))), - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Meteor", player), - (logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))), - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Lucksteal", player), - logic.region.can_reach(Region.witch_hut)) - MultiWorldRules.add_rule(multiworld.get_location("Analyze: Bloodmana", player), - logic.region.can_reach(Region.mines_floor_100)) - MultiWorldRules.add_rule(multiworld.get_location("Analyze All Eldritch School Locations", player), - (logic.region.can_reach(Region.witch_hut) & - logic.region.can_reach(Region.mines_floor_100) & - logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))) - MultiWorldRules.add_rule(multiworld.get_location("Analyze Every Magic School Location", player), - (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic") - & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")) & - logic.has("Coffee") & logic.has("Life Elixir") - & logic.ability.can_mine_perfectly() & logic.has("Earth Crystal") & - logic.has("Fire Quartz") & logic.skill.can_fish(difficulty=85) & - logic.region.can_reach(Region.witch_hut) & - logic.region.can_reach(Region.mines_floor_100) & - logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))) + set_rule(multiworld.get_location("Analyze: Evac", player), + logic.ability.can_mine_perfectly()) + set_rule(multiworld.get_location("Analyze: Haste", player), + logic.has("Coffee")) + set_rule(multiworld.get_location("Analyze: Heal", player), + logic.has("Life Elixir")) + set_rule(multiworld.get_location("Analyze All Life School Locations", player), + (logic.has("Coffee") & logic.has("Life Elixir") + & logic.ability.can_mine_perfectly())) + set_rule(multiworld.get_location("Analyze: Descend", player), + logic.region.can_reach(Region.mines)) + set_rule(multiworld.get_location("Analyze: Fireball", player), + logic.has("Fire Quartz")) + set_rule(multiworld.get_location("Analyze: Frostbolt", player), + logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) + set_rule(multiworld.get_location("Analyze All Elemental School Locations", player), + logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) + # set_rule(multiworld.get_location("Analyze: Lantern", player),) + set_rule(multiworld.get_location("Analyze: Tendrils", player), + logic.region.can_reach(Region.farm)) + set_rule(multiworld.get_location("Analyze: Shockwave", player), + logic.has("Earth Crystal")) + set_rule(multiworld.get_location("Analyze All Nature School Locations", player), + (logic.has("Earth Crystal") & logic.region.can_reach("Farm"))), + set_rule(multiworld.get_location("Analyze: Meteor", player), + (logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))), + set_rule(multiworld.get_location("Analyze: Lucksteal", player), + logic.region.can_reach(Region.witch_hut)) + set_rule(multiworld.get_location("Analyze: Bloodmana", player), + logic.region.can_reach(Region.mines_floor_100)) + set_rule(multiworld.get_location("Analyze All Eldritch School Locations", player), + (logic.region.can_reach(Region.witch_hut) & + logic.region.can_reach(Region.mines_floor_100) & + logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))) + set_rule(multiworld.get_location("Analyze Every Magic School Location", player), + (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic") + & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")) & + logic.has("Coffee") & logic.has("Life Elixir") + & logic.ability.can_mine_perfectly() & logic.has("Earth Crystal") & + logic.has("Fire Quartz") & logic.skill.can_fish(difficulty=85) & + logic.region.can_reach(Region.witch_hut) & + logic.region.can_reach(Region.mines_floor_100) & + logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))) def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): @@ -980,8 +980,8 @@ def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, worl set_entrance_rule(multiworld, player, SVEEntrance.to_aurora_basement, logic.mod.quest.has_completed_aurora_vineyard_bundle()) logic.mod.sve.initialize_rules() for location in logic.registry.sve_location_rules: - MultiWorldRules.set_rule(multiworld.get_location(location, player), - logic.registry.sve_location_rules[location]) + set_rule(multiworld.get_location(location, player), + logic.registry.sve_location_rules[location]) set_sve_ginger_island_rules(logic, multiworld, player, world_options) set_boarding_house_rules(logic, multiworld, player, world_options) @@ -1010,7 +1010,7 @@ def set_entrance_rule(multiworld, player, entrance: str, rule: StardewRule): logger.debug(f"Registering indirect condition for {region} -> {entrance}") multiworld.register_indirect_condition(multiworld.get_region(region, player), multiworld.get_entrance(entrance, player)) - MultiWorldRules.set_rule(multiworld.get_entrance(entrance, player), rule) + set_rule(multiworld.get_entrance(entrance, player), rule) except KeyError as ex: logger.error(f"""Failed to evaluate indirect connection in: {explain(rule, CollectionState(multiworld))}""") raise ex From 8755d5cbc099f79bb347da07cf37d7c5e983ddc4 Mon Sep 17 00:00:00 2001 From: Nicholas Brochu Date: Thu, 24 Apr 2025 19:42:42 -0400 Subject: [PATCH 083/199] Remove Game: Zork Grand Inquisitor (#4884) * remove zork grand inquisitor * add apworld to inno setup installdelete --- README.md | 1 - docs/CODEOWNERS | 4 - worlds/zork_grand_inquisitor/LICENSE | 21 - worlds/zork_grand_inquisitor/__init__.py | 17 - worlds/zork_grand_inquisitor/client.py | 188 -- worlds/zork_grand_inquisitor/data/__init__.py | 0 .../data/entrance_rule_data.py | 419 --- .../zork_grand_inquisitor/data/item_data.py | 792 ----- .../data/location_data.py | 1535 --------- ...missable_location_grant_conditions_data.py | 200 -- .../zork_grand_inquisitor/data/region_data.py | 183 -- worlds/zork_grand_inquisitor/data_funcs.py | 247 -- .../docs/en_Zork Grand Inquisitor.md | 102 - worlds/zork_grand_inquisitor/docs/setup_en.md | 42 - worlds/zork_grand_inquisitor/enums.py | 350 -- .../zork_grand_inquisitor/game_controller.py | 1388 -------- .../game_state_manager.py | 370 --- worlds/zork_grand_inquisitor/options.py | 61 - worlds/zork_grand_inquisitor/requirements.txt | 1 - worlds/zork_grand_inquisitor/test/__init__.py | 5 - .../zork_grand_inquisitor/test/test_access.py | 2927 ----------------- .../test/test_data_funcs.py | 132 - .../test/test_locations.py | 49 - worlds/zork_grand_inquisitor/world.py | 205 -- 24 files changed, 9239 deletions(-) delete mode 100644 worlds/zork_grand_inquisitor/LICENSE delete mode 100644 worlds/zork_grand_inquisitor/__init__.py delete mode 100644 worlds/zork_grand_inquisitor/client.py delete mode 100644 worlds/zork_grand_inquisitor/data/__init__.py delete mode 100644 worlds/zork_grand_inquisitor/data/entrance_rule_data.py delete mode 100644 worlds/zork_grand_inquisitor/data/item_data.py delete mode 100644 worlds/zork_grand_inquisitor/data/location_data.py delete mode 100644 worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py delete mode 100644 worlds/zork_grand_inquisitor/data/region_data.py delete mode 100644 worlds/zork_grand_inquisitor/data_funcs.py delete mode 100644 worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md delete mode 100644 worlds/zork_grand_inquisitor/docs/setup_en.md delete mode 100644 worlds/zork_grand_inquisitor/enums.py delete mode 100644 worlds/zork_grand_inquisitor/game_controller.py delete mode 100644 worlds/zork_grand_inquisitor/game_state_manager.py delete mode 100644 worlds/zork_grand_inquisitor/options.py delete mode 100644 worlds/zork_grand_inquisitor/requirements.txt delete mode 100644 worlds/zork_grand_inquisitor/test/__init__.py delete mode 100644 worlds/zork_grand_inquisitor/test/test_access.py delete mode 100644 worlds/zork_grand_inquisitor/test/test_data_funcs.py delete mode 100644 worlds/zork_grand_inquisitor/test/test_locations.py delete mode 100644 worlds/zork_grand_inquisitor/world.py diff --git a/README.md b/README.md index 5e14ef5de3..83fdeea611 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,6 @@ Currently, the following games are supported: * TUNIC * Kirby's Dream Land 3 * Celeste 64 -* Zork Grand Inquisitor * Castlevania 64 * A Short Hike * Yoshi's Island diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 29de6bbfb6..88b5060dcc 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -232,10 +232,6 @@ # Zillion /worlds/zillion/ @beauxq -# Zork Grand Inquisitor -/worlds/zork_grand_inquisitor/ @nbrochu - - ## Active Unmaintained Worlds # The following worlds in this repo are currently unmaintained, but currently still work in core. If any update breaks diff --git a/worlds/zork_grand_inquisitor/LICENSE b/worlds/zork_grand_inquisitor/LICENSE deleted file mode 100644 index a94ca6bf91..0000000000 --- a/worlds/zork_grand_inquisitor/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Serpent.AI - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/worlds/zork_grand_inquisitor/__init__.py b/worlds/zork_grand_inquisitor/__init__.py deleted file mode 100644 index 791f41dd00..0000000000 --- a/worlds/zork_grand_inquisitor/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -import worlds.LauncherComponents as LauncherComponents - -from .world import ZorkGrandInquisitorWorld - - -def launch_client() -> None: - from .client import main - LauncherComponents.launch(main, name="ZorkGrandInquisitorClient") - - -LauncherComponents.components.append( - LauncherComponents.Component( - "Zork Grand Inquisitor Client", - func=launch_client, - component_type=LauncherComponents.Type.CLIENT - ) -) diff --git a/worlds/zork_grand_inquisitor/client.py b/worlds/zork_grand_inquisitor/client.py deleted file mode 100644 index 8b8d7d3ebf..0000000000 --- a/worlds/zork_grand_inquisitor/client.py +++ /dev/null @@ -1,188 +0,0 @@ -import asyncio - -import CommonClient -import NetUtils -import Utils - -from typing import Any, Dict, List, Optional, Set, Tuple - -from .data_funcs import item_names_to_id, location_names_to_id, id_to_items, id_to_locations, id_to_goals -from .enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorLocations -from .game_controller import GameController - - -class ZorkGrandInquisitorCommandProcessor(CommonClient.ClientCommandProcessor): - def _cmd_zork(self) -> None: - """Attach to an open Zork Grand Inquisitor process.""" - result: bool = self.ctx.game_controller.open_process_handle() - - if result: - self.ctx.process_attached_at_least_once = True - self.output("Successfully attached to Zork Grand Inquisitor process.") - else: - self.output("Failed to attach to Zork Grand Inquisitor process.") - - def _cmd_brog(self) -> None: - """List received Brog items.""" - self.ctx.game_controller.list_received_brog_items() - - def _cmd_griff(self) -> None: - """List received Griff items.""" - self.ctx.game_controller.list_received_griff_items() - - def _cmd_lucy(self) -> None: - """List received Lucy items.""" - self.ctx.game_controller.list_received_lucy_items() - - def _cmd_hotspots(self) -> None: - """List received Hotspots.""" - self.ctx.game_controller.list_received_hotspots() - - -class ZorkGrandInquisitorContext(CommonClient.CommonContext): - tags: Set[str] = {"AP"} - game: str = "Zork Grand Inquisitor" - command_processor: CommonClient.ClientCommandProcessor = ZorkGrandInquisitorCommandProcessor - items_handling: int = 0b111 - want_slot_data: bool = True - - item_name_to_id: Dict[str, int] = item_names_to_id() - location_name_to_id: Dict[str, int] = location_names_to_id() - - id_to_items: Dict[int, ZorkGrandInquisitorItems] = id_to_items() - id_to_locations: Dict[int, ZorkGrandInquisitorLocations] = id_to_locations() - - game_controller: GameController - - controller_task: Optional[asyncio.Task] - - process_attached_at_least_once: bool - can_display_process_message: bool - - def __init__(self, server_address: Optional[str], password: Optional[str]) -> None: - super().__init__(server_address, password) - - self.game_controller = GameController(logger=CommonClient.logger) - - self.controller_task = None - - self.process_attached_at_least_once = False - self.can_display_process_message = True - - def run_gui(self) -> None: - from kvui import GameManager - - class TextManager(GameManager): - logging_pairs: List[Tuple[str, str]] = [("Client", "Archipelago")] - base_title: str = "Archipelago Zork Grand Inquisitor Client" - - self.ui = TextManager(self) - self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") - - async def server_auth(self, password_requested: bool = False): - if password_requested and not self.password: - await super().server_auth(password_requested) - - await self.get_username() - await self.send_connect() - - def on_package(self, cmd: str, _args: Any) -> None: - if cmd == "Connected": - self.game = self.slot_info[self.slot].game - - # Options - self.game_controller.option_goal = id_to_goals()[_args["slot_data"]["goal"]] - self.game_controller.option_deathsanity = _args["slot_data"]["deathsanity"] == 1 - - self.game_controller.option_grant_missable_location_checks = ( - _args["slot_data"]["grant_missable_location_checks"] == 1 - ) - - async def controller(self): - while not self.exit_event.is_set(): - await asyncio.sleep(0.1) - - # Enqueue Received Item Delta - network_item: NetUtils.NetworkItem - for network_item in self.items_received: - item: ZorkGrandInquisitorItems = self.id_to_items[network_item.item] - - if item not in self.game_controller.received_items: - if item not in self.game_controller.received_items_queue: - self.game_controller.received_items_queue.append(item) - - # Game Controller Update - if self.game_controller.is_process_running(): - self.game_controller.update() - self.can_display_process_message = True - else: - process_message: str - - if self.process_attached_at_least_once: - process_message = ( - "Lost connection to Zork Grand Inquisitor process. Please restart the game and use the /zork " - "command to reattach." - ) - else: - process_message = ( - "Please use the /zork command to attach to a running Zork Grand Inquisitor process." - ) - - if self.can_display_process_message: - CommonClient.logger.info(process_message) - self.can_display_process_message = False - - # Send Checked Locations - checked_location_ids: List[int] = list() - - while len(self.game_controller.completed_locations_queue) > 0: - location: ZorkGrandInquisitorLocations = self.game_controller.completed_locations_queue.popleft() - location_id: int = self.location_name_to_id[location.value] - - checked_location_ids.append(location_id) - - await self.send_msgs([ - { - "cmd": "LocationChecks", - "locations": checked_location_ids - } - ]) - - # Check for Goal Completion - if self.game_controller.goal_completed: - await self.send_msgs([ - { - "cmd": "StatusUpdate", - "status": CommonClient.ClientStatus.CLIENT_GOAL - } - ]) - - -def main() -> None: - Utils.init_logging("ZorkGrandInquisitorClient", exception_logger="Client") - - async def _main(): - ctx: ZorkGrandInquisitorContext = ZorkGrandInquisitorContext(None, None) - - ctx.server_task = asyncio.create_task(CommonClient.server_loop(ctx), name="server loop") - ctx.controller_task = asyncio.create_task(ctx.controller(), name="ZorkGrandInquisitorController") - - if CommonClient.gui_enabled: - ctx.run_gui() - - ctx.run_cli() - - await ctx.exit_event.wait() - await ctx.shutdown() - - import colorama - - colorama.just_fix_windows_console() - - asyncio.run(_main()) - - colorama.deinit() - - -if __name__ == "__main__": - main() diff --git a/worlds/zork_grand_inquisitor/data/__init__.py b/worlds/zork_grand_inquisitor/data/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py b/worlds/zork_grand_inquisitor/data/entrance_rule_data.py deleted file mode 100644 index f48be5eb6b..0000000000 --- a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py +++ /dev/null @@ -1,419 +0,0 @@ -from typing import Dict, Tuple, Union - -from ..enums import ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems, ZorkGrandInquisitorRegions - - -entrance_rule_data: Dict[ - Tuple[ - ZorkGrandInquisitorRegions, - ZorkGrandInquisitorRegions, - ], - Union[ - Tuple[ - Tuple[ - Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorRegions, - ], - ..., - ], - ..., - ], - None, - ], -] = { - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.DM_LAIR): ( - ( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, - ), - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH): ( - ( - ZorkGrandInquisitorItems.SPELL_REZROV, - ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE): None, - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): ( - ( - ZorkGrandInquisitorItems.SUBWAY_TOKEN, - ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT, - ), - ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.CROSSROADS): None, - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): ( - ( - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.DM_LAIR): None, - (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WALKING_CASTLE): ( - ( - ZorkGrandInquisitorItems.HOTSPOT_BLINDS, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL, - ), - ), - (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE): ( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, - ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, - ), - ), - (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON): ( - ( - ZorkGrandInquisitorItems.TOTEM_GRIFF, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW, - ), - ), - (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, ZorkGrandInquisitorRegions.HADES_BEYOND_GATES): None, - (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO): None, - (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.ENDGAME): ( - ( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ZorkGrandInquisitorRegions.WHITE_HOUSE, - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.CROSSROADS): None, - (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): ( - ( - ZorkGrandInquisitorItems.SPELL_IGRAM, - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( - (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR,), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.GUE_TECH): None, - (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( - ( - ZorkGrandInquisitorItems.STUDENT_ID, - ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.DM_LAIR): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.GUE_TECH): None, - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, - ), - ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, - ), - ), - (ZorkGrandInquisitorRegions.HADES, ZorkGrandInquisitorRegions.HADES_BEYOND_GATES): ( - ( - ZorkGrandInquisitorEvents.KNOWS_SNAVIG, - ZorkGrandInquisitorItems.TOTEM_BROG, # Visually hiding this totem is tied to owning it; no choice - ), - ), - (ZorkGrandInquisitorRegions.HADES, ZorkGrandInquisitorRegions.HADES_SHORE): ( - (ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,), - ), - (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO): ( - ( - ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, - ), - ), - (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.HADES): None, - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.DM_LAIR): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, - ), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, - ), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.HADES): ( - ( - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, - ), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,), - ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,), - ), - (ZorkGrandInquisitorRegions.MENU, ZorkGrandInquisitorRegions.PORT_FOOZLE): None, - (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, - ), - ), - (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT): ( - ( - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, - ), - ), - (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): None, - (ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, ZorkGrandInquisitorRegions.MONASTERY): None, - (ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST): ( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER, - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT, - ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER, - ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, - ), - ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.CROSSROADS): ( - ( - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE, - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, - ), - ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP): ( - ( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, ZorkGrandInquisitorRegions.PORT_FOOZLE): None, - (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT): None, - (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN): ( - ( - ZorkGrandInquisitorItems.TOTEM_LUCY, - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR, - ), - ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, ZorkGrandInquisitorRegions.ENDGAME): ( - ( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.WHITE_HOUSE, - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ), - ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST): None, - (ZorkGrandInquisitorRegions.SPELL_LAB, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): None, - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), - ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.DM_LAIR): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, - ), - ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, - ), - ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): None, - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, - ), - ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.SPELL_LAB): ( - ( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE, - ZorkGrandInquisitorEvents.DAM_DESTROYED, - ZorkGrandInquisitorItems.SPELL_GOLGATEM, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM, - ), - ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - ( - ZorkGrandInquisitorItems.MAP, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, - ), - ), - (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.CROSSROADS): None, - (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.HADES_SHORE): ( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES, - ), - ), - (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): ( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM, - ), - ), - (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, - ), - ), - (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.HADES_SHORE): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,), - ), - (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, - (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,), - ), - (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.HADES_SHORE): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,), - ), - (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.MONASTERY): ( - ( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT, - ), - ), - (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, - (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): ( - (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,), - ), - (ZorkGrandInquisitorRegions.WALKING_CASTLE, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): None, - (ZorkGrandInquisitorRegions.WHITE_HOUSE, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): None, - (ZorkGrandInquisitorRegions.WHITE_HOUSE, ZorkGrandInquisitorRegions.ENDGAME): ( - ( - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ), - ), -} diff --git a/worlds/zork_grand_inquisitor/data/item_data.py b/worlds/zork_grand_inquisitor/data/item_data.py deleted file mode 100644 index c312bbce3d..0000000000 --- a/worlds/zork_grand_inquisitor/data/item_data.py +++ /dev/null @@ -1,792 +0,0 @@ -from typing import Dict, NamedTuple, Optional, Tuple, Union - -from BaseClasses import ItemClassification - -from ..enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorTags - - -class ZorkGrandInquisitorItemData(NamedTuple): - statemap_keys: Optional[Tuple[int, ...]] - archipelago_id: Optional[int] - classification: ItemClassification - tags: Tuple[ZorkGrandInquisitorTags, ...] - maximum_quantity: Optional[int] = 1 - - -ITEM_OFFSET = 9758067000 - -item_data: Dict[ZorkGrandInquisitorItems, ZorkGrandInquisitorItemData] = { - # Inventory Items - ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH: ZorkGrandInquisitorItemData( - statemap_keys=(67,), # Extinguished = 103 - archipelago_id=ITEM_OFFSET + 0, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH: ZorkGrandInquisitorItemData( - statemap_keys=(68,), # Extinguished = 104 - archipelago_id=ITEM_OFFSET + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.BROGS_GRUE_EGG: ZorkGrandInquisitorItemData( - statemap_keys=(70,), # Boiled = 71 - archipelago_id=ITEM_OFFSET + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.BROGS_PLANK: ZorkGrandInquisitorItemData( - statemap_keys=(69,), - archipelago_id=ITEM_OFFSET + 3, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE: ZorkGrandInquisitorItemData( - statemap_keys=(54,), - archipelago_id=ITEM_OFFSET + 4, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP: ZorkGrandInquisitorItemData( - statemap_keys=(86,), - archipelago_id=ITEM_OFFSET + 5, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH: ZorkGrandInquisitorItemData( - statemap_keys=(84,), - archipelago_id=ITEM_OFFSET + 6, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT: ZorkGrandInquisitorItemData( - statemap_keys=(9,), - archipelago_id=ITEM_OFFSET + 7, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN: ZorkGrandInquisitorItemData( - statemap_keys=(16,), - archipelago_id=ITEM_OFFSET + 8, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.HAMMER: ZorkGrandInquisitorItemData( - statemap_keys=(23,), - archipelago_id=ITEM_OFFSET + 9, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.HUNGUS_LARD: ZorkGrandInquisitorItemData( - statemap_keys=(55,), - archipelago_id=ITEM_OFFSET + 10, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS: ZorkGrandInquisitorItemData( - statemap_keys=(56,), - archipelago_id=ITEM_OFFSET + 11, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LANTERN: ZorkGrandInquisitorItemData( - statemap_keys=(4,), - archipelago_id=ITEM_OFFSET + 12, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER: ZorkGrandInquisitorItemData( - statemap_keys=(88,), - archipelago_id=ITEM_OFFSET + 13, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1: ZorkGrandInquisitorItemData( - statemap_keys=(116,), # With fly = 120 - archipelago_id=ITEM_OFFSET + 14, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2: ZorkGrandInquisitorItemData( - statemap_keys=(117,), # With fly = 121 - archipelago_id=ITEM_OFFSET + 15, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3: ZorkGrandInquisitorItemData( - statemap_keys=(118,), # With fly = 122 - archipelago_id=ITEM_OFFSET + 16, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4: ZorkGrandInquisitorItemData( - statemap_keys=(119,), # With fly = 123 - archipelago_id=ITEM_OFFSET + 17, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.MAP: ZorkGrandInquisitorItemData( - statemap_keys=(6,), - archipelago_id=ITEM_OFFSET + 18, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.MEAD_LIGHT: ZorkGrandInquisitorItemData( - statemap_keys=(2,), - archipelago_id=ITEM_OFFSET + 19, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.MOSS_OF_MAREILON: ZorkGrandInquisitorItemData( - statemap_keys=(57,), - archipelago_id=ITEM_OFFSET + 20, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.MUG: ZorkGrandInquisitorItemData( - statemap_keys=(35,), - archipelago_id=ITEM_OFFSET + 21, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.OLD_SCRATCH_CARD: ZorkGrandInquisitorItemData( - statemap_keys=(17,), - archipelago_id=ITEM_OFFSET + 22, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE: ZorkGrandInquisitorItemData( - statemap_keys=(36,), - archipelago_id=ITEM_OFFSET + 23, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER: ZorkGrandInquisitorItemData( - statemap_keys=(3,), - archipelago_id=ITEM_OFFSET + 24, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: ZorkGrandInquisitorItemData( - statemap_keys=(5827,), - archipelago_id=ITEM_OFFSET + 25, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.PROZORK_TABLET: ZorkGrandInquisitorItemData( - statemap_keys=(65,), - archipelago_id=ITEM_OFFSET + 26, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB: ZorkGrandInquisitorItemData( - statemap_keys=(53,), - archipelago_id=ITEM_OFFSET + 27, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.ROPE: ZorkGrandInquisitorItemData( - statemap_keys=(83,), - archipelago_id=ITEM_OFFSET + 28, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS: ZorkGrandInquisitorItemData( - statemap_keys=(101,), # SNA = 41 - archipelago_id=ITEM_OFFSET + 29, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV: ZorkGrandInquisitorItemData( - statemap_keys=(102,), # VIG = 48 - archipelago_id=ITEM_OFFSET + 30, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SHOVEL: ZorkGrandInquisitorItemData( - statemap_keys=(49,), - archipelago_id=ITEM_OFFSET + 31, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SNAPDRAGON: ZorkGrandInquisitorItemData( - statemap_keys=(50,), - archipelago_id=ITEM_OFFSET + 32, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.STUDENT_ID: ZorkGrandInquisitorItemData( - statemap_keys=(39,), - archipelago_id=ITEM_OFFSET + 33, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SUBWAY_TOKEN: ZorkGrandInquisitorItemData( - statemap_keys=(20,), - archipelago_id=ITEM_OFFSET + 34, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.SWORD: ZorkGrandInquisitorItemData( - statemap_keys=(21,), - archipelago_id=ITEM_OFFSET + 35, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.ZIMDOR_SCROLL: ZorkGrandInquisitorItemData( - statemap_keys=(25,), - archipelago_id=ITEM_OFFSET + 36, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.ZORK_ROCKS: ZorkGrandInquisitorItemData( - statemap_keys=(37,), - archipelago_id=ITEM_OFFSET + 37, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - # Hotspots - ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX: ZorkGrandInquisitorItemData( - statemap_keys=(9116,), - archipelago_id=ITEM_OFFSET + 100 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS: ZorkGrandInquisitorItemData( - statemap_keys=(15434, 15436, 15438, 15440), - archipelago_id=ITEM_OFFSET + 100 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX: ZorkGrandInquisitorItemData( - statemap_keys=(12096,), - archipelago_id=ITEM_OFFSET + 100 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_BLINDS: ZorkGrandInquisitorItemData( - statemap_keys=(4799,), - archipelago_id=ITEM_OFFSET + 100 + 3, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS: ZorkGrandInquisitorItemData( - statemap_keys=(12691, 12692, 12693, 12694, 12695, 12696, 12697, 12698, 12699, 12700, 12701), - archipelago_id=ITEM_OFFSET + 100 + 4, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(12702,), - archipelago_id=ITEM_OFFSET + 100 + 5, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(12909,), - archipelago_id=ITEM_OFFSET + 100 + 6, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(12900,), - archipelago_id=ITEM_OFFSET + 100 + 7, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(5010,), - archipelago_id=ITEM_OFFSET + 100 + 8, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(9539,), - archipelago_id=ITEM_OFFSET + 100 + 9, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER: ZorkGrandInquisitorItemData( - statemap_keys=(19712,), - archipelago_id=ITEM_OFFSET + 100 + 10, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT: ZorkGrandInquisitorItemData( - statemap_keys=(2586,), - archipelago_id=ITEM_OFFSET + 100 + 11, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER: ZorkGrandInquisitorItemData( - statemap_keys=(11878,), - archipelago_id=ITEM_OFFSET + 100 + 12, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND: ZorkGrandInquisitorItemData( - statemap_keys=(11751,), - archipelago_id=ITEM_OFFSET + 100 + 13, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH: ZorkGrandInquisitorItemData( - statemap_keys=(15147, 15153), - archipelago_id=ITEM_OFFSET + 100 + 14, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW: ZorkGrandInquisitorItemData( - statemap_keys=(1705,), - archipelago_id=ITEM_OFFSET + 100 + 15, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS: ZorkGrandInquisitorItemData( - statemap_keys=(1425, 1426), - archipelago_id=ITEM_OFFSET + 100 + 16, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE: ZorkGrandInquisitorItemData( - statemap_keys=(13106,), - archipelago_id=ITEM_OFFSET + 100 + 17, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS: ZorkGrandInquisitorItemData( - statemap_keys=(13219, 13220, 13221, 13222), - archipelago_id=ITEM_OFFSET + 100 + 18, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS: ZorkGrandInquisitorItemData( - statemap_keys=(14327, 14332, 14337, 14342), - archipelago_id=ITEM_OFFSET + 100 + 19, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(12528,), - archipelago_id=ITEM_OFFSET + 100 + 20, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS: ZorkGrandInquisitorItemData( - statemap_keys=(12523, 12524, 12525), - archipelago_id=ITEM_OFFSET + 100 + 21, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE: ZorkGrandInquisitorItemData( - statemap_keys=(13002,), - archipelago_id=ITEM_OFFSET + 100 + 22, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL: ZorkGrandInquisitorItemData( - statemap_keys=(10726,), - archipelago_id=ITEM_OFFSET + 100 + 23, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(12280,), - archipelago_id=ITEM_OFFSET + 100 + 24, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS: ZorkGrandInquisitorItemData( - statemap_keys=( - 17694, - 17695, - 17696, - 17697, - 18200, - 17703, - 17704, - 17705, - 17710, - 17711, - 17712, - 17713, - 17714, - 17715, - 17716, - 17722, - 17723, - 17724, - 17725, - 17726, - 17727 - ), - archipelago_id=ITEM_OFFSET + 100 + 25, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS: ZorkGrandInquisitorItemData( - statemap_keys=(8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459), - archipelago_id=ITEM_OFFSET + 100 + 26, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER: ZorkGrandInquisitorItemData( - statemap_keys=(8446,), - archipelago_id=ITEM_OFFSET + 100 + 27, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_HARRY: ZorkGrandInquisitorItemData( - statemap_keys=(4260,), - archipelago_id=ITEM_OFFSET + 100 + 28, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY: ZorkGrandInquisitorItemData( - statemap_keys=(18026,), - archipelago_id=ITEM_OFFSET + 100 + 29, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH: ZorkGrandInquisitorItemData( - statemap_keys=(17623,), - archipelago_id=ITEM_OFFSET + 100 + 30, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(13140,), - archipelago_id=ITEM_OFFSET + 100 + 31, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(10441,), - archipelago_id=ITEM_OFFSET + 100 + 32, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS: ZorkGrandInquisitorItemData( - statemap_keys=(19632, 19627), - archipelago_id=ITEM_OFFSET + 100 + 33, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(3025,), - archipelago_id=ITEM_OFFSET + 100 + 34, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG: ZorkGrandInquisitorItemData( - statemap_keys=(3036,), - archipelago_id=ITEM_OFFSET + 100 + 35, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MIRROR: ZorkGrandInquisitorItemData( - statemap_keys=(5031,), - archipelago_id=ITEM_OFFSET + 100 + 36, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT: ZorkGrandInquisitorItemData( - statemap_keys=(13597,), - archipelago_id=ITEM_OFFSET + 100 + 37, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE: ZorkGrandInquisitorItemData( - statemap_keys=(13390,), - archipelago_id=ITEM_OFFSET + 100 + 38, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR: ZorkGrandInquisitorItemData( - statemap_keys=(2455, 2447), - archipelago_id=ITEM_OFFSET + 100 + 39, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS: ZorkGrandInquisitorItemData( - statemap_keys=(12389, 12390), - archipelago_id=ITEM_OFFSET + 100 + 40, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE: ZorkGrandInquisitorItemData( - statemap_keys=(4302,), - archipelago_id=ITEM_OFFSET + 100 + 41, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE: ZorkGrandInquisitorItemData( - statemap_keys=(16383, 16384), - archipelago_id=ITEM_OFFSET + 100 + 42, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE: ZorkGrandInquisitorItemData( - statemap_keys=(2769,), - archipelago_id=ITEM_OFFSET + 100 + 43, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON: ZorkGrandInquisitorItemData( - statemap_keys=(4149,), - archipelago_id=ITEM_OFFSET + 100 + 44, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS: ZorkGrandInquisitorItemData( - statemap_keys=(12584, 12585, 12586, 12587), - archipelago_id=ITEM_OFFSET + 100 + 45, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(12574,), - archipelago_id=ITEM_OFFSET + 100 + 46, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(13412,), - archipelago_id=ITEM_OFFSET + 100 + 47, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER: ZorkGrandInquisitorItemData( - statemap_keys=(12170,), - archipelago_id=ITEM_OFFSET + 100 + 48, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM: ZorkGrandInquisitorItemData( - statemap_keys=(16382,), - archipelago_id=ITEM_OFFSET + 100 + 49, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM: ZorkGrandInquisitorItemData( - statemap_keys=(4209,), - archipelago_id=ITEM_OFFSET + 100 + 50, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE: ZorkGrandInquisitorItemData( - statemap_keys=(11973,), - archipelago_id=ITEM_OFFSET + 100 + 51, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT: ZorkGrandInquisitorItemData( - statemap_keys=(13168,), - archipelago_id=ITEM_OFFSET + 100 + 52, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY: ZorkGrandInquisitorItemData( - statemap_keys=(15396,), - archipelago_id=ITEM_OFFSET + 100 + 53, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH: ZorkGrandInquisitorItemData( - statemap_keys=(9706,), - archipelago_id=ITEM_OFFSET + 100 + 54, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS: ZorkGrandInquisitorItemData( - statemap_keys=(9728, 9729, 9730), - archipelago_id=ITEM_OFFSET + 100 + 55, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_WELL: ZorkGrandInquisitorItemData( - statemap_keys=(10314,), - archipelago_id=ITEM_OFFSET + 100 + 56, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - # Spells - ZorkGrandInquisitorItems.SPELL_GLORF: ZorkGrandInquisitorItemData( - statemap_keys=(202,), - archipelago_id=ITEM_OFFSET + 200 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_GOLGATEM: ZorkGrandInquisitorItemData( - statemap_keys=(192,), - archipelago_id=ITEM_OFFSET + 200 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_IGRAM: ZorkGrandInquisitorItemData( - statemap_keys=(199,), - archipelago_id=ITEM_OFFSET + 200 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_KENDALL: ZorkGrandInquisitorItemData( - statemap_keys=(196,), - archipelago_id=ITEM_OFFSET + 200 + 3, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_NARWILE: ZorkGrandInquisitorItemData( - statemap_keys=(197,), - archipelago_id=ITEM_OFFSET + 200 + 4, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_REZROV: ZorkGrandInquisitorItemData( - statemap_keys=(195,), - archipelago_id=ITEM_OFFSET + 200 + 5, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_THROCK: ZorkGrandInquisitorItemData( - statemap_keys=(200,), - archipelago_id=ITEM_OFFSET + 200 + 6, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - ZorkGrandInquisitorItems.SPELL_VOXAM: ZorkGrandInquisitorItemData( - statemap_keys=(191,), - archipelago_id=ITEM_OFFSET + 200 + 7, - classification=ItemClassification.useful, - tags=(ZorkGrandInquisitorTags.SPELL,), - ), - # Subway Destinations - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM: ZorkGrandInquisitorItemData( - statemap_keys=(13757, 13297, 13486, 13625), - archipelago_id=ITEM_OFFSET + 300 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), - ), - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES: ZorkGrandInquisitorItemData( - statemap_keys=(13758, 13309, 13498, 13637), - archipelago_id=ITEM_OFFSET + 300 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), - ), - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData( - statemap_keys=(13759, 13316, 13505, 13644), - archipelago_id=ITEM_OFFSET + 300 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), - ), - # Teleporter Destinations - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR: ZorkGrandInquisitorItemData( - statemap_keys=(2203,), - archipelago_id=ITEM_OFFSET + 400 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH: ZorkGrandInquisitorItemData( - statemap_keys=(7132,), - archipelago_id=ITEM_OFFSET + 400 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES: ZorkGrandInquisitorItemData( - statemap_keys=(7119,), - archipelago_id=ITEM_OFFSET + 400 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData( - statemap_keys=(7148,), - archipelago_id=ITEM_OFFSET + 400 + 3, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB: ZorkGrandInquisitorItemData( - statemap_keys=(16545,), - archipelago_id=ITEM_OFFSET + 400 + 4, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), - ), - # Totemizer Destinations - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION: ZorkGrandInquisitorItemData( - statemap_keys=(9660,), - archipelago_id=ITEM_OFFSET + 500 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: ZorkGrandInquisitorItemData( - statemap_keys=(9666,), - archipelago_id=ITEM_OFFSET + 500 + 1, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: ZorkGrandInquisitorItemData( - statemap_keys=(9668,), - archipelago_id=ITEM_OFFSET + 500 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), - ), - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: ZorkGrandInquisitorItemData( - statemap_keys=(9662,), - archipelago_id=ITEM_OFFSET + 500 + 3, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), - ), - # Totems - ZorkGrandInquisitorItems.TOTEM_BROG: ZorkGrandInquisitorItemData( - statemap_keys=(4853,), - archipelago_id=ITEM_OFFSET + 600 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TOTEM,), - ), - ZorkGrandInquisitorItems.TOTEM_GRIFF: ZorkGrandInquisitorItemData( - statemap_keys=(4315,), - archipelago_id=ITEM_OFFSET + 600 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TOTEM,), - ), - ZorkGrandInquisitorItems.TOTEM_LUCY: ZorkGrandInquisitorItemData( - statemap_keys=(5223,), - archipelago_id=ITEM_OFFSET + 600 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.TOTEM,), - ), - # Filler - ZorkGrandInquisitorItems.FILLER_INQUISITION_PROPAGANDA_FLYER: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 700 + 0, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.FILLER,), - maximum_quantity=None, - ), - ZorkGrandInquisitorItems.FILLER_UNREADABLE_SPELL_SCROLL: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 700 + 1, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.FILLER,), - maximum_quantity=None, - ), - ZorkGrandInquisitorItems.FILLER_MAGIC_CONTRABAND: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 700 + 2, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.FILLER,), - maximum_quantity=None, - ), - ZorkGrandInquisitorItems.FILLER_FROBOZZ_ELECTRIC_GADGET: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 700 + 3, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.FILLER,), - maximum_quantity=None, - ), - ZorkGrandInquisitorItems.FILLER_NONSENSICAL_INQUISITION_PAPERWORK: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 700 + 4, - classification=ItemClassification.filler, - tags=(ZorkGrandInquisitorTags.FILLER,), - maximum_quantity=None, - ), -} diff --git a/worlds/zork_grand_inquisitor/data/location_data.py b/worlds/zork_grand_inquisitor/data/location_data.py deleted file mode 100644 index 8b4e57392d..0000000000 --- a/worlds/zork_grand_inquisitor/data/location_data.py +++ /dev/null @@ -1,1535 +0,0 @@ -from typing import Dict, NamedTuple, Optional, Tuple, Union - -from ..enums import ( - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorLocations, - ZorkGrandInquisitorRegions, - ZorkGrandInquisitorTags, -) - - -class ZorkGrandInquisitorLocationData(NamedTuple): - game_state_trigger: Optional[ - Tuple[ - Union[ - Tuple[str, str], - Tuple[int, int], - Tuple[int, Tuple[int, ...]], - ], - ..., - ] - ] - archipelago_id: Optional[int] - region: ZorkGrandInquisitorRegions - tags: Optional[Tuple[ZorkGrandInquisitorTags, ...]] = None - requirements: Optional[ - Tuple[ - Union[ - Union[ - ZorkGrandInquisitorItems, - ZorkGrandInquisitorEvents, - ], - Tuple[ - Union[ - ZorkGrandInquisitorItems, - ZorkGrandInquisitorEvents, - ], - ..., - ], - ], - ..., - ] - ] = None - event_item_name: Optional[str] = None - - -LOCATION_OFFSET = 9758067000 - -location_data: Dict[ - Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], ZorkGrandInquisitorLocationData -] = { - ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2m"),), - archipelago_id=LOCATION_OFFSET + 0, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.ARREST_THE_VANDAL: ZorkGrandInquisitorLocationData( - game_state_trigger=((10789, 1),), - archipelago_id=LOCATION_OFFSET + 1, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - ), - ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED: ZorkGrandInquisitorLocationData( - game_state_trigger=((11787, 1), (11788, 1), (11789, 1)), - archipelago_id=LOCATION_OFFSET + 2, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER: ZorkGrandInquisitorLocationData( - game_state_trigger=((8929, 1),), - archipelago_id=LOCATION_OFFSET + 3, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_OBIDIL,), - ), - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE: ZorkGrandInquisitorLocationData( - game_state_trigger=((9124, 1),), - archipelago_id=LOCATION_OFFSET + 4, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE, - ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX, - ), - ), - ZorkGrandInquisitorLocations.A_SMALLWAY: ZorkGrandInquisitorLocationData( - game_state_trigger=((11777, 1),), - archipelago_id=LOCATION_OFFSET + 5, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, - ZorkGrandInquisitorItems.SPELL_IGRAM, - ), - ), - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY: ZorkGrandInquisitorLocationData( - game_state_trigger=((13278, 1),), - archipelago_id=LOCATION_OFFSET + 6, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE, - ZorkGrandInquisitorItems.SPELL_THROCK, - ), - ), - ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED: ZorkGrandInquisitorLocationData( - game_state_trigger=((16315, 1),), - archipelago_id=LOCATION_OFFSET + 7, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE, - ZorkGrandInquisitorItems.SPELL_KENDALL, - ), - ), - ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "th3x"),), - archipelago_id=LOCATION_OFFSET + 8, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,), - ), - ZorkGrandInquisitorLocations.BOING_BOING_BOING: ZorkGrandInquisitorLocationData( - game_state_trigger=((4220, 1),), - archipelago_id=LOCATION_OFFSET + 9, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.SNAPDRAGON, - ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, - ), - ), - ZorkGrandInquisitorLocations.BONK: ZorkGrandInquisitorLocationData( - game_state_trigger=((19491, 1),), - archipelago_id=LOCATION_OFFSET + 10, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, - ), - ), - ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "us2g"),), - archipelago_id=LOCATION_OFFSET + 11, - region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.BROG_DO_GOOD: ZorkGrandInquisitorLocationData( - game_state_trigger=((2644, 1),), - archipelago_id=LOCATION_OFFSET + 12, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ) - ), - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS: ZorkGrandInquisitorLocationData( - game_state_trigger=((2629, 1),), - archipelago_id=LOCATION_OFFSET + 13, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ) - ), - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB: ZorkGrandInquisitorLocationData( - game_state_trigger=((2650, 1),), - archipelago_id=LOCATION_OFFSET + 14, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ) - ), - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME: ZorkGrandInquisitorLocationData( - game_state_trigger=((15715, 1),), - archipelago_id=LOCATION_OFFSET + 15, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ) - ), - ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dv1t"),), - archipelago_id=LOCATION_OFFSET + 16, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.CAVES_NOTES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "th3y"),), - archipelago_id=LOCATION_OFFSET + 17, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,), - ), - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS: ZorkGrandInquisitorLocationData( - game_state_trigger=((9543, 1),), - archipelago_id=LOCATION_OFFSET + 18, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.CRISIS_AVERTED: ZorkGrandInquisitorLocationData( - game_state_trigger=((11769, 1),), - archipelago_id=LOCATION_OFFSET + 19, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED, - ZorkGrandInquisitorItems.SPELL_IGRAM, - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, - ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER, - ), - ), - ZorkGrandInquisitorLocations.CUT_THAT_OUT_YOU_LITTLE_CREEP: ZorkGrandInquisitorLocationData( - game_state_trigger=((19350, 1),), - archipelago_id=LOCATION_OFFSET + 20, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER: ZorkGrandInquisitorLocationData( - game_state_trigger=((17632, 1),), - archipelago_id=LOCATION_OFFSET + 21, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_BLINDS, - ZorkGrandInquisitorItems.SPELL_GOLGATEM, - ), - ), - ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2q"),), - archipelago_id=LOCATION_OFFSET + 22, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "hp5e"), (8919, 2), (9, 100)), - archipelago_id=LOCATION_OFFSET + 23, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SWORD,), - ), - ZorkGrandInquisitorLocations.DOOOOOOWN: ZorkGrandInquisitorLocationData( - game_state_trigger=((3619, 3600),), - archipelago_id=LOCATION_OFFSET + 24, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_GRIFF, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ), - ), - ZorkGrandInquisitorLocations.DOWN: ZorkGrandInquisitorLocationData( - game_state_trigger=((3619, 5300),), - archipelago_id=LOCATION_OFFSET + 25, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_LUCY, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ), - ), - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL: ZorkGrandInquisitorLocationData( - game_state_trigger=((9216, 1),), - archipelago_id=LOCATION_OFFSET + 26, - region=ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SPELL_NARWILE,), - ), - ZorkGrandInquisitorLocations.DUNCE_LOCKER: ZorkGrandInquisitorLocationData( - game_state_trigger=((11851, 1),), - archipelago_id=LOCATION_OFFSET + 27, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - ), - ZorkGrandInquisitorLocations.EGGPLANTS: ZorkGrandInquisitorLocationData( - game_state_trigger=((3816, 11000),), - archipelago_id=LOCATION_OFFSET + 28, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.ELSEWHERE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pc1e"),), - archipelago_id=LOCATION_OFFSET + 29, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=((11784, 1),), - archipelago_id=LOCATION_OFFSET + 30, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - ), - ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP: ZorkGrandInquisitorLocationData( - game_state_trigger=((13743, 1),), - archipelago_id=LOCATION_OFFSET + 31, - region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SPELL_KENDALL,), - ), - ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA: ZorkGrandInquisitorLocationData( - game_state_trigger=((16368, 1),), - archipelago_id=LOCATION_OFFSET + 32, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.SPELL_IGRAM,), - ), - ZorkGrandInquisitorLocations.FIRE_FIRE: ZorkGrandInquisitorLocationData( - game_state_trigger=((10277, 1),), - archipelago_id=LOCATION_OFFSET + 33, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - ), - ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "ue1h"),), - archipelago_id=LOCATION_OFFSET + 34, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON: ZorkGrandInquisitorLocationData( - game_state_trigger=((4222, 1),), - archipelago_id=LOCATION_OFFSET + 35, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SPELL_THROCK, - ZorkGrandInquisitorItems.SNAPDRAGON, - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, - ), - ), - ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dw2g"),), - archipelago_id=LOCATION_OFFSET + 36, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE: ZorkGrandInquisitorLocationData( - game_state_trigger=((12892, 1),), - archipelago_id=LOCATION_OFFSET + 37, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT, - ), - ), - ZorkGrandInquisitorLocations.GO_AWAY: ZorkGrandInquisitorLocationData( - game_state_trigger=((10654, 1),), - archipelago_id=LOCATION_OFFSET + 38, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2k"),), - archipelago_id=LOCATION_OFFSET + 39, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM: ZorkGrandInquisitorLocationData( - game_state_trigger=((11082, 1), (11307, 1), (11536, 1)), - archipelago_id=LOCATION_OFFSET + 40, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2j"),), - archipelago_id=LOCATION_OFFSET + 41, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2n"),), - archipelago_id=LOCATION_OFFSET + 42, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY: ZorkGrandInquisitorLocationData( - game_state_trigger=((8443, 1),), - archipelago_id=LOCATION_OFFSET + 43, - region=ZorkGrandInquisitorRegions.HADES_SHORE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, - ) - ), - ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 1),), - archipelago_id=LOCATION_OFFSET + 44, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE: ZorkGrandInquisitorLocationData( - game_state_trigger=((10421, 1),), - archipelago_id=LOCATION_OFFSET + 45, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH, - ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER, - ), - ), - ZorkGrandInquisitorLocations.HEY_FREE_DIRT: ZorkGrandInquisitorLocationData( - game_state_trigger=((11747, 1),), - archipelago_id=LOCATION_OFFSET + 46, - region=ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND, - ZorkGrandInquisitorItems.SHOVEL, - ), - ), - ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 2),), - archipelago_id=LOCATION_OFFSET + 47, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "mt2h"),), - archipelago_id=LOCATION_OFFSET + 48, - region=ZorkGrandInquisitorRegions.MONASTERY, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 5),), - archipelago_id=LOCATION_OFFSET + 49, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "uh1e"),), - archipelago_id=LOCATION_OFFSET + 50, - region=ZorkGrandInquisitorRegions.HADES_SHORE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "th3s"),), - archipelago_id=LOCATION_OFFSET + 51, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE,), - ), - ZorkGrandInquisitorLocations.IMBUE_BEBURTT: ZorkGrandInquisitorLocationData( - game_state_trigger=((194, 1),), - archipelago_id=LOCATION_OFFSET + 52, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - ), - ZorkGrandInquisitorLocations.IM_COMPLETELY_NUDE: ZorkGrandInquisitorLocationData( - game_state_trigger=((19344, 1),), - archipelago_id=LOCATION_OFFSET + 53, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=((13060, 1),), - archipelago_id=LOCATION_OFFSET + 54, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, - ), - ), - ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS: ZorkGrandInquisitorLocationData( - game_state_trigger=((12967, 1),), - archipelago_id=LOCATION_OFFSET + 55, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SPELL_IGRAM,), - ), - ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE: ZorkGrandInquisitorLocationData( - game_state_trigger=((12931, 1),), - archipelago_id=LOCATION_OFFSET + 56, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE, - ), - ), - ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST: ZorkGrandInquisitorLocationData( - game_state_trigger=((13062, 1),), - archipelago_id=LOCATION_OFFSET + 57, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SPELL_REZROV, - ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR, - ), - ), - ZorkGrandInquisitorLocations.ITS_ONE_OF_THOSE_ADVENTURERS_AGAIN: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pe3j"),), - archipelago_id=LOCATION_OFFSET + 58, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY: ZorkGrandInquisitorLocationData( - game_state_trigger=((3816, 1008),), - archipelago_id=LOCATION_OFFSET + 59, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.SPELL_THROCK, - ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, - ), - ), - ZorkGrandInquisitorLocations.I_DONT_WANT_NO_TROUBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((10694, 1),), - archipelago_id=LOCATION_OFFSET + 60, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE: ZorkGrandInquisitorLocationData( - game_state_trigger=((9637, 1),), - archipelago_id=LOCATION_OFFSET + 61, - region=ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT, - ), - ), - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((16374, 1),), - archipelago_id=LOCATION_OFFSET + 62, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE, - ZorkGrandInquisitorEvents.DAM_DESTROYED, - ZorkGrandInquisitorItems.SPELL_GOLGATEM, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM, - ), - ), - ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tp1e"), (9, 87), (1011, 1)), - archipelago_id=LOCATION_OFFSET + 63, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,), - ), - ZorkGrandInquisitorLocations.LIT_SUNFLOWERS: ZorkGrandInquisitorLocationData( - game_state_trigger=((4129, 1),), - archipelago_id=LOCATION_OFFSET + 64, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SPELL_THROCK,), - ), - ZorkGrandInquisitorLocations.MAGIC_FOREVER: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pc1e"), (10304, 1), (5221, 1)), - archipelago_id=LOCATION_OFFSET + 65, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE, - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, - ), - ), - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL: ZorkGrandInquisitorLocationData( - game_state_trigger=((2498, (1, 2)),), - archipelago_id=LOCATION_OFFSET + 66, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - (ZorkGrandInquisitorItems.TOTEM_GRIFF, ZorkGrandInquisitorItems.TOTEM_LUCY), - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ), - ), - ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR: ZorkGrandInquisitorLocationData( - game_state_trigger=((8623, 21),), - archipelago_id=LOCATION_OFFSET + 67, - region=ZorkGrandInquisitorRegions.HADES_SHORE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.CHARON_CALLED, - ZorkGrandInquisitorItems.SWORD, - ), - ), - ZorkGrandInquisitorLocations.MEAD_LIGHT: ZorkGrandInquisitorLocationData( - game_state_trigger=((10485, 1),), - archipelago_id=LOCATION_OFFSET + 68, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.MEAD_LIGHT, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, - ), - ), - ZorkGrandInquisitorLocations.MIKES_PANTS: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2p"),), - archipelago_id=LOCATION_OFFSET + 69, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED: ZorkGrandInquisitorLocationData( - game_state_trigger=((4217, 1),), - archipelago_id=LOCATION_OFFSET + 70, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, - ), - ), - ZorkGrandInquisitorLocations.NATIONAL_TREASURE: ZorkGrandInquisitorLocationData( - game_state_trigger=((14318, 1),), - archipelago_id=LOCATION_OFFSET + 71, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SPELL_REZROV, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS, - ), - ), - ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dv1p"),), - archipelago_id=LOCATION_OFFSET + 72, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO: ZorkGrandInquisitorLocationData( - game_state_trigger=((12706, 1),), - archipelago_id=LOCATION_OFFSET + 73, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - ), - ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4237, 1),), - archipelago_id=LOCATION_OFFSET + 74, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, - ), - ), - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT: ZorkGrandInquisitorLocationData( - game_state_trigger=((8935, 1),), - archipelago_id=LOCATION_OFFSET + 75, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), - ), - ZorkGrandInquisitorLocations.NO_AUTOGRAPHS: ZorkGrandInquisitorLocationData( - game_state_trigger=((10476, 1),), - archipelago_id=LOCATION_OFFSET + 76, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR,), - ), - ZorkGrandInquisitorLocations.NO_BONDAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pe2e"), (10262, 2), (15150, 83)), - archipelago_id=LOCATION_OFFSET + 77, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH, - ), - ), - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP: ZorkGrandInquisitorLocationData( - game_state_trigger=((12164, 1),), - archipelago_id=LOCATION_OFFSET + 78, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - ), - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON: ZorkGrandInquisitorLocationData( - game_state_trigger=((1300, 1),), - archipelago_id=LOCATION_OFFSET + 79, - region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ), - ), - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS: ZorkGrandInquisitorLocationData( - game_state_trigger=((2448, 1),), - archipelago_id=LOCATION_OFFSET + 80, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR, - ), - ), - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU: ZorkGrandInquisitorLocationData( - game_state_trigger=((4869, 1),), - archipelago_id=LOCATION_OFFSET + 81, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE, - ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS, - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB, - ZorkGrandInquisitorItems.MOSS_OF_MAREILON, - ZorkGrandInquisitorItems.MUG, - ), - ), - ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER: ZorkGrandInquisitorLocationData( - game_state_trigger=((4512, 32),), - archipelago_id=LOCATION_OFFSET + 82, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, # This can be done anywhere if the item requirement is met - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), - ), - ZorkGrandInquisitorLocations.ONLY_YOU_CAN_PREVENT_FOOZLE_FIRES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pe5n"),), - archipelago_id=LOCATION_OFFSET + 83, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL: ZorkGrandInquisitorLocationData( - game_state_trigger=((8730, 1),), - archipelago_id=LOCATION_OFFSET + 84, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), - ), - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES: ZorkGrandInquisitorLocationData( - game_state_trigger=((4241, 1),), - archipelago_id=LOCATION_OFFSET + 85, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE, - ), - ), - ZorkGrandInquisitorLocations.PERMASEAL: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "mt1g"),), - archipelago_id=LOCATION_OFFSET + 86, - region=ZorkGrandInquisitorRegions.MONASTERY, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.PLANETFALL: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pp1j"),), - archipelago_id=LOCATION_OFFSET + 87, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "te1g"),), - archipelago_id=LOCATION_OFFSET + 88, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL: ZorkGrandInquisitorLocationData( - game_state_trigger=((9404, 1),), - archipelago_id=LOCATION_OFFSET + 89, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER, - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT, - ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER, - ZorkGrandInquisitorItems.SPELL_NARWILE, - ), - ), - ZorkGrandInquisitorLocations.PROZORKED: ZorkGrandInquisitorLocationData( - game_state_trigger=((4115, 1),), - archipelago_id=LOCATION_OFFSET + 90, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.PROZORK_TABLET, - ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, - ), - ), - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG: ZorkGrandInquisitorLocationData( - game_state_trigger=((4512, 98),), - archipelago_id=LOCATION_OFFSET + 91, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS, - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV, - ZorkGrandInquisitorItems.HOTSPOT_MIRROR, - ), - ), - ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2h"),), - archipelago_id=LOCATION_OFFSET + 92, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 3),), - archipelago_id=LOCATION_OFFSET + 93, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 4),), - archipelago_id=LOCATION_OFFSET + 94, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED: ZorkGrandInquisitorLocationData( - game_state_trigger=((201, 1),), - archipelago_id=LOCATION_OFFSET + 95, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - ), - ZorkGrandInquisitorLocations.SOUVENIR: ZorkGrandInquisitorLocationData( - game_state_trigger=((13408, 1),), - archipelago_id=LOCATION_OFFSET + 96, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT, - ), - ), - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL: ZorkGrandInquisitorLocationData( - game_state_trigger=((9719, 1),), - archipelago_id=LOCATION_OFFSET + 97, - region=ZorkGrandInquisitorRegions.MONASTERY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, - ), - ), - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData( - game_state_trigger=((14511, 1), (14524, 5)), - archipelago_id=LOCATION_OFFSET + 98, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ), - ), - ZorkGrandInquisitorLocations.SUCKING_ROCKS: ZorkGrandInquisitorLocationData( - game_state_trigger=((12859, 1),), - archipelago_id=LOCATION_OFFSET + 99, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE, - ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT, - ), - ), - ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR: ZorkGrandInquisitorLocationData( - game_state_trigger=((10299, 1),), - archipelago_id=LOCATION_OFFSET + 100, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,), - ), - ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dv1h"),), - archipelago_id=LOCATION_OFFSET + 101, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS: ZorkGrandInquisitorLocationData( - game_state_trigger=((1311, 1), (1312, 1)), - archipelago_id=LOCATION_OFFSET + 102, - region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ), - ), - ZorkGrandInquisitorLocations.THATS_A_ROPE: ZorkGrandInquisitorLocationData( - game_state_trigger=((10486, 1),), - archipelago_id=LOCATION_OFFSET + 103, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, - ), - ), - ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS: ZorkGrandInquisitorLocationData( - game_state_trigger=((13805, 1),), - archipelago_id=LOCATION_OFFSET + 104, - region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - ), - ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tp1e"), (9, 83), (1011, 1)), - archipelago_id=LOCATION_OFFSET + 105, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorEvents.ROPE_GLORFABLE,), - ), - ZorkGrandInquisitorLocations.THATS_THE_SPIRIT: ZorkGrandInquisitorLocationData( - game_state_trigger=((10341, 95),), - archipelago_id=LOCATION_OFFSET + 106, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS,), - ), - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((9459, 1),), - archipelago_id=LOCATION_OFFSET + 107, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE: ZorkGrandInquisitorLocationData( - game_state_trigger=((9473, 1),), - archipelago_id=LOCATION_OFFSET + 108, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO: ZorkGrandInquisitorLocationData( - game_state_trigger=((9520, 1),), - archipelago_id=LOCATION_OFFSET + 109, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "me1j"),), - archipelago_id=LOCATION_OFFSET + 110, - region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND: ZorkGrandInquisitorLocationData( - game_state_trigger=((13167, 1),), - archipelago_id=LOCATION_OFFSET + 111, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SUBWAY_TOKEN, - ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT, - ), - ), - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "cd60"), (1524, 1)), - archipelago_id=LOCATION_OFFSET + 112, - region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.TOTEM_LUCY,), - ), - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED: ZorkGrandInquisitorLocationData( - game_state_trigger=((4219, 1),), - archipelago_id=LOCATION_OFFSET + 113, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HAMMER, - ZorkGrandInquisitorItems.SPELL_THROCK, - ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, - ), - ), - ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "th3z"),), - archipelago_id=LOCATION_OFFSET + 114, - region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,), - ), - ZorkGrandInquisitorLocations.TOTEMIZED_DAILY_BILLBOARD: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "px1h"),), - archipelago_id=LOCATION_OFFSET + 115, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "cd60"), (1520, 1)), - archipelago_id=LOCATION_OFFSET + 116, - region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.TOTEM_BROG,), - ), - ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS: ZorkGrandInquisitorLocationData( - game_state_trigger=((12926, 1),), - archipelago_id=LOCATION_OFFSET + 117, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_BEBURTT,), - ), - ZorkGrandInquisitorLocations.UP: ZorkGrandInquisitorLocationData( - game_state_trigger=((3619, 5200),), - archipelago_id=LOCATION_OFFSET + 118, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_LUCY, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ), - ), - ZorkGrandInquisitorLocations.USELESS_BUT_FUN: ZorkGrandInquisitorLocationData( - game_state_trigger=((14321, 1),), - archipelago_id=LOCATION_OFFSET + 119, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorItems.SPELL_GOLGATEM,), - ), - ZorkGrandInquisitorLocations.UUUUUP: ZorkGrandInquisitorLocationData( - game_state_trigger=((3619, 3500),), - archipelago_id=LOCATION_OFFSET + 120, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_GRIFF, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ), - ), - ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "uh1h"),), - archipelago_id=LOCATION_OFFSET + 121, - region=ZorkGrandInquisitorRegions.HADES_SHORE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO: ZorkGrandInquisitorLocationData( - game_state_trigger=((4034, 1),), - archipelago_id=LOCATION_OFFSET + 122, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR, - ZorkGrandInquisitorItems.MEAD_LIGHT, - ZorkGrandInquisitorItems.ZIMDOR_SCROLL, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH, - ), - ), - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE: ZorkGrandInquisitorLocationData( - game_state_trigger=((2461, 1),), - archipelago_id=LOCATION_OFFSET + 123, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_GRIFF, - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR, - ), - ), - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER: ZorkGrandInquisitorLocationData( - game_state_trigger=((15472, 1),), - archipelago_id=LOCATION_OFFSET + 124, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ), - ), - ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID: ZorkGrandInquisitorLocationData( - game_state_trigger=((10484, 1),), - archipelago_id=LOCATION_OFFSET + 125, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, - ), - ), - ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL: ZorkGrandInquisitorLocationData( - game_state_trigger=((4983, 1),), - archipelago_id=LOCATION_OFFSET + 126, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, - ZorkGrandInquisitorItems.SPELL_NARWILE, - ), - ), - ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dc10"), (1596, 1)), - archipelago_id=LOCATION_OFFSET + 127, - region=ZorkGrandInquisitorRegions.WALKING_CASTLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dm2g"),), - archipelago_id=LOCATION_OFFSET + 128, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_MIRROR,), - ), - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "dg4e"), (4266, 1), (9, 21), (4035, 1)), - archipelago_id=LOCATION_OFFSET + 129, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_HARRY, - ), - ), - ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER: ZorkGrandInquisitorLocationData( - game_state_trigger=((16405, 1),), - archipelago_id=LOCATION_OFFSET + 130, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.SPELL_REZROV,), - ), - ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS: ZorkGrandInquisitorLocationData( - game_state_trigger=((16342, 1),), - archipelago_id=LOCATION_OFFSET + 131, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE, - ), - ), - ZorkGrandInquisitorLocations.YOU_ONE_OF_THEM_AGITATORS_AINT_YA: ZorkGrandInquisitorLocationData( - game_state_trigger=((10586, 1),), - archipelago_id=LOCATION_OFFSET + 132, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY: ZorkGrandInquisitorLocationData( - game_state_trigger=((15151, 1),), - archipelago_id=LOCATION_OFFSET + 133, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH,), - ), - # Deathsanity - ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 1)), - archipelago_id=LOCATION_OFFSET + 200 + 0, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - ), - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 20)), - archipelago_id=LOCATION_OFFSET + 200 + 1, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE, - ), - ), - ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 21)), - archipelago_id=LOCATION_OFFSET + 200 + 2, - region=ZorkGrandInquisitorRegions.CROSSROADS, - tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - ), - ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 18)), - archipelago_id=LOCATION_OFFSET + 200 + 3, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, - ), - ), - ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 3)), - archipelago_id=LOCATION_OFFSET + 200 + 4, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - ), - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 37)), - archipelago_id=LOCATION_OFFSET + 200 + 5, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ), - ), - ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 23)), - archipelago_id=LOCATION_OFFSET + 200 + 6, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), - ), - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 29)), - archipelago_id=LOCATION_OFFSET + 200 + 7, - region=ZorkGrandInquisitorRegions.DM_LAIR, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE, - ), - ), - ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 30)), - archipelago_id=LOCATION_OFFSET + 200 + 8, - region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - ), - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 4)), - archipelago_id=LOCATION_OFFSET + 200 + 9, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.SPELL_IGRAM, - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, - ), - ), - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 11)), - archipelago_id=LOCATION_OFFSET + 200 + 10, - region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ), - ), - ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 34)), - archipelago_id=LOCATION_OFFSET + 200 + 11, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - requirements=( - ZorkGrandInquisitorItems.SPELL_THROCK, - ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS, - ), - ), - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, (9, 32, 33))), - archipelago_id=LOCATION_OFFSET + 200 + 12, - region=ZorkGrandInquisitorRegions.MONASTERY, - tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, - ), - ), - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, (5, 6, 7, 8, 13))), - archipelago_id=LOCATION_OFFSET + 200 + 13, - region=ZorkGrandInquisitorRegions.MONASTERY, - tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,), - ), - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 10)), - archipelago_id=LOCATION_OFFSET + 200 + 14, - region=ZorkGrandInquisitorRegions.HADES, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), - ), - ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, 19)), - archipelago_id=LOCATION_OFFSET + 200 + 15, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED,), - ), - # Events - ZorkGrandInquisitorEvents.CHARON_CALLED: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.HADES_SHORE, - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.CHARON_CALLED.value, - ), - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - requirements=( - ZorkGrandInquisitorItems.LANTERN, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, - ), - event_item_name=ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value, - ), - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ), - ZorkGrandInquisitorEvents.DAM_DESTROYED: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - requirements=( - ZorkGrandInquisitorItems.SPELL_REZROV, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ), - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.DM_LAIR, - requirements=( - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR, - ZorkGrandInquisitorItems.MEAD_LIGHT, - ZorkGrandInquisitorItems.ZIMDOR_SCROLL, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH, - ), - event_item_name=ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ), - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.DM_LAIR, - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, - ), - event_item_name=ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value, - ), - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ), - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS, - ), - event_item_name=ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ), - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - requirements=( - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS, - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV, - ZorkGrandInquisitorItems.HOTSPOT_MIRROR, - ), - event_item_name=ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ), - ZorkGrandInquisitorEvents.KNOWS_BEBURTT: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ), - ZorkGrandInquisitorEvents.KNOWS_OBIDIL: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ), - ZorkGrandInquisitorEvents.KNOWS_SNAVIG: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ), - ZorkGrandInquisitorEvents.KNOWS_YASTARD: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - requirements=( - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE, - ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS, - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB, - ZorkGrandInquisitorItems.MOSS_OF_MAREILON, - ZorkGrandInquisitorItems.MUG, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ), - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - event_item_name=ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE.value, - ), - ZorkGrandInquisitorEvents.ROPE_GLORFABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.CROSSROADS, - requirements=(ZorkGrandInquisitorItems.SPELL_GLORF,), - event_item_name=ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value, - ), - ZorkGrandInquisitorEvents.VICTORY: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.ENDGAME, - event_item_name=ZorkGrandInquisitorEvents.VICTORY.value, - ), - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, - requirements=( - (ZorkGrandInquisitorItems.TOTEM_GRIFF, ZorkGrandInquisitorItems.TOTEM_LUCY), - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, - ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR, - ), - event_item_name=ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ), - ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), - event_item_name=ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE.value, - ), - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.ZORK_ROCKS, - ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ), - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ), -} diff --git a/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py b/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py deleted file mode 100644 index ef6eacb78c..0000000000 --- a/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py +++ /dev/null @@ -1,200 +0,0 @@ -from typing import Dict, NamedTuple, Optional, Tuple - -from ..enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorLocations - - -class ZorkGrandInquisitorMissableLocationGrantConditionsData(NamedTuple): - location_condition: ZorkGrandInquisitorLocations - item_conditions: Optional[Tuple[ZorkGrandInquisitorItems, ...]] - - -missable_location_grant_conditions_data: Dict[ - ZorkGrandInquisitorLocations, ZorkGrandInquisitorMissableLocationGrantConditionsData -] = { - ZorkGrandInquisitorLocations.BOING_BOING_BOING: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.BONK: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.PROZORKED, - item_conditions=(ZorkGrandInquisitorItems.HAMMER,), - ) - , - ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ARREST_THE_VANDAL, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.MAGIC_FOREVER, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.A_SMALLWAY, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.THAR_SHE_BLOWS, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.CRISIS_AVERTED, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE, - item_conditions=(ZorkGrandInquisitorItems.SPELL_GOLGATEM,), - ) - , - ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=(ZorkGrandInquisitorItems.SPELL_IGRAM,), - ) - , - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.PROZORKED, - item_conditions=(ZorkGrandInquisitorItems.SPELL_THROCK,), - ) - , - ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,), - ) - , - ZorkGrandInquisitorLocations.MEAD_LIGHT: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=(ZorkGrandInquisitorItems.MEAD_LIGHT,), - ) - , - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.NO_AUTOGRAPHS: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.NO_BONDAGE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE, - item_conditions=(ZorkGrandInquisitorItems.ROPE,), - ) - , - ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.THATS_A_ROPE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=(ZorkGrandInquisitorItems.ROPE,), - ) - , - ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=(ZorkGrandInquisitorItems.SPELL_GLORF,), - ) - , - ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=(ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER,), - ) - , - ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO, - item_conditions=(ZorkGrandInquisitorItems.SWORD, ZorkGrandInquisitorItems.HOTSPOT_HARRY), - ) - , - ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=(ZorkGrandInquisitorItems.SPELL_REZROV,), - ) - , - ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE, - item_conditions=None, - ) - , -} diff --git a/worlds/zork_grand_inquisitor/data/region_data.py b/worlds/zork_grand_inquisitor/data/region_data.py deleted file mode 100644 index 1aed160f30..0000000000 --- a/worlds/zork_grand_inquisitor/data/region_data.py +++ /dev/null @@ -1,183 +0,0 @@ -from typing import Dict, NamedTuple, Optional, Tuple - -from ..enums import ZorkGrandInquisitorRegions - - -class ZorkGrandInquisitorRegionData(NamedTuple): - exits: Optional[Tuple[ZorkGrandInquisitorRegions, ...]] - - -region_data: Dict[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegionData] = { - ZorkGrandInquisitorRegions.CROSSROADS: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.GUE_TECH, - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.PORT_FOOZLE, - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.DM_LAIR: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.WALKING_CASTLE, - ZorkGrandInquisitorRegions.WHITE_HOUSE, - ) - ), - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, - ) - ), - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, - ZorkGrandInquisitorRegions.ENDGAME, - ) - ), - ZorkGrandInquisitorRegions.ENDGAME: ZorkGrandInquisitorRegionData(exits=None), - ZorkGrandInquisitorRegions.GUE_TECH: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - ) - ), - ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.GUE_TECH, - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - ) - ), - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.GUE_TECH, - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.HADES: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, - ZorkGrandInquisitorRegions.HADES_SHORE, - ) - ), - ZorkGrandInquisitorRegions.HADES_BEYOND_GATES: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, - ZorkGrandInquisitorRegions.HADES, - ) - ), - ZorkGrandInquisitorRegions.HADES_SHORE: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - ZorkGrandInquisitorRegions.HADES, - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, - ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.MENU: ZorkGrandInquisitorRegionData( - exits=(ZorkGrandInquisitorRegions.PORT_FOOZLE,) - ), - ZorkGrandInquisitorRegions.MONASTERY: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.MONASTERY, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, - ) - ), - ZorkGrandInquisitorRegions.PORT_FOOZLE: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, - ) - ), - ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP: ZorkGrandInquisitorRegionData( - exits=(ZorkGrandInquisitorRegions.PORT_FOOZLE,) - ), - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - ) - ), - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.ENDGAME, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, - ) - ), - ZorkGrandInquisitorRegions.SPELL_LAB: ZorkGrandInquisitorRegionData( - exits=(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,) - ), - ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, - ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.SPELL_LAB, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.CROSSROADS, - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - ) - ), - ZorkGrandInquisitorRegions.SUBWAY_MONASTERY: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.HADES_SHORE, - ZorkGrandInquisitorRegions.MONASTERY, - ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, - ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, - ) - ), - ZorkGrandInquisitorRegions.WALKING_CASTLE: ZorkGrandInquisitorRegionData( - exits=(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,) - ), - ZorkGrandInquisitorRegions.WHITE_HOUSE: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - ZorkGrandInquisitorRegions.ENDGAME, - ) - ), -} diff --git a/worlds/zork_grand_inquisitor/data_funcs.py b/worlds/zork_grand_inquisitor/data_funcs.py deleted file mode 100644 index 2a7bff1fbb..0000000000 --- a/worlds/zork_grand_inquisitor/data_funcs.py +++ /dev/null @@ -1,247 +0,0 @@ -from typing import Dict, List, Set, Tuple, Union - -from .data.entrance_rule_data import entrance_rule_data -from .data.item_data import item_data, ZorkGrandInquisitorItemData -from .data.location_data import location_data, ZorkGrandInquisitorLocationData - -from .enums import ( - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorGoals, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorLocations, - ZorkGrandInquisitorRegions, - ZorkGrandInquisitorTags, -) - - -def item_names_to_id() -> Dict[str, int]: - return {item.value: data.archipelago_id for item, data in item_data.items()} - - -def item_names_to_item() -> Dict[str, ZorkGrandInquisitorItems]: - return {item.value: item for item in item_data} - - -def location_names_to_id() -> Dict[str, int]: - return { - location.value: data.archipelago_id - for location, data in location_data.items() - if data.archipelago_id is not None - } - - -def location_names_to_location() -> Dict[str, ZorkGrandInquisitorLocations]: - return { - location.value: location - for location, data in location_data.items() - if data.archipelago_id is not None - } - - -def id_to_goals() -> Dict[int, ZorkGrandInquisitorGoals]: - return {goal.value: goal for goal in ZorkGrandInquisitorGoals} - - -def id_to_items() -> Dict[int, ZorkGrandInquisitorItems]: - return {data.archipelago_id: item for item, data in item_data.items()} - - -def id_to_locations() -> Dict[int, ZorkGrandInquisitorLocations]: - return { - data.archipelago_id: location - for location, data in location_data.items() - if data.archipelago_id is not None - } - - -def item_groups() -> Dict[str, List[str]]: - groups: Dict[str, List[str]] = dict() - - item: ZorkGrandInquisitorItems - data: ZorkGrandInquisitorItemData - for item, data in item_data.items(): - if data.tags is not None: - for tag in data.tags: - groups.setdefault(tag.value, list()).append(item.value) - - return {k: v for k, v in groups.items() if len(v)} - - -def items_with_tag(tag: ZorkGrandInquisitorTags) -> Set[ZorkGrandInquisitorItems]: - items: Set[ZorkGrandInquisitorItems] = set() - - item: ZorkGrandInquisitorItems - data: ZorkGrandInquisitorItemData - for item, data in item_data.items(): - if data.tags is not None and tag in data.tags: - items.add(item) - - return items - - -def game_id_to_items() -> Dict[int, ZorkGrandInquisitorItems]: - mapping: Dict[int, ZorkGrandInquisitorItems] = dict() - - item: ZorkGrandInquisitorItems - data: ZorkGrandInquisitorItemData - for item, data in item_data.items(): - if data.statemap_keys is not None: - for key in data.statemap_keys: - mapping[key] = item - - return mapping - - -def location_groups() -> Dict[str, List[str]]: - groups: Dict[str, List[str]] = dict() - - tag: ZorkGrandInquisitorTags - for tag in ZorkGrandInquisitorTags: - groups[tag.value] = list() - - location: ZorkGrandInquisitorLocations - data: ZorkGrandInquisitorLocationData - for location, data in location_data.items(): - if data.tags is not None: - for tag in data.tags: - groups[tag.value].append(location.value) - - return {k: v for k, v in groups.items() if len(v)} - - -def locations_by_region(include_deathsanity: bool = False) -> Dict[ - ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations] -]: - mapping: Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]] = dict() - - region: ZorkGrandInquisitorRegions - for region in ZorkGrandInquisitorRegions: - mapping[region] = list() - - location: ZorkGrandInquisitorLocations - data: ZorkGrandInquisitorLocationData - for location, data in location_data.items(): - if not include_deathsanity and ZorkGrandInquisitorTags.DEATHSANITY in ( - data.tags or tuple() - ): - continue - - mapping[data.region].append(location) - - return mapping - - -def locations_with_tag(tag: ZorkGrandInquisitorTags) -> Set[ZorkGrandInquisitorLocations]: - location: ZorkGrandInquisitorLocations - data: ZorkGrandInquisitorLocationData - - return {location for location, data in location_data.items() if data.tags is not None and tag in data.tags} - - -def location_access_rule_for(location: ZorkGrandInquisitorLocations, player: int) -> str: - data: ZorkGrandInquisitorLocationData = location_data[location] - - if data.requirements is None: - return "lambda state: True" - - lambda_string: str = "lambda state: " - - i: int - requirement: Union[ - Tuple[ - Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ], - ..., - ], - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems - ] - - for i, requirement in enumerate(data.requirements): - if isinstance(requirement, tuple): - lambda_string += "(" - - ii: int - sub_requirement: Union[ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems] - for ii, sub_requirement in enumerate(requirement): - lambda_string += f"state.has(\"{sub_requirement.value}\", {player})" - - if ii < len(requirement) - 1: - lambda_string += " or " - - lambda_string += ")" - else: - lambda_string += f"state.has(\"{requirement.value}\", {player})" - - if i < len(data.requirements) - 1: - lambda_string += " and " - - return lambda_string - - -def entrance_access_rule_for( - region_origin: ZorkGrandInquisitorRegions, - region_destination: ZorkGrandInquisitorRegions, - player: int -) -> str: - data: Union[ - Tuple[ - Tuple[ - Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorRegions, - ], - ..., - ], - ..., - ], - None, - ] = entrance_rule_data[(region_origin, region_destination)] - - if data is None: - return "lambda state: True" - - lambda_string: str = "lambda state: " - - i: int - requirement_group: Tuple[ - Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorRegions, - ], - ..., - ] - for i, requirement_group in enumerate(data): - lambda_string += "(" - - ii: int - requirement: Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorRegions, - ] - for ii, requirement in enumerate(requirement_group): - requirement_type: Union[ - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorRegions, - ] = type(requirement) - - if requirement_type in (ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems): - lambda_string += f"state.has(\"{requirement.value}\", {player})" - elif requirement_type == ZorkGrandInquisitorRegions: - lambda_string += f"state.can_reach(\"{requirement.value}\", \"Region\", {player})" - - if ii < len(requirement_group) - 1: - lambda_string += " and " - - lambda_string += ")" - - if i < len(data) - 1: - lambda_string += " or " - - return lambda_string diff --git a/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md b/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md deleted file mode 100644 index d5821914be..0000000000 --- a/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md +++ /dev/null @@ -1,102 +0,0 @@ -# Zork Grand Inquisitor - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure and export a -configuration file. - -## Is a tracker available for this game? - -Yes! You can download the latest PopTracker pack for Zork Grand Inquisitor [here](https://github.com/SerpentAI/ZorkGrandInquisitorAPTracker/releases/latest). - -## What does randomization do to this game? - -A majority of inventory items you can normally pick up are completely removed from the game (e.g. the lantern won't be -in the crate, the mead won't be at the fish market, etc.). Instead, these items will be distributed in the multiworld. -This means that you can expect to access areas and be in a position to solve certain puzzles in a completely different -order than you normally would. - -Subway, teleporter and totemizer destinations are initially locked and need to be unlocked by receiving the -corresponding item in the multiworld. This alone enables creative routing in a game that would otherwise be rather -linear. The Crossroads destination is always unlocked for both the subway and teleporter to prevent softlocks. Until you -receive your first totemizer destination, it will be locked to Newark, New Jersey. - -Important hotspots are also randomized. This means that you will be unable to interact with certain objects until you -receive the corresponding item in the multiworld. This can be a bit confusing at first, but it adds depth to the -randomization and makes the game more interesting to play. - -You can travel back to the surface without dying by looking inside the bucket. This will work as long as the rope is -still attached to the well. - -Attempting to cast VOXAM will teleport you back to the Crossroads. Fast Travel! - -## What item types are distributed in the multiworld? - -- Inventory items -- Pouch of Zorkmids -- Spells -- Totems -- Subway destinations -- Teleporter destinations -- Totemizer destinations -- Hotspots (with option to start with the items enabling them instead if you prefer not playing with the randomization - of hotspots) - -## When the player receives an item, what happens? - -- **Inventory items**: Directly added to the player's inventory. -- **Pouch of Zorkmids**: Appears on the inventory screen. The player can then pick up Zorkmid coins from it. -- **Spells**: Learned and directly added to the spell book. -- **Totems**: Appears on the inventory screen. -- **Subway destinations**: The destination button on the subway map becomes functional. -- **Teleporter destinations**: The destination can show up on the teleporter screen. -- **Totemizer destinations**: The destination button on the panel becomes functional. -- **Hotspots**: The hotspot becomes interactable. - -## What is considered a location check in Zork Grand Inquisitor? - -- Solving puzzles -- Accessing certain areas for the first time -- Triggering certain interactions, even if they aren't puzzles per se -- Dying in unique ways (Optional; Deathsanity option) - -## The location check names are fun but don't always convey well what's needed to unlock them. Is there a guide? - -Yes! You can find a complete guide for the location checks [here](https://gist.github.com/nbrochu/f7bed7a1fef4e2beb67ad6ddbf18b970). - -## What is the victory condition? - -Victory is achieved when the 3 artifacts of magic are retrieved and placed inside the walking castle. - -## Can I use the save system without a problem? - -Absolutely! The save system is fully supported (and its use is in fact strongly encouraged!). You can save and load your -game as you normally would and the client will automatically sync your items and hotspots with what you should have in -that game state. - -Depending on how your game progresses, there's a chance that certain location checks might become missable. This -presents an excellent opportunity to utilize the save system. Simply make it a habit to save before undertaking -irreversible actions, ensuring you can revert to a previous state if necessary. If you prefer not to depend on the save -system for accessing missable location checks, there's an option to automatically unlock them as they become -unavailable. - -## Unique Local Commands -The following commands are only available when using the Zork Grand Inquisitor Client to play the game with Archipelago. - -- `/zork` Attempts to attach to a running instance of Zork Grand Inquisitor. If successful, the client will then be able - to read and control the state of the game. -- `/brog` Lists received items for Brog. -- `/griff` Lists received items for Griff. -- `/lucy` Lists received items for Lucy. -- `/hotspots` Lists received hotspots. - -## Known issues - -- You will get a second rope right after using GLORF (one in your inventory and one on your cursor). This is a harmless - side effect that will go away after you store it in your inventory as duplicates are actively removed. -- After climbing up to the Monastery for the first time, a rope will forever remain in place in the vent. When you come - back to the Monastery, you will be able to climb up without needing to combine the sword and rope again. However, when - arriving at the top, you will receive a duplicate sword on a rope. This is a harmless side effect that will go away - after you store it in your inventory as duplicates are actively removed. -- Since the client is reading and manipulating the game's memory, rare game crashes can happen. If you encounter one, - simply restart the game, load your latest save and use the `/zork` command again in the client. Nothing will be lost. diff --git a/worlds/zork_grand_inquisitor/docs/setup_en.md b/worlds/zork_grand_inquisitor/docs/setup_en.md deleted file mode 100644 index f9078c6d39..0000000000 --- a/worlds/zork_grand_inquisitor/docs/setup_en.md +++ /dev/null @@ -1,42 +0,0 @@ -# Zork Grand Inquisitor Randomizer Setup Guide - -## Requirements - -- Windows OS (Hard required. Client is using memory reading / writing through Win32 API) -- A copy of Zork Grand Inquisitor. Only the GOG version is supported. The Steam version can work with some tinkering but - is not officially supported. -- ScummVM 2.7.1 64-bit (Important: Will not work with any other version. [Direct Download](https://downloads.scummvm.org/frs/scummvm/2.7.1/scummvm-2.7.1-win32-x86_64.zip)) -- Archipelago 0.4.4+ - -## Game Setup Instructions - -No game modding is required to play Zork Grand Inquisitor with Archipelago. The client does all the work by attaching to -the game process and reading and manipulating the game state in real-time. - -This being said, the game does need to be played through ScummVM 2.7.1, so some configuration is required around that. - -### GOG - -- Open the directory where you installed Zork Grand Inquisitor. You should see a `Launch Zork Grand Inquisitor` - shortcut. -- Open the `scummvm` directory. Delete the entire contents of that directory. -- Still inside the `scummvm` directory, unzip the contents of the ScummVM 2.7.1 zip file you downloaded earlier. -- Go back to the directory where you installed Zork Grand Inquisitor. -- Verify that the game still launches when using the `Launch Zork Grand Inquisitor` shortcut. -- Your game is now ready to be played with Archipelago. From now on, you can use the `Launch Zork Grand Inquisitor` - shortcut to launch the game. - -## Joining a Multiworld Game - -- Launch Zork Grand Inquisitor and start a new game. -- Open the Archipelago Launcher and click `Zork Grand Inquisitor Client`. -- Using the `Zork Grand Inquisitor Client`: - - Enter the room's hostname and port number (e.g. `archipelago.gg:54321`) in the top box and press `Connect`. - - Input your player name at the bottom when prompted and press `Enter`. - - You should now be connected to the Archipelago room. - - Next, input `/zork` at the bottom and press `Enter`. This will attach the client to the game process. - - If the command is successful, you are now ready to play Zork Grand Inquisitor with Archipelago. - -## Continuing a Multiworld Game - -- Perform the same steps as above, but instead of starting a new game, load your latest save file. diff --git a/worlds/zork_grand_inquisitor/enums.py b/worlds/zork_grand_inquisitor/enums.py deleted file mode 100644 index ecbb38a949..0000000000 --- a/worlds/zork_grand_inquisitor/enums.py +++ /dev/null @@ -1,350 +0,0 @@ -import enum - - -class ZorkGrandInquisitorEvents(enum.Enum): - CHARON_CALLED = "Event: Charon Called" - CIGAR_ACCESSIBLE = "Event: Cigar Accessible" - DALBOZ_LOCKER_OPENABLE = "Event: Dalboz Locker Openable" - DAM_DESTROYED = "Event: Dam Destroyed" - DOOR_DRANK_MEAD = "Event: Door Drank Mead" - DOOR_SMOKED_CIGAR = "Event: Door Smoked Cigar" - DUNCE_LOCKER_OPENABLE = "Event: Dunce Locker Openable" - HAS_REPAIRABLE_OBIDIL = "Event: Has Repairable OBIDIL" - HAS_REPAIRABLE_SNAVIG = "Event: Has Repairable SNAVIG" - KNOWS_BEBURTT = "Event: Knows BEBURTT" - KNOWS_OBIDIL = "Event: Knows OBIDIL" - KNOWS_SNAVIG = "Event: Knows SNAVIG" - KNOWS_YASTARD = "Event: Knows YASTARD" - LANTERN_DALBOZ_ACCESSIBLE = "Event: Lantern (Dalboz) Accessible" - ROPE_GLORFABLE = "Event: Rope GLORFable" - VICTORY = "Victory" - WHITE_HOUSE_LETTER_MAILABLE = "Event: White House Letter Mailable" - ZORKMID_BILL_ACCESSIBLE = "Event: 500 Zorkmid Bill Accessible" - ZORK_ROCKS_ACTIVATED = "Event: Zork Rocks Activated" - ZORK_ROCKS_SUCKABLE = "Event: Zork Rocks Suckable" - - -class ZorkGrandInquisitorGoals(enum.Enum): - THREE_ARTIFACTS = 0 - - -class ZorkGrandInquisitorItems(enum.Enum): - BROGS_BICKERING_TORCH = "Brog's Bickering Torch" - BROGS_FLICKERING_TORCH = "Brog's Flickering Torch" - BROGS_GRUE_EGG = "Brog's Grue Egg" - BROGS_PLANK = "Brog's Plank" - FILLER_FROBOZZ_ELECTRIC_GADGET = "Frobozz Electric Gadget" - FILLER_INQUISITION_PROPAGANDA_FLYER = "Inquisition Propaganda Flyer" - FILLER_MAGIC_CONTRABAND = "Magic Contraband" - FILLER_NONSENSICAL_INQUISITION_PAPERWORK = "Nonsensical Inquisition Paperwork" - FILLER_UNREADABLE_SPELL_SCROLL = "Unreadable Spell Scroll" - FLATHEADIA_FUDGE = "Flatheadia Fudge" - GRIFFS_AIR_PUMP = "Griff's Air Pump" - GRIFFS_DRAGON_TOOTH = "Griff's Dragon Tooth" - GRIFFS_INFLATABLE_RAFT = "Griff's Inflatable Raft" - GRIFFS_INFLATABLE_SEA_CAPTAIN = "Griff's Inflatable Sea Captain" - HAMMER = "Hammer" - HOTSPOT_666_MAILBOX = "Hotspot: 666 Mailbox" - HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS = "Hotspot: Alpine's Quandry Card Slots" - HOTSPOT_BLANK_SCROLL_BOX = "Hotspot: Blank Scroll Box" - HOTSPOT_BLINDS = "Hotspot: Blinds" - HOTSPOT_CANDY_MACHINE_BUTTONS = "Hotspot: Candy Machine Buttons" - HOTSPOT_CANDY_MACHINE_COIN_SLOT = "Hotspot: Candy Machine Coin Slot" - HOTSPOT_CANDY_MACHINE_VACUUM_SLOT = "Hotspot: Candy Machine Vacuum Slot" - HOTSPOT_CHANGE_MACHINE_SLOT = "Hotspot: Change Machine Slot" - HOTSPOT_CLOSET_DOOR = "Hotspot: Closet Door" - HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT = "Hotspot: Closing the Time Tunnels Hammer Slot" - HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER = "Hotspot: Closing the Time Tunnels Lever" - HOTSPOT_COOKING_POT = "Hotspot: Cooking Pot" - HOTSPOT_DENTED_LOCKER = "Hotspot: Dented Locker" - HOTSPOT_DIRT_MOUND = "Hotspot: Dirt Mound" - HOTSPOT_DOCK_WINCH = "Hotspot: Dock Winch" - HOTSPOT_DRAGON_CLAW = "Hotspot: Dragon Claw" - HOTSPOT_DRAGON_NOSTRILS = "Hotspot: Dragon Nostrils" - HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE = "Hotspot: Dungeon Master's Lair Entrance" - HOTSPOT_FLOOD_CONTROL_BUTTONS = "Hotspot: Flood Control Buttons" - HOTSPOT_FLOOD_CONTROL_DOORS = "Hotspot: Flood Control Doors" - HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT = "Hotspot: Frozen Treat Machine Coin Slot" - HOTSPOT_FROZEN_TREAT_MACHINE_DOORS = "Hotspot: Frozen Treat Machine Doors" - HOTSPOT_GLASS_CASE = "Hotspot: Glass Case" - HOTSPOT_GRAND_INQUISITOR_DOLL = "Hotspot: Grand Inquisitor Doll" - HOTSPOT_GUE_TECH_DOOR = "Hotspot: GUE Tech Door" - HOTSPOT_GUE_TECH_GRASS = "Hotspot: GUE Tech Grass" - HOTSPOT_HADES_PHONE_BUTTONS = "Hotspot: Hades Phone Buttons" - HOTSPOT_HADES_PHONE_RECEIVER = "Hotspot: Hades Phone Receiver" - HOTSPOT_HARRY = "Hotspot: Harry" - HOTSPOT_HARRYS_ASHTRAY = "Hotspot: Harry's Ashtray" - HOTSPOT_HARRYS_BIRD_BATH = "Hotspot: Harry's Bird Bath" - HOTSPOT_IN_MAGIC_WE_TRUST_DOOR = "Hotspot: In Magic We Trust Door" - HOTSPOT_JACKS_DOOR = "Hotspot: Jack's Door" - HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS = "Hotspot: Loudspeaker Volume Buttons" - HOTSPOT_MAILBOX_DOOR = "Hotspot: Mailbox Door" - HOTSPOT_MAILBOX_FLAG = "Hotspot: Mailbox Flag" - HOTSPOT_MIRROR = "Hotspot: Mirror" - HOTSPOT_MONASTERY_VENT = "Hotspot: Monastery Vent" - HOTSPOT_MOSSY_GRATE = "Hotspot: Mossy Grate" - HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR = "Hotspot: Port Foozle Past Tavern Door" - HOTSPOT_PURPLE_WORDS = "Hotspot: Purple Words" - HOTSPOT_QUELBEE_HIVE = "Hotspot: Quelbee Hive" - HOTSPOT_ROPE_BRIDGE = "Hotspot: Rope Bridge" - HOTSPOT_SKULL_CAGE = "Hotspot: Skull Cage" - HOTSPOT_SNAPDRAGON = "Hotspot: Snapdragon" - HOTSPOT_SODA_MACHINE_BUTTONS = "Hotspot: Soda Machine Buttons" - HOTSPOT_SODA_MACHINE_COIN_SLOT = "Hotspot: Soda Machine Coin Slot" - HOTSPOT_SOUVENIR_COIN_SLOT = "Hotspot: Souvenir Coin Slot" - HOTSPOT_SPELL_CHECKER = "Hotspot: Spell Checker" - HOTSPOT_SPELL_LAB_CHASM = "Hotspot: Spell Lab Chasm" - HOTSPOT_SPRING_MUSHROOM = "Hotspot: Spring Mushroom" - HOTSPOT_STUDENT_ID_MACHINE = "Hotspot: Student ID Machine" - HOTSPOT_SUBWAY_TOKEN_SLOT = "Hotspot: Subway Token Slot" - HOTSPOT_TAVERN_FLY = "Hotspot: Tavern Fly" - HOTSPOT_TOTEMIZER_SWITCH = "Hotspot: Totemizer Switch" - HOTSPOT_TOTEMIZER_WHEELS = "Hotspot: Totemizer Wheels" - HOTSPOT_WELL = "Hotspot: Well" - HUNGUS_LARD = "Hungus Lard" - JAR_OF_HOTBUGS = "Jar of Hotbugs" - LANTERN = "Lantern" - LARGE_TELEGRAPH_HAMMER = "Large Telegraph Hammer" - LUCYS_PLAYING_CARD_1 = "Lucy's Playing Card: 1 Pip" - LUCYS_PLAYING_CARD_2 = "Lucy's Playing Card: 2 Pips" - LUCYS_PLAYING_CARD_3 = "Lucy's Playing Card: 3 Pips" - LUCYS_PLAYING_CARD_4 = "Lucy's Playing Card: 4 Pips" - MAP = "Map" - MEAD_LIGHT = "Mead Light" - MOSS_OF_MAREILON = "Moss of Mareilon" - MUG = "Mug" - OLD_SCRATCH_CARD = "Old Scratch Card" - PERMA_SUCK_MACHINE = "Perma-Suck Machine" - PLASTIC_SIX_PACK_HOLDER = "Plastic Six-Pack Holder" - POUCH_OF_ZORKMIDS = "Pouch of Zorkmids" - PROZORK_TABLET = "Prozork Tablet" - QUELBEE_HONEYCOMB = "Quelbee Honeycomb" - ROPE = "Rope" - SCROLL_FRAGMENT_ANS = "Scroll Fragment: ANS" - SCROLL_FRAGMENT_GIV = "Scroll Fragment: GIV" - SHOVEL = "Shovel" - SNAPDRAGON = "Snapdragon" - SPELL_GLORF = "Spell: GLORF" - SPELL_GOLGATEM = "Spell: GOLGATEM" - SPELL_IGRAM = "Spell: IGRAM" - SPELL_KENDALL = "Spell: KENDALL" - SPELL_NARWILE = "Spell: NARWILE" - SPELL_REZROV = "Spell: REZROV" - SPELL_THROCK = "Spell: THROCK" - SPELL_VOXAM = "Spell: VOXAM" - STUDENT_ID = "Student ID" - SUBWAY_DESTINATION_FLOOD_CONTROL_DAM = "Subway Destination: Flood Control Dam #3" - SUBWAY_DESTINATION_HADES = "Subway Destination: Hades" - SUBWAY_DESTINATION_MONASTERY = "Subway Destination: Monastery" - SUBWAY_TOKEN = "Subway Token" - SWORD = "Sword" - TELEPORTER_DESTINATION_DM_LAIR = "Teleporter Destination: Dungeon Master's Lair" - TELEPORTER_DESTINATION_GUE_TECH = "Teleporter Destination: GUE Tech" - TELEPORTER_DESTINATION_HADES = "Teleporter Destination: Hades" - TELEPORTER_DESTINATION_MONASTERY = "Teleporter Destination: Monastery Station" - TELEPORTER_DESTINATION_SPELL_LAB = "Teleporter Destination: Spell Lab" - TOTEM_BROG = "Totem: Brog" - TOTEM_GRIFF = "Totem: Griff" - TOTEM_LUCY = "Totem: Lucy" - TOTEMIZER_DESTINATION_HALL_OF_INQUISITION = "Totemizer Destination: Hall of Inquisition" - TOTEMIZER_DESTINATION_INFINITY = "Totemizer Destination: Infinity" - TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL = "Totemizer Destination: Straight to Hell" - TOTEMIZER_DESTINATION_SURFACE_OF_MERZ = "Totemizer Destination: Surface of Merz" - ZIMDOR_SCROLL = "ZIMDOR Scroll" - ZORK_ROCKS = "Zork Rocks" - - -class ZorkGrandInquisitorLocations(enum.Enum): - ALARM_SYSTEM_IS_DOWN = "Alarm System is Down" - ARREST_THE_VANDAL = "Arrest the Vandal!" - ARTIFACTS_EXPLAINED = "Artifacts, Explained" - A_BIG_FAT_SASSY_2_HEADED_MONSTER = "A Big, Fat, SASSY 2-Headed Monster" - A_LETTER_FROM_THE_WHITE_HOUSE = "A Letter from the White House" - A_SMALLWAY = "A Smallway" - BEAUTIFUL_THATS_PLENTY = "Beautiful, That's Plenty!" - BEBURTT_DEMYSTIFIED = "BEBURTT, Demystified" - BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES = "Better Spell Manufacturing in Under 10 Minutes" - BOING_BOING_BOING = "Boing, Boing, Boing" - BONK = "Bonk!" - BRAVE_SOULS_WANTED = "Brave Souls Wanted" - BROG_DO_GOOD = "Brog Do Good!" - BROG_EAT_ROCKS = "Brog Eat Rocks" - BROG_KNOW_DUMB_THAT_DUMB = "Brog Know Dumb. That Dumb" - BROG_MUCH_BETTER_AT_THIS_GAME = "Brog Much Better at This Game" - CASTLE_WATCHING_A_FIELD_GUIDE = "Castle Watching: A Field Guide" - CAVES_NOTES = "Cave's Notes" - CLOSING_THE_TIME_TUNNELS = "Closing the Time Tunnels" - CRISIS_AVERTED = "Crisis Averted" - CUT_THAT_OUT_YOU_LITTLE_CREEP = "Cut That Out You Little Creep!" - DEATH_ARRESTED_WITH_JACK = "Death: Arrested With Jack" - DEATH_ATTACKED_THE_QUELBEES = "Death: Attacked the Quelbees" - DEATH_CLIMBED_OUT_OF_THE_WELL = "Death: Climbed Out of the Well" - DEATH_EATEN_BY_A_GRUE = "Death: Eaten by a Grue" - DEATH_JUMPED_IN_BOTTOMLESS_PIT = "Death: Jumped in Bottomless Pit" - DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER = "Death: Lost Game of Strip Grue, Fire, Water" - DEATH_LOST_SOUL_TO_OLD_SCRATCH = "Death: Lost Soul to Old Scratch" - DEATH_OUTSMARTED_BY_THE_QUELBEES = "Death: Outsmarted by the Quelbees" - DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD = "Death: Sliced up by the Invisible Guard" - DEATH_STEPPED_INTO_THE_INFINITE = "Death: Step Into the Infinite" - DEATH_SWALLOWED_BY_A_DRAGON = "Death: Swallowed by a Dragon" - DEATH_THROCKED_THE_GRASS = "Death: THROCKed the Grass" - DEATH_TOTEMIZED = "Death: Totemized?" - DEATH_TOTEMIZED_PERMANENTLY = "Death: Totemized... Permanently" - DEATH_YOURE_NOT_CHARON = "Death: You're Not Charon!?" - DEATH_ZORK_ROCKS_EXPLODED = "Death: Zork Rocks Exploded" - DENIED_BY_THE_LAKE_MONSTER = "Denied by the Lake Monster" - DESPERATELY_SEEKING_TUTOR = "Desperately Seeking Tutor" - DONT_EVEN_START_WITH_US_SPARKY = "Don't Even Start With Us, Sparky" - DOOOOOOWN = "Doooooown" - DOWN = "Down" - DRAGON_ARCHIPELAGO_TIME_TUNNEL = "Dragon Archipelago Time Tunnel" - DUNCE_LOCKER = "Dunce Locker" - EGGPLANTS = "Eggplants" - ELSEWHERE = "Elsewhere" - EMERGENCY_MAGICATRONIC_MESSAGE = "Emergency Magicatronic Message" - ENJOY_YOUR_TRIP = "Enjoy Your Trip!" - FAT_LOT_OF_GOOD_THATLL_DO_YA = "Fat Lot of Good That'll Do Ya" - FIRE_FIRE = "Fire! Fire!" - FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE = "Flood Control Dam #3: The Not Remotely Boring Tale" - FLYING_SNAPDRAGON = "Flying Snapdragon" - FROBUARY_3_UNDERGROUNDHOG_DAY = "Frobruary 3 - Undergroundhog Day" - GETTING_SOME_CHANGE = "Getting Some Change" - GO_AWAY = "GO AWAY!" - GUE_TECH_DEANS_LIST = "GUE Tech Dean's List" - GUE_TECH_ENTRANCE_EXAM = "GUE Tech Entrance Exam" - GUE_TECH_HEALTH_MEMO = "GUE Tech Health Memo" - GUE_TECH_MAGEMEISTERS = "GUE Tech Magemeisters" - HAVE_A_HELL_OF_A_DAY = "Have a Hell of a Day!" - HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING = "Hello, This is Shona from Gurth Publishing" - HELP_ME_CANT_BREATHE = "Help... Me. Can't... Breathe" - HEY_FREE_DIRT = "Hey, Free Dirt!" - HI_MY_NAME_IS_DOUG = "Hi, My Name is Doug" - HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING = "Hmmm. Informative. Yet Deeply Disturbing" - HOLD_ON_FOR_AN_IMPORTANT_MESSAGE = "Hold on for an Important Message" - HOW_TO_HYPNOTIZE_YOURSELF = "How to Hypnotize Yourself" - HOW_TO_WIN_AT_DOUBLE_FANUCCI = "How to Win at Double Fanucci" - IMBUE_BEBURTT = "Imbue BEBURTT" - IM_COMPLETELY_NUDE = "I'm Completely Nude" - INTO_THE_FOLIAGE = "Into the Foliage" - INVISIBLE_FLOWERS = "Invisible Flowers" - IN_CASE_OF_ADVENTURE = "In Case of Adventure, Break Glass!" - IN_MAGIC_WE_TRUST = "In Magic We Trust" - ITS_ONE_OF_THOSE_ADVENTURERS_AGAIN = "It's One of Those Adventurers Again..." - I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY = "I Don't Think You Would've Wanted That to Work Anyway" - I_DONT_WANT_NO_TROUBLE = "I Don't Want No Trouble!" - I_HOPE_YOU_CAN_CLIMB_UP_THERE = "I Hope You Can Climb Up There With All This Junk" - I_LIKE_YOUR_STYLE = "I Like Your Style!" - I_SPIT_ON_YOUR_FILTHY_COINAGE = "I Spit on Your Filthy Coinage" - LIT_SUNFLOWERS = "Lit Sunflowers" - MAGIC_FOREVER = "Magic Forever!" - MAILED_IT_TO_HELL = "Mailed it to Hell" - MAKE_LOVE_NOT_WAR = "Make Love, Not War" - MEAD_LIGHT = "Mead Light?" - MIKES_PANTS = "Mike's Pants" - MUSHROOM_HAMMERED = "Mushroom, Hammered" - NATIONAL_TREASURE = "300 Year Old National Treasure" - NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR = "Natural and Supernatural Creatures of Quendor" - NOOOOOOOOOOOOO = "NOOOOOOOOOOOOO!" - NOTHIN_LIKE_A_GOOD_STOGIE = "Nothin' Like a Good Stogie" - NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT = "Now You Look Like Us, Which is an Improvement" - NO_AUTOGRAPHS = "No Autographs" - NO_BONDAGE = "No Bondage" - OBIDIL_DRIED_UP = "OBIDIL, Dried Up" - OH_DEAR_GOD_ITS_A_DRAGON = "Oh Dear God, It's a Dragon!" - OH_VERY_FUNNY_GUYS = "Oh, Very Funny Guys" - OH_WOW_TALK_ABOUT_DEJA_VU = "Oh, Wow! Talk About Deja Vu" - OLD_SCRATCH_WINNER = "Old Scratch Winner!" - ONLY_YOU_CAN_PREVENT_FOOZLE_FIRES = "Only You Can Prevent Foozle Fires" - OPEN_THE_GATES_OF_HELL = "Open the Gates of Hell" - OUTSMART_THE_QUELBEES = "Outsmart the Quelbees" - PERMASEAL = "PermaSeal" - PLANETFALL = "Planetfall" - PLEASE_DONT_THROCK_THE_GRASS = "Please Don't THROCK the Grass" - PORT_FOOZLE_TIME_TUNNEL = "Port Foozle Time Tunnel" - PROZORKED = "Prozorked" - REASSEMBLE_SNAVIG = "Reassemble SNAVIG" - RESTOCKED_ON_GRUESDAY = "Restocked on Gruesday" - RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE = "Right. Hello. Yes. Uh, This is Sneffle" - RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE = "Right. Uh, Sorry. It's Me Again. Sneffle" - SNAVIG_REPAIRED = "SNAVIG, Repaired" - SOUVENIR = "Souvenir" - STRAIGHT_TO_HELL = "Straight to Hell" - STRIP_GRUE_FIRE_WATER = "Strip Grue, Fire, Water" - SUCKING_ROCKS = "Sucking Rocks" - TALK_TO_ME_GRAND_INQUISITOR = "Talk to Me Grand Inquisitor" - TAMING_YOUR_SNAPDRAGON = "Taming Your Snapdragon" - THAR_SHE_BLOWS = "Thar She Blows!" - THATS_A_ROPE = "That's a Rope" - THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS = "That's it! Just Keep Hitting Those Buttons" - THATS_STILL_A_ROPE = "That's Still a Rope" - THATS_THE_SPIRIT = "That's the Spirit!" - THE_ALCHEMICAL_DEBACLE = "The Alchemical Debacle" - THE_ENDLESS_FIRE = "The Endless Fire" - THE_FLATHEADIAN_FUDGE_FIASCO = "The Flatheadian Fudge Fiasco" - THE_PERILS_OF_MAGIC = "The Perils of Magic" - THE_UNDERGROUND_UNDERGROUND = "The Underground Underground" - THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE = "This Doesn't Look Anything Like the Brochure" - THROCKED_MUSHROOM_HAMMERED = "THROCKed Mushroom, Hammered" - TIME_TRAVEL_FOR_DUMMIES = "Time Travel for Dummies" - TOTEMIZED_DAILY_BILLBOARD = "Totemized Daily Billboard Functioning Correctly" - UH_OH_BROG_CANT_SWIM = "Uh-Oh. Brog Can't Swim" - UMBRELLA_FLOWERS = "Umbrella Flowers" - UP = "Up" - USELESS_BUT_FUN = "Useless, But Fun" - UUUUUP = "Uuuuup" - VOYAGE_OF_CAPTAIN_ZAHAB = "Voyage of Captain Zahab" - WANT_SOME_RYE_COURSE_YA_DO = "Want Some Rye? Course Ya Do!" - WE_DONT_SERVE_YOUR_KIND_HERE = "We Don't Serve Your Kind Here" - WE_GOT_A_HIGH_ROLLER = "We Got a High Roller!" - WHAT_ARE_YOU_STUPID = "What Are You, Stupid?" - WHITE_HOUSE_TIME_TUNNEL = "White House Time Tunnel" - WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE = "Wow! I've Never Gone Inside Him Before!" - YAD_GOHDNUORGREDNU_3_YRAUBORF = "yaD gohdnuorgrednU - 3 yrauborF" - YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY = "Your Puny Weapons Don't Phase Me, Baby!" - YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER = "You Don't Go Messing With a Man's Zipper" - YOU_GAINED_86_EXPERIENCE_POINTS = "You Gained 86 Experience Points" - YOU_ONE_OF_THEM_AGITATORS_AINT_YA = "You One of Them Agitators, Ain't Ya?" - YOU_WANT_A_PIECE_OF_ME_DOCK_BOY = "You Want a Piece of Me, Dock Boy? or Girl" - - -class ZorkGrandInquisitorRegions(enum.Enum): - CROSSROADS = "Crossroads" - DM_LAIR = "Dungeon Master's Lair" - DM_LAIR_INTERIOR = "Dungeon Master's Lair - Interior" - DRAGON_ARCHIPELAGO = "Dragon Archipelago" - DRAGON_ARCHIPELAGO_DRAGON = "Dragon Archipelago - Dragon" - ENDGAME = "Endgame" - GUE_TECH = "GUE Tech" - GUE_TECH_HALLWAY = "GUE Tech - Hallway" - GUE_TECH_OUTSIDE = "GUE Tech - Outside" - HADES = "Hades" - HADES_BEYOND_GATES = "Hades - Beyond Gates" - HADES_SHORE = "Hades - Shore" - MENU = "Menu" - MONASTERY = "Monastery" - MONASTERY_EXHIBIT = "Monastery - Exhibit" - PORT_FOOZLE = "Port Foozle" - PORT_FOOZLE_JACKS_SHOP = "Port Foozle - Jack's Shop" - PORT_FOOZLE_PAST = "Port Foozle Past" - PORT_FOOZLE_PAST_TAVERN = "Port Foozle Past - Tavern" - SPELL_LAB = "Spell Lab" - SPELL_LAB_BRIDGE = "Spell Lab - Bridge" - SUBWAY_CROSSROADS = "Subway Platform - Crossroads" - SUBWAY_FLOOD_CONTROL_DAM = "Subway Platform - Flood Control Dam #3" - SUBWAY_MONASTERY = "Subway Platform - Monastery" - WALKING_CASTLE = "Walking Castle" - WHITE_HOUSE = "White House" - - -class ZorkGrandInquisitorTags(enum.Enum): - CORE = "Core" - DEATHSANITY = "Deathsanity" - FILLER = "Filler" - HOTSPOT = "Hotspot" - INVENTORY_ITEM = "Inventory Item" - MISSABLE = "Missable" - SPELL = "Spell" - SUBWAY_DESTINATION = "Subway Destination" - TELEPORTER_DESTINATION = "Teleporter Destination" - TOTEMIZER_DESTINATION = "Totemizer Destination" - TOTEM = "Totem" diff --git a/worlds/zork_grand_inquisitor/game_controller.py b/worlds/zork_grand_inquisitor/game_controller.py deleted file mode 100644 index 7a60a14608..0000000000 --- a/worlds/zork_grand_inquisitor/game_controller.py +++ /dev/null @@ -1,1388 +0,0 @@ -import collections -import functools -import logging - -from typing import Dict, Optional, Set, Tuple, Union - -from .data.item_data import item_data, ZorkGrandInquisitorItemData -from .data.location_data import location_data, ZorkGrandInquisitorLocationData - -from .data.missable_location_grant_conditions_data import ( - missable_location_grant_conditions_data, - ZorkGrandInquisitorMissableLocationGrantConditionsData, -) - -from .data_funcs import game_id_to_items, items_with_tag, locations_with_tag - -from .enums import ( - ZorkGrandInquisitorGoals, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorLocations, - ZorkGrandInquisitorTags, -) - -from .game_state_manager import GameStateManager - - -class GameController: - logger: Optional[logging.Logger] - - game_state_manager: GameStateManager - - received_items: Set[ZorkGrandInquisitorItems] - completed_locations: Set[ZorkGrandInquisitorLocations] - - completed_locations_queue: collections.deque - received_items_queue: collections.deque - - all_hotspot_items: Set[ZorkGrandInquisitorItems] - - game_id_to_items: Dict[int, ZorkGrandInquisitorItems] - - possible_inventory_items: Set[ZorkGrandInquisitorItems] - - available_inventory_slots: Set[int] - - goal_completed: bool - - option_goal: Optional[ZorkGrandInquisitorGoals] - option_deathsanity: Optional[bool] - option_grant_missable_location_checks: Optional[bool] - - def __init__(self, logger=None) -> None: - self.logger = logger - - self.game_state_manager = GameStateManager() - - self.received_items = set() - self.completed_locations = set() - - self.completed_locations_queue = collections.deque() - self.received_items_queue = collections.deque() - - self.all_hotspot_items = ( - items_with_tag(ZorkGrandInquisitorTags.HOTSPOT) - | items_with_tag(ZorkGrandInquisitorTags.SUBWAY_DESTINATION) - | items_with_tag(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION) - ) - - self.game_id_to_items = game_id_to_items() - - self.possible_inventory_items = ( - items_with_tag(ZorkGrandInquisitorTags.INVENTORY_ITEM) - | items_with_tag(ZorkGrandInquisitorTags.SPELL) - | items_with_tag(ZorkGrandInquisitorTags.TOTEM) - ) - - self.available_inventory_slots = set() - - self.goal_completed = False - - self.option_goal = None - self.option_deathsanity = None - self.option_grant_missable_location_checks = None - - @functools.cached_property - def brog_items(self) -> Set[ZorkGrandInquisitorItems]: - return { - ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.BROGS_PLANK, - } - - @functools.cached_property - def griff_items(self) -> Set[ZorkGrandInquisitorItems]: - return { - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - } - - @functools.cached_property - def lucy_items(self) -> Set[ZorkGrandInquisitorItems]: - return { - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - } - - @property - def totem_items(self) -> Set[ZorkGrandInquisitorItems]: - return self.brog_items | self.griff_items | self.lucy_items - - @functools.cached_property - def missable_locations(self) -> Set[ZorkGrandInquisitorLocations]: - return locations_with_tag(ZorkGrandInquisitorTags.MISSABLE) - - def log(self, message) -> None: - if self.logger: - self.logger.info(message) - - def log_debug(self, message) -> None: - if self.logger: - self.logger.debug(message) - - def open_process_handle(self) -> bool: - return self.game_state_manager.open_process_handle() - - def close_process_handle(self) -> bool: - return self.game_state_manager.close_process_handle() - - def is_process_running(self) -> bool: - return self.game_state_manager.is_process_running - - def list_received_brog_items(self) -> None: - self.log("Received Brog Items:") - - self._process_received_items() - received_brog_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.brog_items - - if not len(received_brog_items): - self.log(" Nothing") - return - - for item in sorted(i.value for i in received_brog_items): - self.log(f" {item}") - - def list_received_griff_items(self) -> None: - self.log("Received Griff Items:") - - self._process_received_items() - received_griff_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.griff_items - - if not len(received_griff_items): - self.log(" Nothing") - return - - for item in sorted(i.value for i in received_griff_items): - self.log(f" {item}") - - def list_received_lucy_items(self) -> None: - self.log("Received Lucy Items:") - - self._process_received_items() - received_lucy_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.lucy_items - - if not len(received_lucy_items): - self.log(" Nothing") - return - - for item in sorted(i.value for i in received_lucy_items): - self.log(f" {item}") - - def list_received_hotspots(self) -> None: - self.log("Received Hotspots:") - - self._process_received_items() - - hotspot_items: Set[ZorkGrandInquisitorItems] = items_with_tag(ZorkGrandInquisitorTags.HOTSPOT) - received_hotspots: Set[ZorkGrandInquisitorItems] = self.received_items & hotspot_items - - if not len(received_hotspots): - self.log(" Nothing") - return - - for item in sorted(i.value for i in received_hotspots): - self.log(f" {item}") - - def update(self) -> None: - if self.game_state_manager.is_process_still_running(): - try: - self.game_state_manager.refresh_game_location() - - self._apply_permanent_game_state() - self._apply_conditional_game_state() - - self._apply_permanent_game_flags() - - self._check_for_completed_locations() - - if self.option_grant_missable_location_checks: - self._check_for_missable_locations_to_grant() - - self._process_received_items() - - self._manage_hotspots() - self._manage_items() - - self._apply_conditional_teleports() - - self._check_for_victory() - except Exception as e: - self.log_debug(e) - - def _apply_permanent_game_state(self) -> None: - self._write_game_state_value_for(10934, 1) # Rope Taken - self._write_game_state_value_for(10418, 1) # Mead Light Taken - self._write_game_state_value_for(10275, 0) # Lantern in Crate - self._write_game_state_value_for(13929, 1) # Great Underground Door Open - self._write_game_state_value_for(13968, 1) # Subway Token Taken - self._write_game_state_value_for(12930, 1) # Hammer Taken - self._write_game_state_value_for(12935, 1) # Griff Totem Taken - self._write_game_state_value_for(12948, 1) # ZIMDOR Scroll Taken - self._write_game_state_value_for(4058, 1) # Shovel Taken - self._write_game_state_value_for(4059, 1) # THROCK Scroll Taken - self._write_game_state_value_for(11758, 1) # KENDALL Scroll Taken - self._write_game_state_value_for(16959, 1) # Old Scratch Card Taken - self._write_game_state_value_for(12840, 0) # Zork Rocks in Perma-Suck Machine - self._write_game_state_value_for(11886, 1) # Student ID Taken - self._write_game_state_value_for(16279, 1) # Prozork Tablet Taken - self._write_game_state_value_for(13260, 1) # GOLGATEM Scroll Taken - self._write_game_state_value_for(4834, 1) # Flatheadia Fudge Taken - self._write_game_state_value_for(4746, 1) # Jar of Hotbugs Taken - self._write_game_state_value_for(4755, 1) # Hungus Lard Taken - self._write_game_state_value_for(4758, 1) # Mug Taken - self._write_game_state_value_for(3716, 1) # NARWILE Scroll Taken - self._write_game_state_value_for(17147, 1) # Lucy Totem Taken - self._write_game_state_value_for(9818, 1) # Middle Telegraph Hammer Taken - self._write_game_state_value_for(3766, 0) # ANS Scroll in Window - self._write_game_state_value_for(4980, 0) # ANS Scroll in Window - self._write_game_state_value_for(3768, 0) # GIV Scroll in Window - self._write_game_state_value_for(4978, 0) # GIV Scroll in Window - self._write_game_state_value_for(3765, 0) # SNA Scroll in Window - self._write_game_state_value_for(4979, 0) # SNA Scroll in Window - self._write_game_state_value_for(3767, 0) # VIG Scroll in Window - self._write_game_state_value_for(4977, 0) # VIG Scroll in Window - self._write_game_state_value_for(15065, 1) # Brog's Bickering Torch Taken - self._write_game_state_value_for(15088, 1) # Brog's Flickering Torch Taken - self._write_game_state_value_for(2628, 4) # Brog's Grue Eggs Taken - self._write_game_state_value_for(2971, 1) # Brog's Plank Taken - self._write_game_state_value_for(1340, 1) # Griff's Inflatable Sea Captain Taken - self._write_game_state_value_for(1341, 1) # Griff's Inflatable Raft Taken - self._write_game_state_value_for(1477, 1) # Griff's Air Pump Taken - self._write_game_state_value_for(1814, 1) # Griff's Dragon Tooth Taken - self._write_game_state_value_for(15403, 0) # Lucy's Cards Taken - self._write_game_state_value_for(15404, 1) # Lucy's Cards Taken - self._write_game_state_value_for(15405, 4) # Lucy's Cards Taken - self._write_game_state_value_for(5222, 1) # User Has Spell Book - self._write_game_state_value_for(13930, 1) # Skip Well Cutscenes - self._write_game_state_value_for(19057, 1) # Skip Well Cutscenes - self._write_game_state_value_for(13934, 1) # Skip Well Cutscenes - self._write_game_state_value_for(13935, 1) # Skip Well Cutscenes - self._write_game_state_value_for(13384, 1) # Skip Meanwhile... Cutscene - self._write_game_state_value_for(8620, 1) # First Coin Paid to Charon - self._write_game_state_value_for(8731, 1) # First Coin Paid to Charon - - def _apply_conditional_game_state(self): - # Can teleport to Dungeon Master's Lair - if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR): - self._write_game_state_value_for(2203, 1) - else: - self._write_game_state_value_for(2203, 0) - - # Can teleport to GUE Tech - if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH): - self._write_game_state_value_for(7132, 1) - else: - self._write_game_state_value_for(7132, 0) - - # Can Teleport to Spell Lab - if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB): - self._write_game_state_value_for(16545, 1) - else: - self._write_game_state_value_for(16545, 0) - - # Can Teleport to Hades - if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES): - self._write_game_state_value_for(7119, 1) - else: - self._write_game_state_value_for(7119, 0) - - # Can Teleport to Monastery Station - if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY): - self._write_game_state_value_for(7148, 1) - else: - self._write_game_state_value_for(7148, 0) - - # Initial Totemizer Destination - should_force_initial_totemizer_destination: bool = True - - if self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ): - should_force_initial_totemizer_destination = False - - if should_force_initial_totemizer_destination: - self._write_game_state_value_for(9617, 2) - - # Pouch of Zorkmids - if self._player_has(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS): - self._write_game_state_value_for(5827, 1) - else: - self._write_game_state_value_for(5827, 0) - - # Brog Torches - if self._player_is_brog() and self._player_has(ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH): - self._write_game_state_value_for(10999, 1) - else: - self._write_game_state_value_for(10999, 0) - - if self._player_is_brog() and self._player_has(ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH): - self._write_game_state_value_for(10998, 1) - else: - self._write_game_state_value_for(10998, 0) - - # Monastery Rope - if ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE in self.completed_locations: - self._write_game_state_value_for(9637, 1) - - def _apply_permanent_game_flags(self) -> None: - self._write_game_flags_value_for(9437, 2) # Monastery Exhibit Door to Outside - self._write_game_flags_value_for(3074, 2) # White House Door - self._write_game_flags_value_for(13005, 2) # Map - self._write_game_flags_value_for(13006, 2) # Sword - self._write_game_flags_value_for(13007, 2) # Sword - self._write_game_flags_value_for(13389, 2) # Moss of Mareilon - self._write_game_flags_value_for(4301, 2) # Quelbee Honeycomb - self._write_game_flags_value_for(12895, 2) # Change Machine Money - self._write_game_flags_value_for(4150, 2) # Prozorked Snapdragon - self._write_game_flags_value_for(13413, 2) # Letter Opener - self._write_game_flags_value_for(15403, 2) # Lucy's Cards - - def _check_for_completed_locations(self) -> None: - location: ZorkGrandInquisitorLocations - data: ZorkGrandInquisitorLocationData - for location, data in location_data.items(): - if location in self.completed_locations or not isinstance( - location, ZorkGrandInquisitorLocations - ): - continue - - is_location_completed: bool = True - - trigger: [Union[str, int]] - value: Union[str, int, Tuple[int, ...]] - for trigger, value in data.game_state_trigger: - if trigger == "location": - if not self._player_is_at(value): - is_location_completed = False - break - elif isinstance(trigger, int): - if isinstance(value, int): - if self._read_game_state_value_for(trigger) != value: - is_location_completed = False - break - elif isinstance(value, tuple): - if self._read_game_state_value_for(trigger) not in value: - is_location_completed = False - break - else: - is_location_completed = False - break - else: - is_location_completed = False - break - - if is_location_completed: - self.completed_locations.add(location) - self.completed_locations_queue.append(location) - - def _check_for_missable_locations_to_grant(self) -> None: - missable_location: ZorkGrandInquisitorLocations - for missable_location in self.missable_locations: - if missable_location in self.completed_locations: - continue - - data: ZorkGrandInquisitorLocationData = location_data[missable_location] - - if ZorkGrandInquisitorTags.DEATHSANITY in data.tags and not self.option_deathsanity: - continue - - condition_data: ZorkGrandInquisitorMissableLocationGrantConditionsData = ( - missable_location_grant_conditions_data.get(missable_location) - ) - - if condition_data is None: - self.log_debug(f"Missable Location {missable_location.value} has no grant conditions") - continue - - if condition_data.location_condition in self.completed_locations: - grant_location: bool = True - - item: ZorkGrandInquisitorItems - for item in condition_data.item_conditions or tuple(): - if self._player_doesnt_have(item): - grant_location = False - break - - if grant_location: - self.completed_locations_queue.append(missable_location) - - def _process_received_items(self) -> None: - while len(self.received_items_queue) > 0: - item: ZorkGrandInquisitorItems = self.received_items_queue.popleft() - data: ZorkGrandInquisitorItemData = item_data[item] - - if ZorkGrandInquisitorTags.FILLER in data.tags: - continue - - self.received_items.add(item) - - def _manage_hotspots(self) -> None: - hotspot_item: ZorkGrandInquisitorItems - for hotspot_item in self.all_hotspot_items: - data: ZorkGrandInquisitorItemData = item_data[hotspot_item] - - if hotspot_item not in self.received_items: - key: int - for key in data.statemap_keys: - self._write_game_flags_value_for(key, 2) - else: - if hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX: - if self.game_state_manager.game_location == "hp5g": - if self._read_game_state_value_for(9113) == 0: - self._write_game_flags_value_for(9116, 0) - else: - self._write_game_flags_value_for(9116, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS: - if self.game_state_manager.game_location == "qb2g": - if self._read_game_state_value_for(15433) == 0: - self._write_game_flags_value_for(15434, 0) - else: - self._write_game_flags_value_for(15434, 2) - - if self._read_game_state_value_for(15435) == 0: - self._write_game_flags_value_for(15436, 0) - else: - self._write_game_flags_value_for(15436, 2) - - if self._read_game_state_value_for(15437) == 0: - self._write_game_flags_value_for(15438, 0) - else: - self._write_game_flags_value_for(15438, 2) - - if self._read_game_state_value_for(15439) == 0: - self._write_game_flags_value_for(15440, 0) - else: - self._write_game_flags_value_for(15440, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX: - if self.game_state_manager.game_location == "tp2g": - if self._read_game_state_value_for(12095) == 1: - self._write_game_flags_value_for(9115, 2) - else: - self._write_game_flags_value_for(9115, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_BLINDS: - if self.game_state_manager.game_location == "dv1e": - if self._read_game_state_value_for(4743) == 0: - self._write_game_flags_value_for(4799, 0) - else: - self._write_game_flags_value_for(4799, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS: - if self.game_state_manager.game_location == "tr5g": - key: int - for key in data.statemap_keys: - self._write_game_flags_value_for(key, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT: - if self.game_state_manager.game_location == "tr5g": - self._write_game_flags_value_for(12702, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT: - if self.game_state_manager.game_location == "tr5m": - self._write_game_flags_value_for(12909, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT: - if self.game_state_manager.game_location == "tr5j": - if self._read_game_state_value_for(12892) == 0: - self._write_game_flags_value_for(12900, 0) - else: - self._write_game_flags_value_for(12900, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR: - if self.game_state_manager.game_location == "dw1e": - if self._read_game_state_value_for(4983) == 0: - self._write_game_flags_value_for(5010, 0) - else: - self._write_game_flags_value_for(5010, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT: - if self.game_state_manager.game_location == "me2j": - if self._read_game_state_value_for(9491) == 2: - self._write_game_flags_value_for(9539, 0) - else: - self._write_game_flags_value_for(9539, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER: - if self.game_state_manager.game_location == "me2j": - if self._read_game_state_value_for(9546) == 2 or self._read_game_state_value_for(9419) == 1: - self._write_game_flags_value_for(19712, 2) - else: - self._write_game_flags_value_for(19712, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT: - if self.game_state_manager.game_location == "sg1f": - self._write_game_flags_value_for(2586, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER: - if self.game_state_manager.game_location == "th3j": - five_is_open: bool = self._read_game_state_value_for(11847) == 1 - six_is_open: bool = self._read_game_state_value_for(11840) == 1 - seven_is_open: bool = self._read_game_state_value_for(11841) == 1 - eight_is_open: bool = self._read_game_state_value_for(11848) == 1 - - rocks_in_six: bool = self._read_game_state_value_for(11769) == 1 - six_blasted: bool = self._read_game_state_value_for(11770) == 1 - - if five_is_open or six_is_open or seven_is_open or eight_is_open or rocks_in_six or six_blasted: - self._write_game_flags_value_for(11878, 2) - else: - self._write_game_flags_value_for(11878, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND: - if self.game_state_manager.game_location == "te5e": - if self._read_game_state_value_for(11747) == 0: - self._write_game_flags_value_for(11751, 0) - else: - self._write_game_flags_value_for(11751, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH: - if self.game_state_manager.game_location == "pe2e": - self._write_game_flags_value_for(15147, 0) - self._write_game_flags_value_for(15153, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW: - if self.game_state_manager.game_location == "cd70": - self._write_game_flags_value_for(1705, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS: - if self.game_state_manager.game_location == "cd3h": - raft_in_left: bool = self._read_game_state_value_for(1301) == 1 - raft_in_right: bool = self._read_game_state_value_for(1304) == 1 - raft_inflated: bool = self._read_game_state_value_for(1379) == 1 - - captain_in_left: bool = self._read_game_state_value_for(1374) == 1 - captain_in_right: bool = self._read_game_state_value_for(1381) == 1 - captain_inflated: bool = self._read_game_state_value_for(1378) == 1 - - left_inflated: bool = (raft_in_left and raft_inflated) or (captain_in_left and captain_inflated) - - right_inflated: bool = (raft_in_right and raft_inflated) or ( - captain_in_right and captain_inflated - ) - - if left_inflated: - self._write_game_flags_value_for(1425, 2) - else: - self._write_game_flags_value_for(1425, 0) - - if right_inflated: - self._write_game_flags_value_for(1426, 2) - else: - self._write_game_flags_value_for(1426, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE: - if self.game_state_manager.game_location == "uc3e": - if self._read_game_state_value_for(13060) == 0: - self._write_game_flags_value_for(13106, 0) - else: - self._write_game_flags_value_for(13106, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS: - if self.game_state_manager.game_location == "ue1e": - if self._read_game_state_value_for(14318) == 0: - self._write_game_flags_value_for(13219, 0) - self._write_game_flags_value_for(13220, 0) - self._write_game_flags_value_for(13221, 0) - self._write_game_flags_value_for(13222, 0) - else: - self._write_game_flags_value_for(13219, 2) - self._write_game_flags_value_for(13220, 2) - self._write_game_flags_value_for(13221, 2) - self._write_game_flags_value_for(13222, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS: - if self.game_state_manager.game_location == "ue1e": - if self._read_game_state_value_for(14318) == 0: - self._write_game_flags_value_for(14327, 0) - self._write_game_flags_value_for(14332, 0) - self._write_game_flags_value_for(14337, 0) - self._write_game_flags_value_for(14342, 0) - else: - self._write_game_flags_value_for(14327, 2) - self._write_game_flags_value_for(14332, 2) - self._write_game_flags_value_for(14337, 2) - self._write_game_flags_value_for(14342, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT: - if self.game_state_manager.game_location == "tr5e": - self._write_game_flags_value_for(12528, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS: - if self.game_state_manager.game_location == "tr5e": - if self._read_game_state_value_for(12220) == 0: - self._write_game_flags_value_for(12523, 2) - self._write_game_flags_value_for(12524, 2) - self._write_game_flags_value_for(12525, 2) - else: - self._write_game_flags_value_for(12523, 0) - self._write_game_flags_value_for(12524, 0) - self._write_game_flags_value_for(12525, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE: - if self.game_state_manager.game_location == "uc1g": - if self._read_game_state_value_for(12931) == 1 or self._read_game_state_value_for(12929) == 1: - self._write_game_flags_value_for(13002, 2) - else: - self._write_game_flags_value_for(13002, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL: - if self.game_state_manager.game_location == "pe5e": - if self._read_game_state_value_for(10277) == 0: - self._write_game_flags_value_for(10726, 0) - else: - self._write_game_flags_value_for(10726, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR: - if self.game_state_manager.game_location == "tr1k": - if self._read_game_state_value_for(12212) == 0: - self._write_game_flags_value_for(12280, 0) - else: - self._write_game_flags_value_for(12280, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS: - if self.game_state_manager.game_location in ("te10", "te1g", "te20", "te30", "te40"): - key: int - for key in data.statemap_keys: - self._write_game_flags_value_for(key, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS: - if self.game_state_manager.game_location == "hp1e": - if self._read_game_state_value_for(8431) == 1: - key: int - for key in data.statemap_keys: - self._write_game_flags_value_for(key, 0) - else: - key: int - for key in data.statemap_keys: - self._write_game_flags_value_for(key, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER: - if self.game_state_manager.game_location == "hp1e": - if self._read_game_state_value_for(8431) == 1: - self._write_game_flags_value_for(8446, 2) - else: - self._write_game_flags_value_for(8446, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRY: - if self.game_state_manager.game_location == "dg4e": - if self._read_game_state_value_for(4237) == 1 and self._read_game_state_value_for(4034) == 1: - self._write_game_flags_value_for(4260, 2) - else: - self._write_game_flags_value_for(4260, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY: - if self.game_state_manager.game_location == "dg4h": - if self._read_game_state_value_for(4279) == 1: - self._write_game_flags_value_for(18026, 2) - else: - self._write_game_flags_value_for(18026, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH: - if self.game_state_manager.game_location == "dg4g": - if self._read_game_state_value_for(4034) == 1: - self._write_game_flags_value_for(17623, 2) - else: - self._write_game_flags_value_for(17623, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR: - if self.game_state_manager.game_location == "uc4e": - if self._read_game_state_value_for(13062) == 1: - self._write_game_flags_value_for(13140, 2) - else: - self._write_game_flags_value_for(13140, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR: - if self.game_state_manager.game_location == "pe1e": - if self._read_game_state_value_for(10451) == 1: - self._write_game_flags_value_for(10441, 2) - else: - self._write_game_flags_value_for(10441, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS: - if self.game_state_manager.game_location == "pe2j": - self._write_game_flags_value_for(19632, 0) - self._write_game_flags_value_for(19627, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR: - if self.game_state_manager.game_location == "sw4e": - if self._read_game_state_value_for(2989) == 1: - self._write_game_flags_value_for(3025, 2) - else: - self._write_game_flags_value_for(3025, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG: - if self.game_state_manager.game_location == "sw4e": - self._write_game_flags_value_for(3036, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MIRROR: - if self.game_state_manager.game_location == "dw1f": - self._write_game_flags_value_for(5031, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT: - if self.game_state_manager.game_location == "um1e": - if self._read_game_state_value_for(9637) == 0: - self._write_game_flags_value_for(13597, 0) - else: - self._write_game_flags_value_for(13597, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE: - if self.game_state_manager.game_location == "ue2g": - if self._read_game_state_value_for(13278) == 0: - self._write_game_flags_value_for(13390, 0) - else: - self._write_game_flags_value_for(13390, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR: - if self.game_state_manager.game_location == "qe1e": - if self._player_is_brog(): - self._write_game_flags_value_for(2447, 0) - elif self._player_is_griff(): - self._write_game_flags_value_for(2455, 0) - elif self._player_is_lucy(): - if self._read_game_state_value_for(2457) == 0: - self._write_game_flags_value_for(2455, 0) - else: - self._write_game_flags_value_for(2455, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS: - if self.game_state_manager.game_location == "tr3h": - if self._read_game_state_value_for(11777) == 1: - self._write_game_flags_value_for(12389, 2) - else: - self._write_game_flags_value_for(12389, 0) - - self._write_game_state_value_for(12390, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE: - if self.game_state_manager.game_location == "dg4f": - if self._read_game_state_value_for(4241) == 1: - self._write_game_flags_value_for(4302, 2) - else: - self._write_game_flags_value_for(4302, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE: - if self.game_state_manager.game_location == "tp1e": - if self._read_game_state_value_for(16342) == 1: - self._write_game_flags_value_for(16383, 2) - self._write_game_flags_value_for(16384, 2) - else: - self._write_game_flags_value_for(16383, 0) - self._write_game_flags_value_for(16384, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE: - if self.game_state_manager.game_location == "sg6e": - if self._read_game_state_value_for(15715) == 1: - self._write_game_flags_value_for(2769, 2) - else: - self._write_game_flags_value_for(2769, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON: - if self.game_state_manager.game_location == "dg2f": - if self._read_game_state_value_for(4114) == 1 or self._read_game_state_value_for(4115) == 1: - self._write_game_flags_value_for(4149, 2) - else: - self._write_game_flags_value_for(4149, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS: - if self.game_state_manager.game_location == "tr5f": - self._write_game_flags_value_for(12584, 0) - self._write_game_flags_value_for(12585, 0) - self._write_game_flags_value_for(12586, 0) - self._write_game_flags_value_for(12587, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT: - if self.game_state_manager.game_location == "tr5f": - self._write_game_flags_value_for(12574, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT: - if self.game_state_manager.game_location == "ue2j": - if self._read_game_state_value_for(13408) == 1: - self._write_game_flags_value_for(13412, 2) - else: - self._write_game_flags_value_for(13412, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER: - if self.game_state_manager.game_location == "tp4g": - self._write_game_flags_value_for(12170, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM: - if self.game_state_manager.game_location == "tp1e": - if self._read_game_state_value_for(16342) == 1 and self._read_game_state_value_for(16374) == 0: - self._write_game_flags_value_for(16382, 0) - else: - self._write_game_flags_value_for(16382, 2) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM: - if self.game_state_manager.game_location == "dg3e": - self._write_game_flags_value_for(4209, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE: - if self.game_state_manager.game_location == "th3r": - self._write_game_flags_value_for(11973, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT: - if self.game_state_manager.game_location == "uc6e": - self._write_game_flags_value_for(13168, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY: - if self.game_state_manager.game_location == "qb2e": - if self._read_game_state_value_for(15395) == 1: - self._write_game_flags_value_for(15396, 2) - else: - self._write_game_flags_value_for(15396, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH: - if self.game_state_manager.game_location == "mt2e": - self._write_game_flags_value_for(9706, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS: - if self.game_state_manager.game_location == "mt2g": - self._write_game_flags_value_for(9728, 0) - self._write_game_flags_value_for(9729, 0) - self._write_game_flags_value_for(9730, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_WELL: - if self.game_state_manager.game_location == "pc1e": - self._write_game_flags_value_for(10314, 0) - elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM: - if self.game_state_manager.game_location == "us2e": - self._write_game_flags_value_for(13757, 0) - elif self.game_state_manager.game_location == "ue2e": - self._write_game_flags_value_for(13297, 0) - elif self.game_state_manager.game_location == "uh2e": - self._write_game_flags_value_for(13486, 0) - elif self.game_state_manager.game_location == "um2e": - self._write_game_flags_value_for(13625, 0) - elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES: - if self.game_state_manager.game_location == "us2e": - self._write_game_flags_value_for(13758, 0) - elif self.game_state_manager.game_location == "ue2e": - self._write_game_flags_value_for(13309, 0) - elif self.game_state_manager.game_location == "uh2e": - self._write_game_flags_value_for(13498, 0) - elif self.game_state_manager.game_location == "um2e": - self._write_game_flags_value_for(13637, 0) - elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY: - if self.game_state_manager.game_location == "us2e": - self._write_game_flags_value_for(13759, 0) - elif self.game_state_manager.game_location == "ue2e": - self._write_game_flags_value_for(13316, 0) - elif self.game_state_manager.game_location == "uh2e": - self._write_game_flags_value_for(13505, 0) - elif self.game_state_manager.game_location == "um2e": - self._write_game_flags_value_for(13644, 0) - elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION: - if self.game_state_manager.game_location == "mt1f": - self._write_game_flags_value_for(9660, 0) - elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: - if self.game_state_manager.game_location == "mt1f": - self._write_game_flags_value_for(9666, 0) - elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: - if self.game_state_manager.game_location == "mt1f": - self._write_game_flags_value_for(9668, 0) - elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: - if self.game_state_manager.game_location == "mt1f": - self._write_game_flags_value_for(9662, 0) - - def _manage_items(self) -> None: - if self._player_is_afgncaap(): - self.available_inventory_slots = self._determine_available_inventory_slots() - - received_inventory_items: Set[ZorkGrandInquisitorItems] - received_inventory_items = self.received_items & self.possible_inventory_items - - received_inventory_items = self._filter_received_inventory_items(received_inventory_items) - elif self._player_is_totem(): - self.available_inventory_slots = self._determine_available_inventory_slots(is_totem=True) - - received_inventory_items: Set[ZorkGrandInquisitorItems] - - if self._player_is_brog(): - received_inventory_items = self.received_items & self.brog_items - received_inventory_items = self._filter_received_brog_inventory_items(received_inventory_items) - elif self._player_is_griff(): - received_inventory_items = self.received_items & self.griff_items - received_inventory_items = self._filter_received_griff_inventory_items(received_inventory_items) - elif self._player_is_lucy(): - received_inventory_items = self.received_items & self.lucy_items - received_inventory_items = self._filter_received_lucy_inventory_items(received_inventory_items) - else: - return None - else: - return None - - game_state_inventory_items: Set[ZorkGrandInquisitorItems] = self._determine_game_state_inventory() - - inventory_items_to_remove: Set[ZorkGrandInquisitorItems] - inventory_items_to_remove = game_state_inventory_items - received_inventory_items - - inventory_items_to_add: Set[ZorkGrandInquisitorItems] - inventory_items_to_add = received_inventory_items - game_state_inventory_items - - item: ZorkGrandInquisitorItems - for item in inventory_items_to_remove: - self._remove_from_inventory(item) - - item: ZorkGrandInquisitorItems - for item in inventory_items_to_add: - self._add_to_inventory(item) - - # Item Deduplication (Just in Case) - seen_items: Set[int] = set() - - i: int - for i in range(151, 171): - item: int = self._read_game_state_value_for(i) - - if item in seen_items: - self._write_game_state_value_for(i, 0) - else: - seen_items.add(item) - - def _apply_conditional_teleports(self) -> None: - if self._player_is_at("uw1x"): - self.game_state_manager.set_game_location("uw10", 0) - - if self._player_is_at("uw1k") and self._read_game_state_value_for(13938) == 0: - self.game_state_manager.set_game_location("pc10", 250) - - if self._player_is_at("ue1q"): - self.game_state_manager.set_game_location("ue1e", 0) - - if self._player_is_at("ej10"): - self.game_state_manager.set_game_location("uc10", 1200) - - if self._read_game_state_value_for(9) == 224: - self._write_game_state_value_for(9, 0) - self.game_state_manager.set_game_location("uc10", 1200) - - def _check_for_victory(self) -> None: - if self.option_goal == ZorkGrandInquisitorGoals.THREE_ARTIFACTS: - coconut_is_placed = self._read_game_state_value_for(2200) == 1 - cube_is_placed = self._read_game_state_value_for(2322) == 1 - skull_is_placed = self._read_game_state_value_for(2321) == 1 - - self.goal_completed = coconut_is_placed and cube_is_placed and skull_is_placed - - def _determine_game_state_inventory(self) -> Set[ZorkGrandInquisitorItems]: - game_state_inventory: Set[ZorkGrandInquisitorItems] = set() - - # Item on Cursor - item_on_cursor: int = self._read_game_state_value_for(9) - - if item_on_cursor != 0: - if item_on_cursor in self.game_id_to_items: - game_state_inventory.add(self.game_id_to_items[item_on_cursor]) - - # Item in Inspector - item_in_inspector: int = self._read_game_state_value_for(4512) - - if item_in_inspector != 0: - if item_in_inspector in self.game_id_to_items: - game_state_inventory.add(self.game_id_to_items[item_in_inspector]) - - # Items in Inventory Slots - i: int - for i in range(151, 171): - if self._read_game_state_value_for(i) != 0: - if self._read_game_state_value_for(i) in self.game_id_to_items: - game_state_inventory.add( - self.game_id_to_items[self._read_game_state_value_for(i)] - ) - - # Pouch of Zorkmids - if self._read_game_state_value_for(5827) == 1: - game_state_inventory.add(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS) - - # Spells - i: int - for i in range(191, 203): - if self._read_game_state_value_for(i) == 1: - if i in self.game_id_to_items: - game_state_inventory.add(self.game_id_to_items[i]) - - # Totems - if self._read_game_state_value_for(4853) == 1: - game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_BROG) - - if self._read_game_state_value_for(4315) == 1: - game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_GRIFF) - - if self._read_game_state_value_for(5223) == 1: - game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_LUCY) - - return game_state_inventory - - def _add_to_inventory(self, item: ZorkGrandInquisitorItems) -> None: - if item == ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: - return None - - data: ZorkGrandInquisitorItemData = item_data[item] - - if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags: - if len(self.available_inventory_slots): # Inventory slot overflow protection - inventory_slot: int = self.available_inventory_slots.pop() - self._write_game_state_value_for(inventory_slot, data.statemap_keys[0]) - elif ZorkGrandInquisitorTags.SPELL in data.tags: - self._write_game_state_value_for(data.statemap_keys[0], 1) - elif ZorkGrandInquisitorTags.TOTEM in data.tags: - self._write_game_state_value_for(data.statemap_keys[0], 1) - - def _remove_from_inventory(self, item: ZorkGrandInquisitorItems) -> None: - if item == ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: - return None - - data: ZorkGrandInquisitorItemData = item_data[item] - - if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags: - inventory_slot: Optional[int] = self._inventory_slot_for(item) - - if inventory_slot is None: - return None - - self._write_game_state_value_for(inventory_slot, 0) - - if inventory_slot != 9: - self.available_inventory_slots.add(inventory_slot) - elif ZorkGrandInquisitorTags.SPELL in data.tags: - self._write_game_state_value_for(data.statemap_keys[0], 0) - elif ZorkGrandInquisitorTags.TOTEM in data.tags: - self._write_game_state_value_for(data.statemap_keys[0], 0) - - def _determine_available_inventory_slots(self, is_totem: bool = False) -> Set[int]: - available_inventory_slots: Set[int] = set() - - inventory_slot_range_end: int = 171 - - if is_totem: - if self._player_is_brog(): - inventory_slot_range_end = 161 - elif self._player_is_griff(): - inventory_slot_range_end = 160 - elif self._player_is_lucy(): - inventory_slot_range_end = 157 - - i: int - for i in range(151, inventory_slot_range_end): - if self._read_game_state_value_for(i) == 0: - available_inventory_slots.add(i) - - return available_inventory_slots - - def _inventory_slot_for(self, item) -> Optional[int]: - data: ZorkGrandInquisitorItemData = item_data[item] - - if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags: - i: int - for i in range(151, 171): - if self._read_game_state_value_for(i) == data.statemap_keys[0]: - return i - - if self._read_game_state_value_for(9) == data.statemap_keys[0]: - return 9 - - if self._read_game_state_value_for(4512) == data.statemap_keys[0]: - return 4512 - - return None - - def _filter_received_inventory_items( - self, received_inventory_items: Set[ZorkGrandInquisitorItems] - ) -> Set[ZorkGrandInquisitorItems]: - to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = self.totem_items - - inventory_item_values: Set[int] = set() - - i: int - for i in range(151, 171): - inventory_item_values.add(self._read_game_state_value_for(i)) - - cursor_item_value: int = self._read_game_state_value_for(9) - inspector_item_value: int = self._read_game_state_value_for(4512) - - inventory_item_values.add(cursor_item_value) - inventory_item_values.add(inspector_item_value) - - item: ZorkGrandInquisitorItems - for item in received_inventory_items: - if item == ZorkGrandInquisitorItems.FLATHEADIA_FUDGE: - if self._read_game_state_value_for(4766) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.HUNGUS_LARD: - if self._read_game_state_value_for(4870) == 1: - to_filter_inventory_items.add(item) - elif ( - self._read_game_state_value_for(4244) == 1 - and self._read_game_state_value_for(4309) == 0 - ): - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.JAR_OF_HOTBUGS: - if self._read_game_state_value_for(4750) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LANTERN: - if self._read_game_state_value_for(10477) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(5221) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER: - if self._read_game_state_value_for(9491) == 3: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MAP: - if self._read_game_state_value_for(16618) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MEAD_LIGHT: - if 105 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(17620) > 0: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4034) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MOSS_OF_MAREILON: - if self._read_game_state_value_for(4763) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MUG: - if self._read_game_state_value_for(4772) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.OLD_SCRATCH_CARD: - if 32 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(12892) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE: - if self._read_game_state_value_for(12218) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER: - if self._read_game_state_value_for(15150) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(10421) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.PROZORK_TABLET: - if self._read_game_state_value_for(4115) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB: - if self._read_game_state_value_for(4769) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.ROPE: - if 22 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 111 in inventory_item_values: - to_filter_inventory_items.add(item) - elif ( - self._read_game_state_value_for(10304) == 1 - and not self._read_game_state_value_for(13938) == 1 - ): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15150) == 83: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS: - if 41 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 98 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(201) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV: - if 48 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 98 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(201) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.SNAPDRAGON: - if self._read_game_state_value_for(4199) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.STUDENT_ID: - if self._read_game_state_value_for(11838) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.SUBWAY_TOKEN: - if self._read_game_state_value_for(13167) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.SWORD: - if 22 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 100 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 111 in inventory_item_values: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.ZIMDOR_SCROLL: - if 105 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(17620) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4034) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.ZORK_ROCKS: - if self._read_game_state_value_for(12486) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(12487) == 1: - to_filter_inventory_items.add(item) - elif 52 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(11769) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(11840) == 1: - to_filter_inventory_items.add(item) - - return received_inventory_items - to_filter_inventory_items - - def _filter_received_brog_inventory_items( - self, received_inventory_items: Set[ZorkGrandInquisitorItems] - ) -> Set[ZorkGrandInquisitorItems]: - to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set() - - inventory_item_values: Set[int] = set() - - i: int - for i in range(151, 161): - inventory_item_values.add(self._read_game_state_value_for(i)) - - cursor_item_value: int = self._read_game_state_value_for(9) - inspector_item_value: int = self._read_game_state_value_for(2194) - - inventory_item_values.add(cursor_item_value) - inventory_item_values.add(inspector_item_value) - - item: ZorkGrandInquisitorItems - for item in received_inventory_items: - if item == ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH: - if 103 in inventory_item_values: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH: - if 104 in inventory_item_values: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.BROGS_GRUE_EGG: - if self._read_game_state_value_for(2577) == 1: - to_filter_inventory_items.add(item) - elif 71 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(2641) == 1: - to_filter_inventory_items.add(item) - - return received_inventory_items - to_filter_inventory_items - - def _filter_received_griff_inventory_items( - self, received_inventory_items: Set[ZorkGrandInquisitorItems] - ) -> Set[ZorkGrandInquisitorItems]: - to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set() - - inventory_item_values: Set[int] = set() - - i: int - for i in range(151, 160): - inventory_item_values.add(self._read_game_state_value_for(i)) - - cursor_item_value: int = self._read_game_state_value_for(9) - inspector_item_value: int = self._read_game_state_value_for(4512) - - inventory_item_values.add(cursor_item_value) - inventory_item_values.add(inspector_item_value) - - item: ZorkGrandInquisitorItems - for item in received_inventory_items: - if item == ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT: - if self._read_game_state_value_for(1301) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(1304) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(16562) == 1: - to_filter_inventory_items.add(item) - if item == ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN: - if self._read_game_state_value_for(1374) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(1381) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(16562) == 1: - to_filter_inventory_items.add(item) - - return received_inventory_items - to_filter_inventory_items - - def _filter_received_lucy_inventory_items( - self, received_inventory_items: Set[ZorkGrandInquisitorItems] - ) -> Set[ZorkGrandInquisitorItems]: - to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set() - - inventory_item_values: Set[int] = set() - - i: int - for i in range(151, 157): - inventory_item_values.add(self._read_game_state_value_for(i)) - - cursor_item_value: int = self._read_game_state_value_for(9) - inspector_item_value: int = self._read_game_state_value_for(2198) - - inventory_item_values.add(cursor_item_value) - inventory_item_values.add(inspector_item_value) - - item: ZorkGrandInquisitorItems - for item in received_inventory_items: - if item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1: - if 120 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15433) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15435) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15437) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15439) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15472) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2: - if 121 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15433) == 2: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15435) == 2: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15437) == 2: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15439) == 2: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15472) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3: - if 122 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15433) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15435) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15437) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15439) == 3: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15472) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4: - if 123 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15433) in (4, 5): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15435) in (4, 5): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15437) in (4, 5): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15439) in (4, 5): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15472) == 1: - to_filter_inventory_items.add(item) - - return received_inventory_items - to_filter_inventory_items - - def _read_game_state_value_for(self, key: int) -> Optional[int]: - try: - return self.game_state_manager.read_game_state_value_for(key) - except Exception as e: - self.log_debug(f"Exception: {e} while trying to read game state key '{key}'") - raise e - - def _write_game_state_value_for(self, key: int, value: int) -> Optional[bool]: - try: - return self.game_state_manager.write_game_state_value_for(key, value) - except Exception as e: - self.log_debug(f"Exception: {e} while trying to write '{key} = {value}' to game state") - raise e - - def _read_game_flags_value_for(self, key: int) -> Optional[int]: - try: - return self.game_state_manager.read_game_flags_value_for(key) - except Exception as e: - self.log_debug(f"Exception: {e} while trying to read game flags key '{key}'") - raise e - - def _write_game_flags_value_for(self, key: int, value: int) -> Optional[bool]: - try: - return self.game_state_manager.write_game_flags_value_for(key, value) - except Exception as e: - self.log_debug(f"Exception: {e} while trying to write '{key} = {value}' to game flags") - raise e - - def _player_has(self, item: ZorkGrandInquisitorItems) -> bool: - return item in self.received_items - - def _player_doesnt_have(self, item: ZorkGrandInquisitorItems) -> bool: - return item not in self.received_items - - def _player_is_at(self, game_location: str) -> bool: - return self.game_state_manager.game_location == game_location - - def _player_is_afgncaap(self) -> bool: - return self._read_game_state_value_for(1596) == 1 - - def _player_is_totem(self) -> bool: - return self._player_is_brog() or self._player_is_griff() or self._player_is_lucy() - - def _player_is_brog(self) -> bool: - return self._read_game_state_value_for(1520) == 1 - - def _player_is_griff(self) -> bool: - return self._read_game_state_value_for(1296) == 1 - - def _player_is_lucy(self) -> bool: - return self._read_game_state_value_for(1524) == 1 diff --git a/worlds/zork_grand_inquisitor/game_state_manager.py b/worlds/zork_grand_inquisitor/game_state_manager.py deleted file mode 100644 index 25b35969bf..0000000000 --- a/worlds/zork_grand_inquisitor/game_state_manager.py +++ /dev/null @@ -1,370 +0,0 @@ -from typing import Optional, Tuple - -from pymem import Pymem -from pymem.process import close_handle - - -class GameStateManager: - process_name = "scummvm.exe" - - process: Optional[Pymem] - is_process_running: bool - - script_manager_struct_address: int - render_manager_struct_address: int - - game_location: Optional[str] - game_location_offset: Optional[int] - - def __init__(self) -> None: - self.process = None - self.is_process_running = False - - self.script_manager_struct_address = 0x0 - self.render_manager_struct_address = 0x0 - - self.game_location = None - self.game_location_offset = None - - @property - def game_state_storage_pointer_address(self) -> int: - return self.script_manager_struct_address + 0x88 - - @property - def game_state_storage_address(self) -> int: - return self.process.read_longlong(self.game_state_storage_pointer_address) - - @property - def game_state_hashmap_size_address(self) -> int: - return self.script_manager_struct_address + 0x90 - - @property - def game_state_key_count_address(self) -> int: - return self.script_manager_struct_address + 0x94 - - @property - def game_state_deleted_key_count_address(self) -> int: - return self.script_manager_struct_address + 0x98 - - @property - def game_flags_storage_pointer_address(self) -> int: - return self.script_manager_struct_address + 0x120 - - @property - def game_flags_storage_address(self) -> int: - return self.process.read_longlong(self.game_flags_storage_pointer_address) - - @property - def game_flags_hashmap_size_address(self) -> int: - return self.script_manager_struct_address + 0x128 - - @property - def game_flags_key_count_address(self) -> int: - return self.script_manager_struct_address + 0x12C - - @property - def game_flags_deleted_key_count_address(self) -> int: - return self.script_manager_struct_address + 0x130 - - @property - def current_location_address(self) -> int: - return self.script_manager_struct_address + 0x400 - - @property - def current_location_offset_address(self) -> int: - return self.script_manager_struct_address + 0x404 - - @property - def next_location_address(self) -> int: - return self.script_manager_struct_address + 0x408 - - @property - def next_location_offset_address(self) -> int: - return self.script_manager_struct_address + 0x40C - - @property - def panorama_reversed_address(self) -> int: - return self.render_manager_struct_address + 0x1C - - def open_process_handle(self) -> bool: - try: - self.process = Pymem(self.process_name) - self.is_process_running = True - - self.script_manager_struct_address = self._resolve_address(0x5276600, (0xC8, 0x0)) - self.render_manager_struct_address = self._resolve_address(0x5276600, (0xD0, 0x120)) - except Exception: - return False - - return True - - def close_process_handle(self) -> bool: - if close_handle(self.process.process_handle): - self.is_process_running = False - self.process = None - - self.script_manager_struct_address = 0x0 - self.render_manager_struct_address = 0x0 - - return True - - return False - - def is_process_still_running(self) -> bool: - try: - self.process.read_int(self.process.base_address) - except Exception: - self.is_process_running = False - self.process = None - - self.script_manager_struct_address = 0x0 - self.render_manager_struct_address = 0x0 - - return False - - return True - - def read_game_state_value_for(self, key: int) -> Optional[int]: - return self.read_statemap_value_for(key, scope="game_state") - - def read_game_flags_value_for(self, key: int) -> Optional[int]: - return self.read_statemap_value_for(key, scope="game_flags") - - def read_statemap_value_for(self, key: int, scope: str = "game_state") -> Optional[int]: - if self.is_process_running: - offset: int - - address: int - address_value: int - - if scope == "game_state": - offset = self._get_game_state_address_read_offset_for(key) - - address = self.game_state_storage_address + offset - address_value = self.process.read_longlong(address) - elif scope == "game_flags": - offset = self._get_game_flags_address_read_offset_for(key) - - address = self.game_flags_storage_address + offset - address_value = self.process.read_longlong(address) - else: - raise ValueError(f"Invalid scope: {scope}") - - if address_value == 0: - return 0 - - statemap_value: int = self.process.read_int(address_value + 0x0) - statemap_key: int = self.process.read_int(address_value + 0x4) - - assert statemap_key == key - - return statemap_value - - return None - - def write_game_state_value_for(self, key: int, value: int) -> Optional[bool]: - return self.write_statemap_value_for(key, value, scope="game_state") - - def write_game_flags_value_for(self, key: int, value: int) -> Optional[bool]: - return self.write_statemap_value_for(key, value, scope="game_flags") - - def write_statemap_value_for(self, key: int, value: int, scope: str = "game_state") -> Optional[bool]: - if self.is_process_running: - offset: int - is_existing_node: bool - is_reused_dummy_node: bool - - key_count_address: int - deleted_key_count_address: int - - storage_address: int - - if scope == "game_state": - offset, is_existing_node, is_reused_dummy_node = self._get_game_state_address_write_offset_for(key) - - key_count_address = self.game_state_key_count_address - deleted_key_count_address = self.game_state_deleted_key_count_address - - storage_address = self.game_state_storage_address - elif scope == "game_flags": - offset, is_existing_node, is_reused_dummy_node = self._get_game_flags_address_write_offset_for(key) - - key_count_address = self.game_flags_key_count_address - deleted_key_count_address = self.game_flags_deleted_key_count_address - - storage_address = self.game_flags_storage_address - else: - raise ValueError(f"Invalid scope: {scope}") - - statemap_key_count: int = self.process.read_int(key_count_address) - statemap_deleted_key_count: int = self.process.read_int(deleted_key_count_address) - - if value == 0: - if not is_existing_node: - return False - - self.process.write_longlong(storage_address + offset, 1) - - self.process.write_int(key_count_address, statemap_key_count - 1) - self.process.write_int(deleted_key_count_address, statemap_deleted_key_count + 1) - else: - if is_existing_node: - address_value: int = self.process.read_longlong(storage_address + offset) - self.process.write_int(address_value + 0x0, value) - else: - write_address: int = self.process.allocate(0x8) - - self.process.write_int(write_address + 0x0, value) - self.process.write_int(write_address + 0x4, key) - - self.process.write_longlong(storage_address + offset, write_address) - - self.process.write_int(key_count_address, statemap_key_count + 1) - - if is_reused_dummy_node: - self.process.write_int(deleted_key_count_address, statemap_deleted_key_count - 1) - - return True - - return None - - def refresh_game_location(self) -> Optional[bool]: - if self.is_process_running: - game_location_bytes: bytes = self.process.read_bytes(self.current_location_address, 4) - - self.game_location = game_location_bytes.decode("ascii") - self.game_location_offset = self.process.read_int(self.current_location_offset_address) - - return True - - return None - - def set_game_location(self, game_location: str, offset: int) -> Optional[bool]: - if self.is_process_running: - game_location_bytes: bytes = game_location.encode("ascii") - - self.process.write_bytes(self.next_location_address, game_location_bytes, 4) - self.process.write_int(self.next_location_offset_address, offset) - - return True - - return None - - def set_panorama_reversed(self, is_reversed: bool) -> Optional[bool]: - if self.is_process_running: - self.process.write_int(self.panorama_reversed_address, 1 if is_reversed else 0) - - return True - - return None - - def _resolve_address(self, base_offset: int, offsets: Tuple[int, ...]): - address: int = self.process.read_longlong(self.process.base_address + base_offset) - - for offset in offsets[:-1]: - address = self.process.read_longlong(address + offset) - - return address + offsets[-1] - - def _get_game_state_address_read_offset_for(self, key: int): - return self._get_statemap_address_read_offset_for(key, scope="game_state") - - def _get_game_flags_address_read_offset_for(self, key: int): - return self._get_statemap_address_read_offset_for(key, scope="game_flags") - - def _get_statemap_address_read_offset_for(self, key: int, scope: str = "game_state") -> int: - hashmap_size_address: int - storage_address: int - - if scope == "game_state": - hashmap_size_address = self.game_state_hashmap_size_address - storage_address = self.game_state_storage_address - elif scope == "game_flags": - hashmap_size_address = self.game_flags_hashmap_size_address - storage_address = self.game_flags_storage_address - else: - raise ValueError(f"Invalid scope: {scope}") - - statemap_hashmap_size: int = self.process.read_int(hashmap_size_address) - - perturb: int = key - perturb_shift: int = 0x5 - - index: int = key & statemap_hashmap_size - offset: int = index * 0x8 - - while True: - offset_value: int = self.process.read_longlong(storage_address + offset) - - if offset_value == 0: # Null Pointer - break - elif offset_value == 1: # Dummy Node - pass - elif offset_value > 1: # Existing Node - if self.process.read_int(offset_value + 0x4) == key: - break - - index = ((0x5 * index) + perturb + 0x1) & statemap_hashmap_size - offset = index * 0x8 - - perturb >>= perturb_shift - - return offset - - def _get_game_state_address_write_offset_for(self, key: int) -> Tuple[int, bool, bool]: - return self._get_statemap_address_write_offset_for(key, scope="game_state") - - def _get_game_flags_address_write_offset_for(self, key: int) -> Tuple[int, bool, bool]: - return self._get_statemap_address_write_offset_for(key, scope="game_flags") - - def _get_statemap_address_write_offset_for(self, key: int, scope: str = "game_state") -> Tuple[int, bool, bool]: - hashmap_size_address: int - storage_address: int - - if scope == "game_state": - hashmap_size_address = self.game_state_hashmap_size_address - storage_address = self.game_state_storage_address - elif scope == "game_flags": - hashmap_size_address = self.game_flags_hashmap_size_address - storage_address = self.game_flags_storage_address - else: - raise ValueError(f"Invalid scope: {scope}") - - statemap_hashmap_size: int = self.process.read_int(hashmap_size_address) - - perturb: int = key - perturb_shift: int = 0x5 - - index: int = key & statemap_hashmap_size - offset: int = index * 0x8 - - node_found: bool = False - - dummy_node_found: bool = False - dummy_node_offset: Optional[int] = None - - while True: - offset_value: int = self.process.read_longlong(storage_address + offset) - - if offset_value == 0: # Null Pointer - break - elif offset_value == 1: # Dummy Node - if not dummy_node_found: - dummy_node_offset = offset - dummy_node_found = True - elif offset_value > 1: # Existing Node - if self.process.read_int(offset_value + 0x4) == key: - node_found = True - break - - index = ((0x5 * index) + perturb + 0x1) & statemap_hashmap_size - offset = index * 0x8 - - perturb >>= perturb_shift - - if not node_found and dummy_node_found: # We should reuse the dummy node - return dummy_node_offset, False, True - elif not node_found and not dummy_node_found: # We should allocate a new node - return offset, False, False - - return offset, True, False # We should update the existing node diff --git a/worlds/zork_grand_inquisitor/options.py b/worlds/zork_grand_inquisitor/options.py deleted file mode 100644 index f064151999..0000000000 --- a/worlds/zork_grand_inquisitor/options.py +++ /dev/null @@ -1,61 +0,0 @@ -from dataclasses import dataclass - -from Options import Choice, DefaultOnToggle, PerGameCommonOptions, Toggle - - -class Goal(Choice): - """ - Determines the victory condition - - Three Artifacts: Retrieve the three artifacts of magic and place them in the walking castle - """ - display_name: str = "Goal" - - default: int = 0 - option_three_artifacts: int = 0 - - -class QuickPortFoozle(DefaultOnToggle): - """If true, the items needed to go down the well will be found in early locations for a smoother early game""" - - display_name: str = "Quick Port Foozle" - - -class StartWithHotspotItems(DefaultOnToggle): - """ - If true, the player will be given all the hotspot items at the start of the game, effectively removing the need - to enable the important hotspots in the game before interacting with them. Recommended for beginners - - Note: The spots these hotspot items would have occupied in the item pool will instead be filled with junk items. - Expect a higher volume of filler items if you enable this option - """ - - display_name: str = "Start with Hotspot Items" - - -class Deathsanity(Toggle): - """If true, adds 16 player death locations to the world""" - - display_name: str = "Deathsanity" - - -class GrantMissableLocationChecks(Toggle): - """ - If true, performing an irreversible action will grant the locations checks that would have become unobtainable as a - result of that action when you meet the item requirements - - Otherwise, the player is expected to potentially have to use the save system to reach those location checks. If you - don't like the idea of rarely having to reload an earlier save to get a location check, make sure this option is - enabled - """ - - display_name: str = "Grant Missable Checks" - - -@dataclass -class ZorkGrandInquisitorOptions(PerGameCommonOptions): - goal: Goal - quick_port_foozle: QuickPortFoozle - start_with_hotspot_items: StartWithHotspotItems - deathsanity: Deathsanity - grant_missable_location_checks: GrantMissableLocationChecks diff --git a/worlds/zork_grand_inquisitor/requirements.txt b/worlds/zork_grand_inquisitor/requirements.txt deleted file mode 100644 index ca36764fbf..0000000000 --- a/worlds/zork_grand_inquisitor/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Pymem>=1.13.0 diff --git a/worlds/zork_grand_inquisitor/test/__init__.py b/worlds/zork_grand_inquisitor/test/__init__.py deleted file mode 100644 index c8ceda43a7..0000000000 --- a/worlds/zork_grand_inquisitor/test/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from test.bases import WorldTestBase - - -class ZorkGrandInquisitorTestBase(WorldTestBase): - game = "Zork Grand Inquisitor" diff --git a/worlds/zork_grand_inquisitor/test/test_access.py b/worlds/zork_grand_inquisitor/test/test_access.py deleted file mode 100644 index 63a5f8c9ab..0000000000 --- a/worlds/zork_grand_inquisitor/test/test_access.py +++ /dev/null @@ -1,2927 +0,0 @@ -from typing import List - -from . import ZorkGrandInquisitorTestBase - -from ..enums import ( - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorLocations, - ZorkGrandInquisitorRegions, -) - - -class AccessTestRegions(ZorkGrandInquisitorTestBase): - options = { - "start_with_hotspot_items": "false", - } - - def test_access_crossroads_to_dm_lair_sword(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_crossroads_to_dm_lair_teleporter(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_crossroads_to_gue_tech(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - def test_access_crossroads_to_gue_tech_outside(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - def test_access_crossroads_to_hades_shore(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_crossroads_to_port_foozle(self) -> None: - self._go_to_crossroads() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE.value)) - - def test_access_crossroads_to_spell_lab_bridge(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_crossroads_to_subway_crossroads(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SUBWAY_TOKEN.value, - ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value)) - - def test_access_crossroads_to_subway_monastery(self) -> None: - self._go_to_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_dm_lair_to_crossroads(self) -> None: - self._go_to_dm_lair() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_dm_lair_to_dm_lair_interior(self) -> None: - self._go_to_dm_lair() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value, - ZorkGrandInquisitorItems.MEAD_LIGHT.value, - ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value)) - - def test_access_dm_lair_to_gue_tech_outside(self) -> None: - self._go_to_dm_lair() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - def test_access_dm_lair_to_hades_shore(self) -> None: - self._go_to_dm_lair() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_dm_lair_to_spell_lab_bridge(self) -> None: - self._go_to_dm_lair() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_dm_lair_to_subway_monastery(self) -> None: - self._go_to_dm_lair() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_dm_lair_interior_to_dm_lair(self) -> None: - self._go_to_dm_lair_interior() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_dm_lair_interior_to_walking_castle(self) -> None: - self._go_to_dm_lair_interior() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.WALKING_CASTLE.value)) - - self._obtain_obidil() - - self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.WALKING_CASTLE.value)) - - def test_access_dm_lair_interior_to_white_house(self) -> None: - self._go_to_dm_lair_interior() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.WHITE_HOUSE.value)) - - self._obtain_yastard() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value, - ZorkGrandInquisitorItems.SPELL_NARWILE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.WHITE_HOUSE.value)) - - def test_access_dragon_archipelago_to_dragon_archipelago_dragon(self) -> None: - self._go_to_dragon_archipelago() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_GRIFF.value, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON.value)) - - def test_access_dragon_archipelago_to_hades_beyond_gates(self) -> None: - self._go_to_dragon_archipelago() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value)) - - def test_access_dragon_archipelago_dragon_to_dragon_archipelago(self) -> None: - self._go_to_dragon_archipelago_dragon() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value)) - - def test_access_dragon_archipelago_dragon_to_endgame(self) -> None: - self._go_to_dragon_archipelago_dragon() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value, - ) - ) - - self._go_to_port_foozle_past_tavern() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value, - ) - ) - - self._go_to_white_house() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_BROG.value, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value, - ZorkGrandInquisitorItems.BROGS_PLANK.value, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - def test_access_gue_tech_to_crossroads(self) -> None: - self._go_to_gue_tech() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_gue_tech_to_gue_tech_hallway(self) -> None: - self._go_to_gue_tech() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_IGRAM.value, - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value)) - - def test_access_gue_tech_to_gue_tech_outside(self) -> None: - self._go_to_gue_tech() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - def test_access_gue_tech_hallway_to_gue_tech(self) -> None: - self._go_to_gue_tech_hallway() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - def test_access_gue_tech_hallway_to_spell_lab_bridge(self) -> None: - self._go_to_gue_tech_hallway() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.STUDENT_ID.value, - ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_gue_tech_outside_to_crossroads(self) -> None: - self._go_to_gue_tech_outside() - - # Direct connection requires the map but indirect connection is free - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_gue_tech_outside_to_dm_lair(self) -> None: - self._go_to_gue_tech_outside() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_gue_tech_outside_to_gue_tech(self) -> None: - self._go_to_gue_tech_outside() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value)) - - def test_access_gue_tech_outside_to_hades_shore(self) -> None: - self._go_to_gue_tech_outside() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_gue_tech_outside_to_spell_lab_bridge(self) -> None: - self._go_to_gue_tech_outside() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_gue_tech_outside_to_subway_monastery(self) -> None: - self._go_to_gue_tech_outside() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_hades_to_hades_beyond_gates(self) -> None: - self._go_to_hades() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value)) - - self._obtain_snavig() - - self.collect_by_name(ZorkGrandInquisitorItems.TOTEM_BROG.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value)) - - def test_access_hades_to_hades_shore(self) -> None: - self._go_to_hades() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_hades_beyond_gates_to_dragon_archipelago(self) -> None: - self._go_to_hades_beyond_gates() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value)) - - self._obtain_yastard() - - self.collect_by_name(ZorkGrandInquisitorItems.SPELL_NARWILE.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value)) - - def test_access_hades_beyond_gates_to_hades(self) -> None: - self._go_to_hades_beyond_gates() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value)) - - def test_access_hades_shore_to_crossroads(self) -> None: - self._go_to_hades_shore() - - # Direct connection requires the map but indirect connection is free - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_hades_shore_to_dm_lair(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_hades_shore_to_gue_tech_outside(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - def test_access_hades_shore_to_hades(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value, - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value, - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value)) - - def test_access_hades_shore_to_spell_lab_bridge(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_hades_shore_to_subway_crossroads(self) -> None: - self._go_to_hades_shore() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value)) - - def test_access_hades_shore_to_subway_flood_control_dam(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)) - - def test_access_hades_shore_to_subway_monastery(self) -> None: - self._go_to_hades_shore() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_monastery_to_hades_shore(self) -> None: - self._go_to_monastery() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_monastery_to_monastery_exhibit(self) -> None: - self._go_to_monastery() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value)) - - def test_access_monastery_to_subway_monastery(self) -> None: - self._go_to_monastery() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_monastery_exhibit_to_monastery(self) -> None: - self._go_to_monastery_exhibit() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value)) - - def test_access_monastery_exhibit_to_port_foozle_past(self) -> None: - self._go_to_monastery_exhibit() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value)) - - self._obtain_yastard() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value, - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value, - ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value, - ZorkGrandInquisitorItems.SPELL_NARWILE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value)) - - def test_access_port_foozle_to_crossroads(self) -> None: - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value, - ZorkGrandInquisitorItems.LANTERN.value, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value, - ZorkGrandInquisitorItems.ROPE.value, - ZorkGrandInquisitorItems.HOTSPOT_WELL.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_port_foozle_to_port_foozle_jacks_shop(self) -> None: - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value, - ZorkGrandInquisitorItems.LANTERN.value, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP.value)) - - def test_access_port_foozle_jacks_shop_to_port_foozle(self) -> None: - self._go_to_port_foozle_jacks_shop() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE.value)) - - def test_access_port_foozle_past_to_monastery_exhibit(self) -> None: - self._go_to_port_foozle_past() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value)) - - def test_access_port_foozle_past_to_port_foozle_past_tavern(self) -> None: - self._go_to_port_foozle_past() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_LUCY.value, - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN.value)) - - def test_access_port_foozle_past_tavern_to_endgame(self) -> None: - self._go_to_port_foozle_past_tavern() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value, - ) - ) - - self._go_to_dragon_archipelago_dragon() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value, - ) - ) - - self._go_to_white_house() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_BROG.value, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value, - ZorkGrandInquisitorItems.BROGS_PLANK.value, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - def test_access_port_foozle_past_tavern_to_port_foozle_past(self) -> None: - self._go_to_port_foozle_past_tavern() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value)) - - def test_access_spell_lab_to_spell_lab_bridge(self) -> None: - self._go_to_spell_lab() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value)) - - def test_access_spell_lab_bridge_to_crossroads(self) -> None: - self._go_to_spell_lab_bridge() - - # Direct connection requires the map but indirect connection is free - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_spell_lab_bridge_to_dm_lair(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value)) - - def test_access_spell_lab_bridge_to_gue_tech_outside(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value)) - - def test_access_spell_lab_bridge_to_gue_tech_hallway(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value)) - - def test_access_spell_lab_bridge_to_hades_shore(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_spell_lab_bridge_to_spell_lab(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB.value)) - - self._go_to_subway_flood_control_dam() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value, - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value, - ZorkGrandInquisitorItems.SPELL_GOLGATEM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB.value)) - - def test_access_spell_lab_bridge_to_subway_monastery(self) -> None: - self._go_to_spell_lab_bridge() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_subway_crossroads_to_crossroads(self) -> None: - self._go_to_subway_crossroads() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value)) - - def test_access_subway_crossroads_to_hades_shore(self) -> None: - self._go_to_subway_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL.value, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_subway_crossroads_to_subway_flood_control_dam(self) -> None: - self._go_to_subway_crossroads() - - self.assertFalse( - self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value) - ) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL.value, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value, - ) - ) - - self.assertTrue( - self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value) - ) - - def test_access_subway_crossroads_to_subway_monastery(self) -> None: - self._go_to_subway_crossroads() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL.value, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_subway_flood_control_dam_to_hades_shore(self) -> None: - self._go_to_subway_flood_control_dam() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_subway_flood_control_dam_to_subway_crossroads(self) -> None: - self._go_to_subway_flood_control_dam() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value)) - - def test_access_subway_flood_control_dam_to_subway_monastery(self) -> None: - self._go_to_subway_flood_control_dam() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value)) - - def test_access_subway_monastery_to_hades_shore(self) -> None: - self._go_to_subway_monastery() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value)) - - def test_access_subway_monastery_to_monastery(self) -> None: - self._go_to_subway_monastery() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.SPELL_GLORF.value, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value)) - - def test_access_subway_monastery_to_subway_crossroads(self) -> None: - self._go_to_subway_monastery() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value)) - - def test_access_subway_monastery_to_subway_flood_control_dam(self) -> None: - self._go_to_subway_monastery() - - self.assertFalse( - self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value) - ) - - self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value) - - self.assertTrue( - self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value) - ) - - def test_access_walking_castle_to_dm_lair_interior(self) -> None: - self._go_to_walking_castle() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value)) - - def test_access_white_house_to_dm_lair_interior(self) -> None: - self._go_to_white_house() - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value)) - - def test_access_white_house_to_endgame(self) -> None: - self._go_to_white_house() - - self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_BROG.value, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value, - ZorkGrandInquisitorItems.BROGS_PLANK.value, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value, - ) - ) - - self._go_to_dragon_archipelago_dragon() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value, - ) - ) - - self._go_to_port_foozle_past_tavern() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value, - ) - ) - - self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value)) - - def _go_to_crossroads(self) -> None: - self.collect_by_name( - ( - ZorkGrandInquisitorItems.LANTERN.value, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value, - ZorkGrandInquisitorItems.ROPE.value, - ZorkGrandInquisitorItems.HOTSPOT_WELL.value, - ) - ) - - def _go_to_dm_lair(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value, - ) - ) - - def _go_to_dm_lair_interior(self) -> None: - self._go_to_dm_lair() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value, - ZorkGrandInquisitorItems.MEAD_LIGHT.value, - ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value, - ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value, - ) - ) - - def _go_to_dragon_archipelago(self) -> None: - self._go_to_hades_beyond_gates() - self._obtain_yastard() - - self.collect_by_name(ZorkGrandInquisitorItems.SPELL_NARWILE.value) - - def _go_to_dragon_archipelago_dragon(self) -> None: - self._go_to_dragon_archipelago() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_GRIFF.value, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value, - ) - ) - - def _go_to_gue_tech(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value, - ) - ) - - def _go_to_gue_tech_hallway(self) -> None: - self._go_to_gue_tech() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_IGRAM.value, - ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value, - ) - ) - - def _go_to_gue_tech_outside(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value, - ) - ) - - def _go_to_hades(self) -> None: - self._go_to_hades_shore() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value, - ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value, - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value, - ) - ) - - def _go_to_hades_beyond_gates(self) -> None: - self._go_to_hades() - self._obtain_snavig() - - self.collect_by_name(ZorkGrandInquisitorItems.TOTEM_BROG.value) - - def _go_to_hades_shore(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value, - ) - ) - - def _go_to_monastery(self) -> None: - self._go_to_subway_monastery() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.SPELL_GLORF.value, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value, - ) - ) - - def _go_to_monastery_exhibit(self) -> None: - self._go_to_monastery() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value, - ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value, - ) - ) - - def _go_to_port_foozle_jacks_shop(self) -> None: - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value, - ZorkGrandInquisitorItems.LANTERN.value, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value, - ) - ) - - def _go_to_port_foozle_past(self) -> None: - self._go_to_monastery_exhibit() - - self._obtain_yastard() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value, - ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value, - ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value, - ZorkGrandInquisitorItems.SPELL_NARWILE.value, - ) - ) - - def _go_to_port_foozle_past_tavern(self) -> None: - self._go_to_port_foozle_past() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.TOTEM_LUCY.value, - ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value, - ) - ) - - def _go_to_spell_lab(self) -> None: - self._go_to_subway_flood_control_dam() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value, - ) - ) - - self._go_to_spell_lab_bridge() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value, - ZorkGrandInquisitorItems.SPELL_GOLGATEM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value, - ) - ) - - def _go_to_spell_lab_bridge(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value, - ) - ) - - def _go_to_subway_crossroads(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SUBWAY_TOKEN.value, - ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value, - ) - ) - - def _go_to_subway_flood_control_dam(self) -> None: - self._go_to_subway_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_KENDALL.value, - ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value, - ) - ) - - def _go_to_subway_monastery(self) -> None: - self._go_to_crossroads() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.MAP.value, - ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value, - ) - ) - - def _go_to_white_house(self) -> None: - self._go_to_dm_lair_interior() - - self._obtain_yastard() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value, - ZorkGrandInquisitorItems.SPELL_NARWILE.value, - ) - ) - - def _go_to_walking_castle(self) -> None: - self._go_to_dm_lair_interior() - - self._obtain_obidil() - self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value) - - def _obtain_obidil(self) -> None: - self._go_to_crossroads() - self._go_to_gue_tech() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value, - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT.value, - ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS.value, - ) - ) - - self._go_to_subway_flood_control_dam() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value, - ) - ) - - self._go_to_spell_lab_bridge() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value, - ZorkGrandInquisitorItems.SPELL_GOLGATEM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value, - ) - ) - - def _obtain_snavig(self) -> None: - self._go_to_crossroads() - self._go_to_dm_lair_interior() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS.value, - ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV.value, - ZorkGrandInquisitorItems.HOTSPOT_MIRROR.value, - ) - ) - - self._go_to_subway_flood_control_dam() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SPELL_REZROV.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value, - ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value, - ) - ) - - self._go_to_spell_lab_bridge() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.SWORD.value, - ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value, - ZorkGrandInquisitorItems.SPELL_GOLGATEM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value, - ) - ) - - def _obtain_yastard(self) -> None: - self._go_to_crossroads() - self._go_to_dm_lair_interior() - - self.collect_by_name( - ( - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE.value, - ZorkGrandInquisitorItems.HUNGUS_LARD.value, - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS.value, - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB.value, - ZorkGrandInquisitorItems.MOSS_OF_MAREILON.value, - ZorkGrandInquisitorItems.MUG.value, - ) - ) - - -class AccessTestLocations(ZorkGrandInquisitorTestBase): - options = { - "deathsanity": "true", - "start_with_hotspot_items": "false", - } - - def test_access_locations_requiring_brogs_flickering_torch(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value,)] - ) - - def test_access_locations_requiring_brogs_grue_egg(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value,)] - ) - - def test_access_locations_requiring_brogs_plank(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.BROGS_PLANK.value,)] - ) - - def test_access_locations_requiring_flatheadia_fudge(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.FLATHEADIA_FUDGE.value,)] - ) - - def test_access_locations_requiring_griffs_air_pump(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value,)] - ) - - def test_access_locations_requiring_griffs_dragon_tooth(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value,)] - ) - - def test_access_locations_requiring_griffs_inflatable_raft(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value,)] - ) - - def test_access_locations_requiring_griffs_inflatable_sea_captain(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value,)] - ) - - def test_access_locations_requiring_hammer(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BOING_BOING_BOING.value, - ZorkGrandInquisitorLocations.BONK.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value, - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HAMMER.value,)] - ) - - def test_access_locations_requiring_hungus_lard(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HUNGUS_LARD.value,)] - ) - - def test_access_locations_requiring_jar_of_hotbugs(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.JAR_OF_HOTBUGS.value,)] - ) - - def test_access_locations_requiring_lantern(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LANTERN.value,)] - ) - - def test_access_locations_requiring_large_telegraph_hammer(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value,)] - ) - - def test_access_locations_requiring_lucys_playing_cards(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value,)] - ) - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value,)] - ) - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value,)] - ) - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value,)] - ) - - def test_access_locations_requiring_map(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.MAP.value,)] - ) - - def test_access_locations_requiring_mead_light(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.MEAD_LIGHT.value, - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.MEAD_LIGHT.value,)] - ) - - def test_access_locations_requiring_moss_of_mareilon(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.MOSS_OF_MAREILON.value,)] - ) - - def test_access_locations_requiring_mug(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.MUG.value,)] - ) - - def test_access_locations_requiring_old_scratch_card(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH.value, - ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER.value, - ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD.value,)] - ) - - def test_access_locations_requiring_perma_suck_machine(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.SUCKING_ROCKS.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE.value,)] - ) - - def test_access_locations_requiring_plastic_six_pack_holder(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE.value, - ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER.value,)] - ) - - def test_access_locations_requiring_pouch_of_zorkmids(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value, - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.DUNCE_LOCKER.value, - ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value, - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value, - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value, - ZorkGrandInquisitorLocations.SOUVENIR.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value,)] - ) - - def test_access_locations_requiring_prozork_tablet(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.PROZORKED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.PROZORK_TABLET.value,)] - ) - - def test_access_locations_requiring_quelbee_honeycomb(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB.value,)] - ) - - def test_access_locations_requiring_rope(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN.value, - ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED.value, - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value, - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ZorkGrandInquisitorLocations.A_SMALLWAY.value, - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value, - ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value, - ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES.value, - ZorkGrandInquisitorLocations.BOING_BOING_BOING.value, - ZorkGrandInquisitorLocations.BONK.value, - ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED.value, - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE.value, - ZorkGrandInquisitorLocations.CAVES_NOTES.value, - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.CRISIS_AVERTED.value, - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL.value, - ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE.value, - ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD.value, - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value, - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value, - ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED.value, - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value, - ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.DUNCE_LOCKER.value, - ZorkGrandInquisitorLocations.EGGPLANTS.value, - ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE.value, - ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value, - ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value, - ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY.value, - ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value, - ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST.value, - ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM.value, - ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO.value, - ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS.value, - ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value, - ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING.value, - ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value, - ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG.value, - ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value, - ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE.value, - ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF.value, - ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI.value, - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value, - ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value, - ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value, - ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value, - ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value, - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value, - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value, - ZorkGrandInquisitorLocations.MAGIC_FOREVER.value, - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value, - ZorkGrandInquisitorLocations.MIKES_PANTS.value, - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR.value, - ZorkGrandInquisitorLocations.NO_BONDAGE.value, - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value, - ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value, - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value, - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.PERMASEAL.value, - ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.PROZORKED.value, - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value, - ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY.value, - ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE.value, - ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorLocations.SOUVENIR.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.SUCKING_ROCKS.value, - ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THATS_A_ROPE.value, - ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS.value, - ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB.value, - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value, - ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value, - ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value, - ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value, - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value, - ZorkGrandInquisitorEvents.CHARON_CALLED.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value, - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.ROPE.value,)] - ) - - def test_access_locations_requiring_scroll_fragment_ans(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS.value,)] - ) - - def test_access_locations_requiring_scroll_fragment_giv(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV.value,)] - ) - - def test_access_locations_requiring_shovel(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SHOVEL.value,)] - ) - - def test_access_locations_requiring_snapdragon(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BOING_BOING_BOING.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SNAPDRAGON.value,)] - ) - - def test_access_locations_requiring_student_id(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.STUDENT_ID.value,)] - ) - - def test_access_locations_requiring_subway_token(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SUBWAY_TOKEN.value,)] - ) - - def test_access_locations_requiring_sword(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value, - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value, - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value, - ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.PERMASEAL.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value, - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SWORD.value,)] - ) - - def test_access_locations_requiring_zimdor_scroll(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value,)] - ) - - def test_access_locations_requiring_zork_rocks(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.ZORK_ROCKS.value,)] - ) - - def test_access_locations_requiring_hotspot_666_mailbox(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX.value,)] - ) - - def test_access_locations_requiring_hotspot_alpines_quandry_card_slots(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value,)] - ) - - def test_access_locations_requiring_hotspot_blank_scroll_box(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX.value,)] - ) - - def test_access_locations_requiring_hotspot_blinds(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value, - ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value,)] - ) - - def test_access_locations_requiring_hotspot_candy_machine_buttons(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DUNCE_LOCKER.value, - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value, - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS.value,)] - ) - - def test_access_locations_requiring_hotspot_candy_machine_coin_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DUNCE_LOCKER.value, - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value, - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_candy_machine_vacuum_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.SUCKING_ROCKS.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_change_machine_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_closet_door(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_closing_the_time_tunnels_hammer_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_closing_the_time_tunnels_lever(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value,)] - ) - - def test_access_locations_requiring_hotspot_cooking_pot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value,)] - ) - - def test_access_locations_requiring_hotspot_dented_locker(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CRISIS_AVERTED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER.value,)] - ) - - def test_access_locations_requiring_hotspot_dirt_mound(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND.value,)] - ) - - def test_access_locations_requiring_hotspot_dock_winch(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE.value, - ZorkGrandInquisitorLocations.NO_BONDAGE.value, - ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH.value,)] - ) - - def test_access_locations_requiring_hotspot_dragon_claw(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value,)] - ) - - def test_access_locations_requiring_hotspot_dragon_nostrils(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value,)] - ) - - def test_access_locations_requiring_hotspot_dungeon_masters_lair_entrance(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value,)] - ) - - def test_access_locations_requiring_hotspot_flood_control_buttons(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,)] - ) - - def test_access_locations_requiring_hotspot_flood_control_doors(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,)] - ) - - def test_access_locations_requiring_hotspot_frozen_treat_machine_coin_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_frozen_treat_machine_doors(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS.value,)] - ) - - def test_access_locations_requiring_hotspot_glass_case(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE.value,)] - ) - - def test_access_locations_requiring_hotspot_grand_inquisitor_doll(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.ARREST_THE_VANDAL.value, - ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK.value, - ZorkGrandInquisitorLocations.FIRE_FIRE.value, - ZorkGrandInquisitorLocations.PLANETFALL.value, - ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR.value, - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,)] - ) - - def test_access_locations_requiring_hotspot_gue_tech_door(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_gue_tech_grass(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS.value,)] - ) - - def test_access_locations_requiring_hotspot_hades_phone_buttons(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value, - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value, - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorEvents.CHARON_CALLED.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value,)] - ) - - def test_access_locations_requiring_hotspot_hades_phone_receiver(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value, - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value, - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorEvents.CHARON_CALLED.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value,)] - ) - - def test_access_locations_requiring_hotspot_harry(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRY.value,)] - ) - - def test_access_locations_requiring_hotspot_harrys_ashtray(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value, - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value,)] - ) - - def test_access_locations_requiring_hotspot_harrys_bird_bath(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value,)] - ) - - def test_access_locations_requiring_hotspot_in_magic_we_trust_door(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_jacks_door(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.MEAD_LIGHT.value, - ZorkGrandInquisitorLocations.NO_AUTOGRAPHS.value, - ZorkGrandInquisitorLocations.THATS_A_ROPE.value, - ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID.value, - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_loudspeaker_volume_buttons(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.THATS_THE_SPIRIT.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS.value,)] - ) - - def test_access_locations_requiring_hotspot_mailbox_door(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_mailbox_flag(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG.value,)] - ) - - def test_access_locations_requiring_hotspot_mirror(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value, - ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_MIRROR.value,)] - ) - - def test_access_locations_requiring_hotspot_monastery_vent(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value, - ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value, - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PERMASEAL.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value,)] - ) - - def test_access_locations_requiring_hotspot_mossy_grate(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE.value,)] - ) - - def test_access_locations_requiring_hotspot_port_foozle_past_tavern_door(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value,)] - ) - - def test_access_locations_requiring_hotspot_purple_words(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_SMALLWAY.value, - ZorkGrandInquisitorLocations.CRISIS_AVERTED.value, - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value,)] - ) - - def test_access_locations_requiring_hotspot_quelbee_hive(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE.value,)] - ) - - def test_access_locations_requiring_hotspot_rope_bridge(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,)] - ) - - def test_access_locations_requiring_hotspot_skull_cage(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value,)] - ) - - def test_access_locations_requiring_hotspot_snapdragon(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BONK.value, - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value, - ZorkGrandInquisitorLocations.PROZORKED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON.value,)] - ) - - def test_access_locations_requiring_hotspot_soda_machine_buttons(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS.value,)] - ) - - def test_access_locations_requiring_hotspot_soda_machine_coin_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_souvenir_coin_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.SOUVENIR.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_spell_checker(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value,)] - ) - - def test_access_locations_requiring_hotspot_spell_lab_chasm(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,)] - ) - - def test_access_locations_requiring_hotspot_spring_mushroom(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BOING_BOING_BOING.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM.value,)] - ) - - def test_access_locations_requiring_hotspot_student_id_machine(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE.value,)] - ) - - def test_access_locations_requiring_hotspot_subway_token_slot(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value,)] - ) - - def test_access_locations_requiring_hotspot_tavern_fly(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value,)] - ) - - def test_access_locations_requiring_hotspot_totemizer_switch(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value,)] - ) - - def test_access_locations_requiring_hotspot_totemizer_wheels(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value,)] - ) - - def test_access_locations_requiring_hotspot_well(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN.value, - ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED.value, - ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value, - ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value, - ZorkGrandInquisitorLocations.A_SMALLWAY.value, - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value, - ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value, - ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES.value, - ZorkGrandInquisitorLocations.BOING_BOING_BOING.value, - ZorkGrandInquisitorLocations.BONK.value, - ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED.value, - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE.value, - ZorkGrandInquisitorLocations.CAVES_NOTES.value, - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.CRISIS_AVERTED.value, - ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL.value, - ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE.value, - ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD.value, - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value, - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value, - ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value, - ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED.value, - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value, - ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR.value, - ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value, - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.DUNCE_LOCKER.value, - ZorkGrandInquisitorLocations.EGGPLANTS.value, - ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE.value, - ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value, - ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value, - ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY.value, - ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value, - ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST.value, - ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM.value, - ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO.value, - ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS.value, - ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value, - ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING.value, - ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value, - ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG.value, - ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value, - ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE.value, - ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF.value, - ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI.value, - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value, - ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value, - ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value, - ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value, - ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value, - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value, - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value, - ZorkGrandInquisitorLocations.MAGIC_FOREVER.value, - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value, - ZorkGrandInquisitorLocations.MIKES_PANTS.value, - ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR.value, - ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value, - ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value, - ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value, - ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value, - ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value, - ZorkGrandInquisitorLocations.PERMASEAL.value, - ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.PROZORKED.value, - ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value, - ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY.value, - ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE.value, - ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorLocations.SOUVENIR.value, - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.SUCKING_ROCKS.value, - ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS.value, - ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value, - ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB.value, - ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value, - ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value, - ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value, - ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value, - ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value, - ZorkGrandInquisitorEvents.CHARON_CALLED.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value, - ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value, - ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value, - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.HOTSPOT_WELL.value,)] - ) - - def test_access_locations_requiring_spell_glorf(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_GLORF.value,)] - ) - - def test_access_locations_requiring_spell_golgatem(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value, - ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value, - ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value, - ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value, - ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value, - ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value, - ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,)] - ) - - def test_access_locations_requiring_spell_igram(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.A_SMALLWAY.value, - ZorkGrandInquisitorLocations.CRISIS_AVERTED.value, - ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value, - ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value, - ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_IGRAM.value,)] - ) - - def test_access_locations_requiring_spell_kendall(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value, - ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_KENDALL.value,)] - ) - - def test_access_locations_requiring_spell_narwile(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_NARWILE.value,)] - ) - - def test_access_locations_requiring_spell_rezrov(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value, - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_REZROV.value,)] - ) - - def test_access_locations_requiring_spell_throck(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value, - ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value, - ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value, - ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value, - ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value, - ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SPELL_THROCK.value,)] - ) - - def test_access_locations_requiring_subway_destination_flood_control_dam(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value, - ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value, - ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value, - ZorkGrandInquisitorLocations.SOUVENIR.value, - ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value, - ZorkGrandInquisitorEvents.DAM_DESTROYED.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value,)] - ) - - def test_access_locations_requiring_subway_destination_hades(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value,)] - ) - - def test_access_locations_requiring_subway_destination_monastery(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value,)] - ) - - def test_access_locations_requiring_teleporter_destination_dm_lair(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,)] - ) - - def test_access_locations_requiring_teleporter_destination_gue_tech(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,)] - ) - - def test_access_locations_requiring_teleporter_destination_hades(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,)] - ) - - def test_access_locations_requiring_teleporter_destination_monastery(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,)] - ) - - def test_access_locations_requiring_teleporter_destination_spell_lab(self) -> None: - locations: List[str] = list() - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,)] - ) - - def test_access_locations_requiring_totemizer_destination_hall_of_inquisition(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value, - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value, - ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value, - ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value, - ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value,)] - ) - - def test_access_locations_requiring_totemizer_destination_straight_to_hell(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL.value,)] - ) - - def test_access_locations_requiring_totem_brog(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.BROG_DO_GOOD.value, - ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value, - ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value, - ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value, - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TOTEM_BROG.value,)] - ) - - def test_access_locations_requiring_totem_griff(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value, - ZorkGrandInquisitorLocations.DOOOOOOWN.value, - ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value, - ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value, - ZorkGrandInquisitorLocations.UUUUUP.value, - ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TOTEM_GRIFF.value,)] - ) - - def test_access_locations_requiring_totem_lucy(self) -> None: - locations: List[str] = [ - ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.DOWN.value, - ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value, - ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value, - ZorkGrandInquisitorLocations.UP.value, - ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value, - ZorkGrandInquisitorEvents.VICTORY.value, - ] - - self.assertAccessDependency( - locations, [(ZorkGrandInquisitorItems.TOTEM_LUCY.value,)] - ) diff --git a/worlds/zork_grand_inquisitor/test/test_data_funcs.py b/worlds/zork_grand_inquisitor/test/test_data_funcs.py deleted file mode 100644 index 9d8d5a4ba3..0000000000 --- a/worlds/zork_grand_inquisitor/test/test_data_funcs.py +++ /dev/null @@ -1,132 +0,0 @@ -import unittest - -from ..data_funcs import location_access_rule_for, entrance_access_rule_for -from ..enums import ZorkGrandInquisitorLocations, ZorkGrandInquisitorRegions - - -class DataFuncsTest(unittest.TestCase): - def test_location_access_rule_for(self) -> None: - # No Requirements - self.assertEqual( - "lambda state: True", - location_access_rule_for(ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN, 1), - ) - - # Single Item Requirement - self.assertEqual( - 'lambda state: state.has("Sword", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY, 1), - ) - - self.assertEqual( - 'lambda state: state.has("Spell: NARWILE", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL, 1), - ) - - # Single Event Requirement - self.assertEqual( - 'lambda state: state.has("Event: Knows OBIDIL", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER, 1), - ) - - self.assertEqual( - 'lambda state: state.has("Event: Dunce Locker Openable", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES, 1), - ) - - # Multiple Item Requirements - self.assertEqual( - 'lambda state: state.has("Hotspot: Purple Words", 1) and state.has("Spell: IGRAM", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.A_SMALLWAY, 1), - ) - - self.assertEqual( - 'lambda state: state.has("Hotspot: Mossy Grate", 1) and state.has("Spell: THROCK", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY, 1), - ) - - # Multiple Item Requirements OR - self.assertEqual( - 'lambda state: (state.has("Totem: Griff", 1) or state.has("Totem: Lucy", 1)) and state.has("Hotspot: Mailbox Door", 1) and state.has("Hotspot: Mailbox Flag", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL, 1), - ) - - # Multiple Mixed Requirements - self.assertEqual( - 'lambda state: state.has("Event: Cigar Accessible", 1) and state.has("Hotspot: Grand Inquisitor Doll", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.ARREST_THE_VANDAL, 1), - ) - - self.assertEqual( - 'lambda state: state.has("Sword", 1) and state.has("Event: Rope GLORFable", 1) and state.has("Hotspot: Monastery Vent", 1)', - location_access_rule_for(ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE, 1), - ) - - def test_entrance_access_rule_for(self) -> None: - # No Requirements - self.assertEqual( - "lambda state: True", - entrance_access_rule_for( - ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE, 1 - ), - ) - - self.assertEqual( - "lambda state: True", - entrance_access_rule_for( - ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.CROSSROADS, 1 - ), - ) - - # Single Requirement - self.assertEqual( - 'lambda state: (state.has("Map", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.CROSSROADS, 1 - ), - ) - - self.assertEqual( - 'lambda state: (state.has("Map", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.CROSSROADS, 1 - ), - ) - - # Multiple Requirements AND - self.assertEqual( - 'lambda state: (state.has("Spell: REZROV", 1) and state.has("Hotspot: In Magic We Trust Door", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH, 1 - ), - ) - - self.assertEqual( - 'lambda state: (state.has("Event: Door Smoked Cigar", 1) and state.has("Event: Door Drank Mead", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, 1 - ), - ) - - self.assertEqual( - 'lambda state: (state.has("Hotspot: Closet Door", 1) and state.has("Spell: NARWILE", 1) and state.has("Event: Knows YASTARD", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE, 1 - ), - ) - - # Multiple Requirements AND + OR - self.assertEqual( - 'lambda state: (state.has("Sword", 1) and state.has("Hotspot: Dungeon Master\'s Lair Entrance", 1)) or (state.has("Map", 1) and state.has("Teleporter Destination: Dungeon Master\'s Lair", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.DM_LAIR, 1 - ), - ) - - # Multiple Requirements Regions - self.assertEqual( - 'lambda state: (state.has("Griff\'s Air Pump", 1) and state.has("Griff\'s Inflatable Raft", 1) and state.has("Griff\'s Inflatable Sea Captain", 1) and state.has("Hotspot: Dragon Nostrils", 1) and state.has("Griff\'s Dragon Tooth", 1) and state.can_reach("Port Foozle Past - Tavern", "Region", 1) and state.has("Lucy\'s Playing Card: 1 Pip", 1) and state.has("Lucy\'s Playing Card: 2 Pips", 1) and state.has("Lucy\'s Playing Card: 3 Pips", 1) and state.has("Lucy\'s Playing Card: 4 Pips", 1) and state.has("Hotspot: Tavern Fly", 1) and state.has("Hotspot: Alpine\'s Quandry Card Slots", 1) and state.can_reach("White House", "Region", 1) and state.has("Totem: Brog", 1) and state.has("Brog\'s Flickering Torch", 1) and state.has("Brog\'s Grue Egg", 1) and state.has("Hotspot: Cooking Pot", 1) and state.has("Brog\'s Plank", 1) and state.has("Hotspot: Skull Cage", 1))', - entrance_access_rule_for( - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.ENDGAME, 1 - ), - ) diff --git a/worlds/zork_grand_inquisitor/test/test_locations.py b/worlds/zork_grand_inquisitor/test/test_locations.py deleted file mode 100644 index fa576dd510..0000000000 --- a/worlds/zork_grand_inquisitor/test/test_locations.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Dict, Set - -from . import ZorkGrandInquisitorTestBase - -from ..data_funcs import location_names_to_location, locations_with_tag -from ..enums import ZorkGrandInquisitorLocations, ZorkGrandInquisitorTags - - -class LocationsTestNoDeathsanity(ZorkGrandInquisitorTestBase): - options = { - "deathsanity": "false", - } - - def test_correct_locations_exist(self) -> None: - expected_locations: Set[ZorkGrandInquisitorLocations] = locations_with_tag( - ZorkGrandInquisitorTags.CORE - ) - - self._assert_expected_locations_exist(expected_locations) - - def _assert_expected_locations_exist(self, expected_locations: Set[ZorkGrandInquisitorLocations]) -> None: - location_name_to_location: Dict[str, ZorkGrandInquisitorLocations] = location_names_to_location() - - for location_object in self.multiworld.get_locations(1): - location: ZorkGrandInquisitorLocations = location_name_to_location.get( - location_object.name - ) - - if location is None: - continue - - self.assertIn(location, expected_locations) - - expected_locations.remove(location) - - self.assertEqual(0, len(expected_locations)) - - -class LocationsTestDeathsanity(LocationsTestNoDeathsanity): - options = { - "deathsanity": "true", - } - - def test_correct_locations_exist(self) -> None: - expected_locations: Set[ZorkGrandInquisitorLocations] = ( - locations_with_tag(ZorkGrandInquisitorTags.CORE) | locations_with_tag(ZorkGrandInquisitorTags.DEATHSANITY) - ) - - self._assert_expected_locations_exist(expected_locations) diff --git a/worlds/zork_grand_inquisitor/world.py b/worlds/zork_grand_inquisitor/world.py deleted file mode 100644 index 3698ad7f89..0000000000 --- a/worlds/zork_grand_inquisitor/world.py +++ /dev/null @@ -1,205 +0,0 @@ -from typing import Any, Dict, List, Tuple - -from BaseClasses import Item, ItemClassification, Location, Region, Tutorial - -from worlds.AutoWorld import WebWorld, World - -from .data.item_data import item_data, ZorkGrandInquisitorItemData -from .data.location_data import location_data, ZorkGrandInquisitorLocationData -from .data.region_data import region_data - -from .data_funcs import ( - item_names_to_id, - item_names_to_item, - location_names_to_id, - item_groups, - items_with_tag, - location_groups, - locations_by_region, - location_access_rule_for, - entrance_access_rule_for, -) - -from .enums import ( - ZorkGrandInquisitorEvents, - ZorkGrandInquisitorItems, - ZorkGrandInquisitorLocations, - ZorkGrandInquisitorRegions, - ZorkGrandInquisitorTags, -) - -from .options import ZorkGrandInquisitorOptions - - -class ZorkGrandInquisitorItem(Item): - game = "Zork Grand Inquisitor" - - -class ZorkGrandInquisitorLocation(Location): - game = "Zork Grand Inquisitor" - - -class ZorkGrandInquisitorWebWorld(WebWorld): - theme: str = "stone" - - tutorials: List[Tutorial] = [ - Tutorial( - "Multiworld Setup Guide", - "A guide to setting up the Zork Grand Inquisitor randomizer connected to an Archipelago Multiworld", - "English", - "setup_en.md", - "setup/en", - ["Serpent.AI"], - ) - ] - - -class ZorkGrandInquisitorWorld(World): - """ - Zork: Grand Inquisitor is a 1997 point-and-click adventure game for PC. - Magic has been banned from the great Underground Empire of Zork. By edict of the Grand Inquisitor Mir Yannick, the - Empire has been sealed off and the practice of mystic arts declared punishable by "Totemization" (a very bad thing). - The only way to restore magic to the kingdom is to find three hidden artifacts: The Coconut of Quendor, The Cube of - Foundation, and The Skull of Yoruk. - """ - - options_dataclass = ZorkGrandInquisitorOptions - options: ZorkGrandInquisitorOptions - - game = "Zork Grand Inquisitor" - - item_name_to_id = item_names_to_id() - location_name_to_id = location_names_to_id() - - item_name_groups = item_groups() - location_name_groups = location_groups() - - required_client_version: Tuple[int, int, int] = (0, 4, 4) - - web = ZorkGrandInquisitorWebWorld() - - filler_item_names: List[str] = item_groups()["Filler"] - item_name_to_item: Dict[str, ZorkGrandInquisitorItems] = item_names_to_item() - - def create_regions(self) -> None: - deathsanity: bool = bool(self.options.deathsanity) - - region_mapping: Dict[ZorkGrandInquisitorRegions, Region] = dict() - - region_enum_item: ZorkGrandInquisitorRegions - for region_enum_item in region_data.keys(): - region_mapping[region_enum_item] = Region(region_enum_item.value, self.player, self.multiworld) - - region_locations_mapping: Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]] - region_locations_mapping = locations_by_region(include_deathsanity=deathsanity) - - region_enum_item: ZorkGrandInquisitorRegions - region: Region - for region_enum_item, region in region_mapping.items(): - regions_locations: List[ZorkGrandInquisitorLocations] = region_locations_mapping[region_enum_item] - - # Locations - location_enum_item: ZorkGrandInquisitorLocations - for location_enum_item in regions_locations: - data: ZorkGrandInquisitorLocationData = location_data[location_enum_item] - - location: ZorkGrandInquisitorLocation = ZorkGrandInquisitorLocation( - self.player, - location_enum_item.value, - data.archipelago_id, - region_mapping[data.region], - ) - - if isinstance(location_enum_item, ZorkGrandInquisitorEvents): - location.place_locked_item( - ZorkGrandInquisitorItem( - data.event_item_name, - ItemClassification.progression, - None, - self.player, - ) - ) - - location_access_rule: str = location_access_rule_for(location_enum_item, self.player) - - if location_access_rule != "lambda state: True": - location.access_rule = eval(location_access_rule) - - region.locations.append(location) - - # Connections - region_exit: ZorkGrandInquisitorRegions - for region_exit in region_data[region_enum_item].exits or tuple(): - entrance_access_rule: str = entrance_access_rule_for(region_enum_item, region_exit, self.player) - - if entrance_access_rule == "lambda state: True": - region.connect(region_mapping[region_exit]) - else: - region.connect(region_mapping[region_exit], rule=eval(entrance_access_rule)) - - self.multiworld.regions.append(region) - - def create_items(self) -> None: - quick_port_foozle: bool = bool(self.options.quick_port_foozle) - start_with_hotspot_items: bool = bool(self.options.start_with_hotspot_items) - - item_pool: List[ZorkGrandInquisitorItem] = list() - - item: ZorkGrandInquisitorItems - data: ZorkGrandInquisitorItemData - for item, data in item_data.items(): - tags: Tuple[ZorkGrandInquisitorTags, ...] = data.tags or tuple() - - if ZorkGrandInquisitorTags.FILLER in tags: - continue - elif ZorkGrandInquisitorTags.HOTSPOT in tags and start_with_hotspot_items: - continue - - item_pool.append(self.create_item(item.value)) - - total_locations: int = len(self.multiworld.get_unfilled_locations(self.player)) - item_pool += [self.create_filler() for _ in range(total_locations - len(item_pool))] - - self.multiworld.itempool += item_pool - - if quick_port_foozle: - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.ROPE.value] = 1 - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.LANTERN.value] = 1 - - if not start_with_hotspot_items: - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.HOTSPOT_WELL.value] = 1 - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value] = 1 - - self.multiworld.early_items[self.player][ - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value - ] = 1 - - if start_with_hotspot_items: - item: ZorkGrandInquisitorItems - for item in sorted(items_with_tag(ZorkGrandInquisitorTags.HOTSPOT), key=lambda item: item.name): - self.multiworld.push_precollected(self.create_item(item.value)) - - def create_item(self, name: str) -> ZorkGrandInquisitorItem: - data: ZorkGrandInquisitorItemData = item_data[self.item_name_to_item[name]] - - return ZorkGrandInquisitorItem( - name, - data.classification, - data.archipelago_id, - self.player, - ) - - def generate_basic(self) -> None: - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) - - def fill_slot_data(self) -> Dict[str, Any]: - return self.options.as_dict( - "goal", - "quick_port_foozle", - "start_with_hotspot_items", - "deathsanity", - "grant_missable_location_checks", - ) - - def get_filler_item_name(self) -> str: - return self.random.choice(self.filler_item_names) From 2624a0a7ead232c8aa9f73c80d008fb1315bf02c Mon Sep 17 00:00:00 2001 From: KonoTyran Date: Fri, 25 Apr 2025 11:54:53 -0700 Subject: [PATCH 084/199] Remove Slay the Spire (#4673) * Remove Slay the Spire * remove slay the spire --- README.md | 1 - docs/CODEOWNERS | 3 - docs/network diagram/network diagram.md | 2 - setup.py | 1 - worlds/generic/docs/advanced_settings_en.md | 4 +- worlds/generic/docs/plando_en.md | 21 ++-- worlds/spire/Items.py | 39 -------- worlds/spire/Locations.py | 35 ------- worlds/spire/Options.py | 74 -------------- worlds/spire/Regions.py | 11 --- worlds/spire/Rules.py | 74 -------------- worlds/spire/__init__.py | 103 -------------------- worlds/spire/docs/en_Slay the Spire.md | 35 ------- worlds/spire/docs/slay-the-spire_en.md | 69 ------------- 14 files changed, 8 insertions(+), 464 deletions(-) delete mode 100644 worlds/spire/Items.py delete mode 100644 worlds/spire/Locations.py delete mode 100644 worlds/spire/Options.py delete mode 100644 worlds/spire/Regions.py delete mode 100644 worlds/spire/Rules.py delete mode 100644 worlds/spire/__init__.py delete mode 100644 worlds/spire/docs/en_Slay the Spire.md delete mode 100644 worlds/spire/docs/slay-the-spire_en.md diff --git a/README.md b/README.md index 83fdeea611..c1e89bac7c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Currently, the following games are supported: * Factorio * Minecraft * Subnautica -* Slay the Spire * Risk of Rain 2 * The Legend of Zelda: Ocarina of Time * Timespinner diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 88b5060dcc..dee8a6fd25 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -184,9 +184,6 @@ # Secret of Evermore /worlds/soe/ @black-sliver -# Slay the Spire -/worlds/spire/ @KonoTyran - # Stardew Valley /worlds/stardew_valley/ @agilbert1412 diff --git a/docs/network diagram/network diagram.md b/docs/network diagram/network diagram.md index cd61d9fefd..d660e8889e 100644 --- a/docs/network diagram/network diagram.md +++ b/docs/network diagram/network diagram.md @@ -117,8 +117,6 @@ flowchart LR %% Java Based Games subgraph Java JM[Mod with Archipelago.MultiClient.Java] - STS[Slay the Spire] - JM <-- Mod the Spire --> STS subgraph Minecraft MCS[Minecraft Forge Server] JMC[Any Java Minecraft Clients] diff --git a/setup.py b/setup.py index ebef215e2d..8d415932d0 100644 --- a/setup.py +++ b/setup.py @@ -72,7 +72,6 @@ non_apworlds: Set[str] = { "Ocarina of Time", "Overcooked! 2", "Raft", - "Slay the Spire", "Sudoku", "Super Mario 64", "VVVVVV", diff --git a/worlds/generic/docs/advanced_settings_en.md b/worlds/generic/docs/advanced_settings_en.md index e78eb91592..6f0520febc 100644 --- a/worlds/generic/docs/advanced_settings_en.md +++ b/worlds/generic/docs/advanced_settings_en.md @@ -278,7 +278,7 @@ one file, removing the need to manage separate files if one chooses to do so. As a precautionary measure, before submitting a multi-game yaml like this one in a synchronous/sync multiworld, please confirm that the other players in the multi are OK with what you are submitting, and please be fairly reasonable about the submission. (i.e. Multiple long games (SMZ3, OoT, HK, etc.) for a game intended to be <2 hrs is not likely considered -reasonable, but submitting a ChecksFinder alongside another game OR submitting multiple Slay the Spire runs is likely +reasonable, but submitting a ChecksFinder alongside another game is likely OK) To configure your file to generate multiple worlds, use 3 dashes `---` on an empty line to separate the ending of one @@ -335,7 +335,7 @@ Minecraft: --- -description: Example of generating multiple worlds. World 3 of 3 +description: Example of generating multiple worlds. World 2 of 2 name: ExampleFinder game: ChecksFinder diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index 1980e81cbc..9469624762 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -104,15 +104,7 @@ A list of all available items and locations can be found in the [website's datap - Spirit Temple Silver Gauntlets Chest world: false - # example block 3 - Slay the Spire - - items: - Boss Relic: 3 - locations: - - Boss Relic 1 - - Boss Relic 2 - - Boss Relic 3 - - # example block 4 - Factorio + # example block 3 - Factorio - items: progressive-electric-energy-distribution: 2 electric-energy-accumulators: 1 @@ -125,7 +117,7 @@ A list of all available items and locations can be found in the [website's datap percentage: 80 force: true - # example block 5 - Secret of Evermore + # example block 4 - Secret of Evermore - items: Levitate: 1 Revealer: 1 @@ -136,7 +128,7 @@ A list of all available items and locations can be found in the [website's datap world: true count: 2 - # example block 6 - A Link to the Past + # example block 5 - A Link to the Past - items: Progressive Sword: 4 world: @@ -150,12 +142,11 @@ A list of all available items and locations can be found in the [website's datap player's Starter Chest 1 and removes the chosen item from the item pool. 2. This block will always trigger and will place the player's swords, bow, magic meter, strength upgrades, and hookshots in their own dungeon major item chests. -3. This block will always trigger and will lock boss relics on the bosses. -4. This block has an 80% chance of occurring, and when it does, it will place all but 1 of the items randomly among the +3. This block has an 80% chance of occurring, and when it does, it will place all but 1 of the items randomly among the four locations chosen here. -5. This block will always trigger and will attempt to place a random 2 of Levitate, Revealer and Energize into +4. This block will always trigger and will attempt to place a random 2 of Levitate, Revealer and Energize into other players' Master Sword Pedestals or Boss Relic 1 locations. -6. This block will always trigger and will attempt to place a random number, between 1 and 4, of progressive swords +5. This block will always trigger and will attempt to place a random number, between 1 and 4, of progressive swords into any locations within the game slots named BobsSlaytheSpire and BobsRogueLegacy. diff --git a/worlds/spire/Items.py b/worlds/spire/Items.py deleted file mode 100644 index 188b1e031e..0000000000 --- a/worlds/spire/Items.py +++ /dev/null @@ -1,39 +0,0 @@ -import typing - -from BaseClasses import Item -from typing import Dict - - -class ItemData(typing.NamedTuple): - code: typing.Optional[int] - progression: bool - event: bool = False - - -item_table: Dict[str, ItemData] = { - 'Card Draw': ItemData(8000, True), - 'Rare Card Draw': ItemData(8001, True), - 'Relic': ItemData(8002, True), - 'Boss Relic': ItemData(8003, True), - - # Event Items - 'Victory': ItemData(None, True, True), - 'Beat Act 1 Boss': ItemData(None, True, True), - 'Beat Act 2 Boss': ItemData(None, True, True), - 'Beat Act 3 Boss': ItemData(None, True, True), - -} - -item_pool: Dict[str, int] = { - 'Card Draw': 15, - 'Rare Card Draw': 2, - 'Relic': 10, - 'Boss Relic': 2 -} - -event_item_pairs: Dict[str, str] = { - "Heart Room": "Victory", - "Act 1 Boss": "Beat Act 1 Boss", - "Act 2 Boss": "Beat Act 2 Boss", - "Act 3 Boss": "Beat Act 3 Boss" -} diff --git a/worlds/spire/Locations.py b/worlds/spire/Locations.py deleted file mode 100644 index e20ab6f552..0000000000 --- a/worlds/spire/Locations.py +++ /dev/null @@ -1,35 +0,0 @@ -location_table = { - 'Card Draw 1': 19001, - 'Card Draw 2': 19002, - 'Card Draw 3': 19003, - 'Card Draw 4': 19004, - 'Card Draw 5': 19005, - 'Card Draw 6': 19006, - 'Card Draw 7': 19007, - 'Card Draw 8': 19008, - 'Card Draw 9': 19009, - 'Card Draw 10': 19010, - 'Card Draw 11': 19011, - 'Card Draw 12': 19012, - 'Card Draw 13': 19013, - 'Card Draw 14': 19014, - 'Card Draw 15': 19015, - 'Rare Card Draw 1': 21001, - 'Rare Card Draw 2': 21002, - 'Relic 1': 20001, - 'Relic 2': 20002, - 'Relic 3': 20003, - 'Relic 4': 20004, - 'Relic 5': 20005, - 'Relic 6': 20006, - 'Relic 7': 20007, - 'Relic 8': 20008, - 'Relic 9': 20009, - 'Relic 10': 20010, - 'Boss Relic 1': 22001, - 'Boss Relic 2': 22002, - 'Heart Room': None, - 'Act 1 Boss': None, - 'Act 2 Boss': None, - 'Act 3 Boss': None -} \ No newline at end of file diff --git a/worlds/spire/Options.py b/worlds/spire/Options.py deleted file mode 100644 index 9c94756600..0000000000 --- a/worlds/spire/Options.py +++ /dev/null @@ -1,74 +0,0 @@ -import typing -from dataclasses import dataclass - -from Options import TextChoice, Range, Toggle, PerGameCommonOptions - - -class Character(TextChoice): - """Enter the internal ID of the character to use. - - if you don't know the exact ID to enter with the mod installed go to - `Mods -> Archipelago Multi-world -> config` to view a list of installed modded character IDs. - - the downfall characters will only work if you have downfall installed. - - Spire Take the Wheel will have your client pick a random character from the list of all your installed characters - including custom ones. - - if the chosen character mod is not installed it will default back to 'The Ironclad' - """ - display_name = "Character" - option_The_Ironclad = 0 - option_The_Silent = 1 - option_The_Defect = 2 - option_The_Watcher = 3 - option_The_Hermit = 4 - option_The_Slime_Boss = 5 - option_The_Guardian = 6 - option_The_Hexaghost = 7 - option_The_Champ = 8 - option_The_Gremlins = 9 - option_The_Automaton = 10 - option_The_Snecko = 11 - option_spire_take_the_wheel = 12 - - -class Ascension(Range): - """What Ascension do you wish to play with.""" - display_name = "Ascension" - range_start = 0 - range_end = 20 - default = 0 - - -class FinalAct(Toggle): - """Whether you will need to collect the 3 keys and beat the final act to complete the game.""" - display_name = "Final Act" - option_true = 1 - option_false = 0 - default = 0 - - -class Downfall(Toggle): - """When Downfall is Installed this will switch the played mode to Downfall""" - display_name = "Downfall" - option_true = 1 - option_false = 0 - default = 0 - - -class DeathLink(Range): - """Percentage of health to lose when a death link is received.""" - display_name = "Death Link %" - range_start = 0 - range_end = 100 - default = 0 - - -@dataclass -class SpireOptions(PerGameCommonOptions): - character: Character - ascension: Ascension - final_act: FinalAct - downfall: Downfall - death_link: DeathLink diff --git a/worlds/spire/Regions.py b/worlds/spire/Regions.py deleted file mode 100644 index 9e2ac0d355..0000000000 --- a/worlds/spire/Regions.py +++ /dev/null @@ -1,11 +0,0 @@ -def create_regions(world, player: int): - from . import create_region - from .Locations import location_table - - world.regions += [ - create_region(world, player, 'Menu', None, ['Neow\'s Room']), - create_region(world, player, 'The Spire', [location for location in location_table]) - ] - - # link up our region with the entrance we just made - world.get_entrance('Neow\'s Room', player).connect(world.get_region('The Spire', player)) diff --git a/worlds/spire/Rules.py b/worlds/spire/Rules.py deleted file mode 100644 index 3c6f09b34d..0000000000 --- a/worlds/spire/Rules.py +++ /dev/null @@ -1,74 +0,0 @@ -from BaseClasses import MultiWorld -from ..AutoWorld import LogicMixin -from ..generic.Rules import set_rule - - -class SpireLogic(LogicMixin): - def _spire_has_relics(self, player: int, amount: int) -> bool: - count: int = self.count("Relic", player) + self.count("Boss Relic", player) - return count >= amount - - def _spire_has_cards(self, player: int, amount: int) -> bool: - count = self.count("Card Draw", player) + self.count("Rare Card Draw", player) - return count >= amount - - -def set_rules(world: MultiWorld, player: int): - - # Act 1 Card Draws - set_rule(world.get_location("Card Draw 1", player), lambda state: True) - set_rule(world.get_location("Card Draw 2", player), lambda state: True) - set_rule(world.get_location("Card Draw 3", player), lambda state: True) - set_rule(world.get_location("Card Draw 4", player), lambda state: state._spire_has_relics(player, 1)) - set_rule(world.get_location("Card Draw 5", player), lambda state: state._spire_has_relics(player, 1)) - - # Act 1 Relics - set_rule(world.get_location("Relic 1", player), lambda state: state._spire_has_cards(player, 1)) - set_rule(world.get_location("Relic 2", player), lambda state: state._spire_has_cards(player, 2)) - set_rule(world.get_location("Relic 3", player), lambda state: state._spire_has_cards(player, 2)) - - # Act 1 Boss Event - set_rule(world.get_location("Act 1 Boss", player), lambda state: state._spire_has_cards(player, 3) and state._spire_has_relics(player, 2)) - - # Act 1 Boss Rewards - set_rule(world.get_location("Rare Card Draw 1", player), lambda state: state.has("Beat Act 1 Boss", player)) - set_rule(world.get_location("Boss Relic 1", player), lambda state: state.has("Beat Act 1 Boss", player)) - - # Act 2 Card Draws - set_rule(world.get_location("Card Draw 6", player), lambda state: state.has("Beat Act 1 Boss", player)) - set_rule(world.get_location("Card Draw 7", player), lambda state: state.has("Beat Act 1 Boss", player)) - set_rule(world.get_location("Card Draw 8", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 6) and state._spire_has_relics(player, 3)) - set_rule(world.get_location("Card Draw 9", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 6) and state._spire_has_relics(player, 4)) - set_rule(world.get_location("Card Draw 10", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 7) and state._spire_has_relics(player, 4)) - - # Act 2 Relics - set_rule(world.get_location("Relic 4", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 7) and state._spire_has_relics(player, 2)) - set_rule(world.get_location("Relic 5", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 7) and state._spire_has_relics(player, 2)) - set_rule(world.get_location("Relic 6", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 7) and state._spire_has_relics(player, 3)) - - # Act 2 Boss Event - set_rule(world.get_location("Act 2 Boss", player), lambda state: state.has("Beat Act 1 Boss", player) and state._spire_has_cards(player, 7) and state._spire_has_relics(player, 4) and state.has("Boss Relic", player)) - - # Act 2 Boss Rewards - set_rule(world.get_location("Rare Card Draw 2", player), lambda state: state.has("Beat Act 2 Boss", player)) - set_rule(world.get_location("Boss Relic 2", player), lambda state: state.has("Beat Act 2 Boss", player)) - - # Act 3 Card Draws - set_rule(world.get_location("Card Draw 11", player), lambda state: state.has("Beat Act 2 Boss", player)) - set_rule(world.get_location("Card Draw 12", player), lambda state: state.has("Beat Act 2 Boss", player)) - set_rule(world.get_location("Card Draw 13", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 4)) - set_rule(world.get_location("Card Draw 14", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 4)) - set_rule(world.get_location("Card Draw 15", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 4)) - - # Act 3 Relics - set_rule(world.get_location("Relic 7", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 4)) - set_rule(world.get_location("Relic 8", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 5)) - set_rule(world.get_location("Relic 9", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 5)) - set_rule(world.get_location("Relic 10", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 5)) - - # Act 3 Boss Event - set_rule(world.get_location("Act 3 Boss", player), lambda state: state.has("Beat Act 2 Boss", player) and state._spire_has_relics(player, 7) and state.has("Boss Relic", player, 2)) - - set_rule(world.get_location("Heart Room", player), lambda state: state.has("Beat Act 3 Boss", player)) - - world.completion_condition[player] = lambda state: state.has("Victory", player) diff --git a/worlds/spire/__init__.py b/worlds/spire/__init__.py deleted file mode 100644 index a0a6a794d8..0000000000 --- a/worlds/spire/__init__.py +++ /dev/null @@ -1,103 +0,0 @@ -import string - -from BaseClasses import Entrance, Item, ItemClassification, Location, MultiWorld, Region, Tutorial -from .Items import event_item_pairs, item_pool, item_table -from .Locations import location_table -from .Options import SpireOptions -from .Regions import create_regions -from .Rules import set_rules -from ..AutoWorld import WebWorld, World - - -class SpireWeb(WebWorld): - tutorials = [Tutorial( - "Multiworld Setup Guide", - "A guide to setting up Slay the Spire for Archipelago. " - "This guide covers single-player, multiworld, and related software.", - "English", - "slay-the-spire_en.md", - "slay-the-spire/en", - ["Phar"] - )] - - -class SpireWorld(World): - """ - A deck-building roguelike where you must craft a unique deck, encounter bizarre creatures, discover relics of - immense power, and Slay the Spire! - """ - - options_dataclass = SpireOptions - options: SpireOptions - game = "Slay the Spire" - topology_present = False - web = SpireWeb() - required_client_version = (0, 3, 7) - - item_name_to_id = {name: data.code for name, data in item_table.items()} - location_name_to_id = location_table - - def create_items(self): - # Fill out our pool with our items from item_pool, assuming 1 item if not present in item_pool - pool = [] - for name, data in item_table.items(): - if not data.event: - for amount in range(item_pool.get(name, 1)): - item = SpireItem(name, self.player) - pool.append(item) - - self.multiworld.itempool += pool - - # Pair up our event locations with our event items - for event, item in event_item_pairs.items(): - event_item = SpireItem(item, self.player) - self.multiworld.get_location(event, self.player).place_locked_item(event_item) - - def set_rules(self): - set_rules(self.multiworld, self.player) - - def create_item(self, name: str) -> Item: - return SpireItem(name, self.player) - - def create_regions(self): - create_regions(self.multiworld, self.player) - - def fill_slot_data(self) -> dict: - slot_data = { - 'seed': "".join(self.random.choice(string.ascii_letters) for i in range(16)) - } - slot_data.update(self.options.as_dict("character", "ascension", "final_act", "downfall", "death_link")) - return slot_data - - def get_filler_item_name(self) -> str: - return self.random.choice(["Card Draw", "Card Draw", "Card Draw", "Relic", "Relic"]) - - -def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): - ret = Region(name, player, world) - if locations: - for location in locations: - loc_id = location_table.get(location, 0) - location = SpireLocation(player, location, loc_id, ret) - ret.locations.append(location) - if exits: - for exit in exits: - ret.exits.append(Entrance(player, exit, ret)) - - return ret - - -class SpireLocation(Location): - game: str = "Slay the Spire" - - -class SpireItem(Item): - game = "Slay the Spire" - - def __init__(self, name, player: int = None): - item_data = item_table[name] - super(SpireItem, self).__init__( - name, - ItemClassification.progression if item_data.progression else ItemClassification.filler, - item_data.code, player - ) diff --git a/worlds/spire/docs/en_Slay the Spire.md b/worlds/spire/docs/en_Slay the Spire.md deleted file mode 100644 index 4591db58dc..0000000000 --- a/worlds/spire/docs/en_Slay the Spire.md +++ /dev/null @@ -1,35 +0,0 @@ -# Slay the Spire (PC) - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure and export a -config file. - -## What does randomization do to this game? - -Every non-boss relic drop, every boss relic and rare card drop, and every other card draw is replaced with an -archipelago item. In heart runs, the blue key is also disconnected from the Archipelago item, so you can gather both. - -## What items and locations get shuffled? - -15 card packs, 10 relics, and 3 boss relics and rare card drops are shuffled into the item pool and can be found at any -location that would normally give you these items, except for card packs, which are found at every other normal enemy -encounter. - -## Which items can be in another player's world? - -Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit -certain items to your own world. - -## When the player receives an item, what happens? - -When the player receives an item, you will see the counter in the top right corner with the Archipelago symbol increment -by one. By clicking on this icon, it'll open a menu that lists all the items you received, but have not yet accepted. -You can take any relics and card packs sent to you and add them to your current run. It is advised that you do not open -this menu until you are outside an encounter or event to prevent the game from soft-locking. - -## What happens if a player dies in a run? - -When a player dies, they will be taken back to the main menu and will need to reconnect to start climbing the spire from -the beginning, but they will have access to all the items ever sent to them in the Archipelago menu in the top right. -Any items found in an earlier run will not be sent again if you encounter them in the same location. diff --git a/worlds/spire/docs/slay-the-spire_en.md b/worlds/spire/docs/slay-the-spire_en.md deleted file mode 100644 index daeb654151..0000000000 --- a/worlds/spire/docs/slay-the-spire_en.md +++ /dev/null @@ -1,69 +0,0 @@ -# Slay the Spire Setup Guide - -## Required Software - -For Steam-based installation, subscribe to the following mods: - -- [ModTheSpire](https://steamcommunity.com/sharedfiles/filedetails/?id=1605060445) -- [BaseMod](https://steamcommunity.com/workshop/filedetails/?id=1605833019) -- [Archipelago Multiworld Randomizer](https://steamcommunity.com/sharedfiles/filedetails/?id=2596397288) -- (optional) [Downfall](https://steamcommunity.com/sharedfiles/filedetails/?id=1610056683) -- (required for downfall) [StSLib](https://steamcommunity.com/workshop/filedetails/?id=1609158507) - -For GOG or Xbox PC Game Pass installation: - -1. Download the official Steam Console Client [SteamCMD](https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip). -2. Unpack that .zip file into some folder and double-click on `steamcmd.exe`. -3. The client will now update itself. When it's ready type `login anonymous`. Now you are ready to download the actual - mods. -4. Run the following commands to download the required mod files: - - Mod the Spire: `workshop_download_item 646570 1605060445` - - BaseMod: `workshop_download_item 646570 1605833019` - - ArchipelagoMW: `workshop_download_item 646570 2596397288` - - (optional) Downfall: `workshop_download_item 646570 1610056683` - - (required for Downfall) StSLib: `workshop_download_item 646570 1609158507` -5. Open your Slay the Spire installation directory. By default on GOG this is `C:\GOG Games\Slay the Spire`, on PC Game - Pass this is `C:\XboxGames\Slay The Spire\Content`. -6. In the folder where you unzipped SteamCMD there will now be a `steamapps` folder. Copy ModTheSpire.jar from - `steamapps\workshop\content\646570\1605060445\ModTheSpire.jar` to your Slay The Spire installation directory. -7. Create a folder named `mods` inside the Slay the Spire installation directory. Each folder inside - `steamapps\workshop\content\646570` will have a single .jar file. Copy each of them except ModTheSpire.jar into the - `mods` folder you made. -8. Now open Notepad. Paste in the following text: `jre\bin\java.exe -jar ModTheSpire.jar`. Go to "File -> Save as" and - save it into your Slay the Spire installation directory with the name `"start.bat"`. Make sure to include the quotes - in the file name! - -## Configuring your YAML file - -### What is a YAML file and why do I need one? - -Your YAML file contains a set of configuration options which provide the generator with information about how it should -generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy -an experience customized for their taste, and different players in the same multiworld can all have different options. - -### Where do I get a YAML file? - -you can customize your options by visiting -the [Slay the Spire Options Page](/games/Slay%20the%20Spire/player-options). - -### Connect to the MultiServer - -For Steam-based installations, if you are subscribed to ModTheSpire, when you launch the game, you should have the -option to launch the game with mods. - -For GOG or Xbox PC Game Pass intallations, launch the game by double-clicking the `start.bat` file you created earlier -which will give you the option to launch the game with mods. - -On the mod loader screen, ensure you only have the following mods enabled and then start the game: - -- BaseMod -- Archipelago Multiworld Randomizer - -If playing with Downfall, also make sure the following are enabled: - -- Downfall -- StSLib - -Once you are in-game, you will be able to click the **Archipelago** menu option and enter the ip and port (separated by -a colon) in the hostname field and enter your player slot name in the Slot Name field. Then click connect, and now you -are ready to climb the spire! From 0d9967e8d8720d4721cc8ca3a2684830df512518 Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Sat, 26 Apr 2025 13:28:07 -0400 Subject: [PATCH 085/199] OC2: Account for Multiclass Items in Progression Balancing (#4929) --- worlds/overcooked2/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/overcooked2/__init__.py b/worlds/overcooked2/__init__.py index 44227d4bec..1691d27ad8 100644 --- a/worlds/overcooked2/__init__.py +++ b/worlds/overcooked2/__init__.py @@ -173,7 +173,7 @@ class Overcooked2World(World): game_item_count = len(self.itempool) game_progression_count = 0 for item in self.itempool: - if item.classification == ItemClassification.progression: + if item.advancement: game_progression_count += 1 game_progression_density = game_progression_count/game_item_count @@ -189,7 +189,7 @@ class Overcooked2World(World): total_progression_count = 0 for item in self.multiworld.itempool: - if item.classification == ItemClassification.progression: + if item.advancement: total_progression_count += 1 total_progression_density = total_progression_count/total_item_count From 4e3da005d4a814e80939a17f369d22f7c1803a9f Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Sun, 27 Apr 2025 03:43:24 -0400 Subject: [PATCH 086/199] TWW: Fix generation failure with output file (#4932) --- worlds/tww/Options.py | 63 ++++++++++++++++++++++++++++++++++++++++++ worlds/tww/__init__.py | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/worlds/tww/Options.py b/worlds/tww/Options.py index 6e7724e2a1..d37de3acf4 100644 --- a/worlds/tww/Options.py +++ b/worlds/tww/Options.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from typing import Any from Options import ( Choice, @@ -752,6 +753,68 @@ class TWWOptions(PerGameCommonOptions): remove_music: RemoveMusic death_link: DeathLink + def get_output_dict(self) -> dict[str, Any]: + """ + Returns a dictionary of option name to value to be placed in + the output APTWW file. + + :return: Dictionary of option name to value for the output file. + """ + + # Note: these options' values must be able to be passed through + # `yaml.safe_dump`. + return self.as_dict( + "progression_dungeons", + "progression_tingle_chests", + "progression_dungeon_secrets", + "progression_puzzle_secret_caves", + "progression_combat_secret_caves", + "progression_savage_labyrinth", + "progression_great_fairies", + "progression_short_sidequests", + "progression_long_sidequests", + "progression_spoils_trading", + "progression_minigames", + "progression_battlesquid", + "progression_free_gifts", + "progression_mail", + "progression_platforms_rafts", + "progression_submarines", + "progression_eye_reef_chests", + "progression_big_octos_gunboats", + "progression_triforce_charts", + "progression_treasure_charts", + "progression_expensive_purchases", + "progression_island_puzzles", + "progression_misc", + "randomize_mapcompass", + "randomize_smallkeys", + "randomize_bigkeys", + "sword_mode", + "required_bosses", + "num_required_bosses", + "chest_type_matches_contents", + "hero_mode", + "logic_obscurity", + "logic_precision", + "randomize_dungeon_entrances", + "randomize_secret_cave_entrances", + "randomize_miniboss_entrances", + "randomize_boss_entrances", + "randomize_secret_cave_inner_entrances", + "randomize_fairy_fountain_entrances", + "mix_entrances", + "randomize_enemies", + "randomize_starting_island", + "randomize_charts", + "swift_sail", + "instant_text_boxes", + "reveal_full_sea_chart", + "add_shortcut_warps_between_dungeons", + "skip_rematch_bosses", + "remove_music", + ) + tww_option_groups: list[OptionGroup] = [ OptionGroup( diff --git a/worlds/tww/__init__.py b/worlds/tww/__init__.py index 36ed77f9c9..6b6c3ca33a 100644 --- a/worlds/tww/__init__.py +++ b/worlds/tww/__init__.py @@ -462,7 +462,7 @@ class TWWWorld(World): "Seed": multiworld.seed_name, "Slot": player, "Name": self.player_name, - "Options": self.options.as_dict(*self.options_dataclass.type_hints), + "Options": self.options.get_output_dict(), "Required Bosses": self.boss_reqs.required_boss_item_locations, "Locations": {}, "Entrances": {}, From ce14f190fb2d15e68c17cb9ff3bfab413bea25f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:12:52 -0400 Subject: [PATCH 087/199] Stardew Valley: Replace event creation stardew code with add_event (#4922) * replace event creation stardew code with add_event * delete unnecessary default args --- worlds/stardew_valley/__init__.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 7f420eb81d..f48c9bc1a4 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -299,17 +299,9 @@ class StardewValleyWorld(World): return StardewItem(item.name, override_classification, item.code, self.player) - def create_event_location(self, location_data: LocationData, rule: StardewRule = None, item: Optional[str] = None): - if rule is None: - rule = True_() - if item is None: - item = location_data.name - + def create_event_location(self, location_data: LocationData, rule: StardewRule, item: str): region = self.multiworld.get_region(location_data.region, self.player) - location = StardewLocation(self.player, location_data.name, None, region) - location.access_rule = rule - region.locations.append(location) - location.place_locked_item(StardewItem(item, ItemClassification.progression, None, self.player)) + region.add_event(location_data.name, item, rule, StardewLocation, StardewItem) def set_rules(self): set_rules(self) From b580d3c25aba4655e7aaac676ee15a73de2b969a Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 29 Apr 2025 06:32:36 +0000 Subject: [PATCH 088/199] CI: add optional windows release build and build attestation (#4940) * CI: github attestation for manually started builds * CI: include appimage zsync in build attestation * CI: github attestation for Linux release builds * CI: reorder steps in build.yml * CI: add windows builds to release.yml * CI: order jobs in release.yml * CI: add missing permission to release.yml * CI: enable windows build in release.yml * CI: false is skip --- .github/workflows/build.yml | 29 +++++++++++- .github/workflows/release.yml | 83 ++++++++++++++++++++++++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7529f693bd..d6b80965f0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,12 +21,17 @@ env: ENEMIZER_VERSION: 7.1 APPIMAGETOOL_VERSION: 13 +permissions: # permissions required for attestation + id-token: 'write' + attestations: 'write' + jobs: # build-release-macos: # LF volunteer - build-win: # RCs will still be built and signed by hand + build-win: # RCs and releases may still be built and signed by hand runs-on: windows-latest steps: + # - copy code below to release.yml - - uses: actions/checkout@v4 - name: Install python uses: actions/setup-python@v5 @@ -65,6 +70,18 @@ jobs: $contents = Get-ChildItem -Path setups/*.exe -Force -Recurse $SETUP_NAME=$contents[0].Name echo "SETUP_NAME=$SETUP_NAME" >> $Env:GITHUB_ENV + # - copy code above to release.yml - + - name: Attest Build + if: ${{ github.event_name == 'workflow_dispatch' }} + uses: actions/attest-build-provenance@v2 + with: + subject-path: | + build/exe.*/ArchipelagoLauncher.exe + build/exe.*/ArchipelagoLauncherDebug.exe + build/exe.*/ArchipelagoGenerate.exe + build/exe.*/ArchipelagoServer.exe + dist/${{ env.ZIP_NAME }} + setups/${{ env.SETUP_NAME }} - name: Check build loads expected worlds shell: bash run: | @@ -142,6 +159,16 @@ jobs: echo "APPIMAGE_NAME=$APPIMAGE_NAME" >> $GITHUB_ENV echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV # - copy code above to release.yml - + - name: Attest Build + if: ${{ github.event_name == 'workflow_dispatch' }} + uses: actions/attest-build-provenance@v2 + with: + subject-path: | + build/exe.*/ArchipelagoLauncher + build/exe.*/ArchipelagoGenerate + build/exe.*/ArchipelagoServer + dist/${{ env.APPIMAGE_NAME }}* + dist/${{ env.TAR_NAME }} - name: Build Again run: | source venv/bin/activate diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 20d4d2fe32..a500f9a23b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,11 @@ env: ENEMIZER_VERSION: 7.1 APPIMAGETOOL_VERSION: 13 +permissions: # permissions required for attestation + id-token: 'write' + attestations: 'write' + contents: 'write' # additionally required for release + jobs: create-release: runs-on: ubuntu-latest @@ -26,11 +31,79 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # build-release-windows: # this is done by hand because of signing # build-release-macos: # LF volunteer + build-release-win: + runs-on: windows-latest + if: ${{ true }} # change to false to skip if release is built by hand + needs: create-release + steps: + - name: Set env + shell: bash + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + # - code below copied from build.yml - + - uses: actions/checkout@v4 + - name: Install python + uses: actions/setup-python@v5 + with: + python-version: '~3.12.7' + check-latest: true + - name: Download run-time dependencies + run: | + Invoke-WebRequest -Uri https://github.com/Ijwu/Enemizer/releases/download/${Env:ENEMIZER_VERSION}/win-x64.zip -OutFile enemizer.zip + Expand-Archive -Path enemizer.zip -DestinationPath EnemizerCLI -Force + choco install innosetup --version=6.2.2 --allow-downgrade + - name: Build + run: | + python -m pip install --upgrade pip + python setup.py build_exe --yes + if ( $? -eq $false ) { + Write-Error "setup.py failed!" + exit 1 + } + $NAME="$(ls build | Select-String -Pattern 'exe')".Split('.',2)[1] + $ZIP_NAME="Archipelago_$NAME.7z" + echo "$NAME -> $ZIP_NAME" + echo "ZIP_NAME=$ZIP_NAME" >> $Env:GITHUB_ENV + New-Item -Path dist -ItemType Directory -Force + cd build + Rename-Item "exe.$NAME" Archipelago + 7z a -mx=9 -mhe=on -ms "../dist/$ZIP_NAME" Archipelago + Rename-Item Archipelago "exe.$NAME" # inno_setup.iss expects the original name + - name: Build Setup + run: | + & "${env:ProgramFiles(x86)}\Inno Setup 6\iscc.exe" inno_setup.iss /DNO_SIGNTOOL + if ( $? -eq $false ) { + Write-Error "Building setup failed!" + exit 1 + } + $contents = Get-ChildItem -Path setups/*.exe -Force -Recurse + $SETUP_NAME=$contents[0].Name + echo "SETUP_NAME=$SETUP_NAME" >> $Env:GITHUB_ENV + # - code above copied from build.yml - + - name: Attest Build + uses: actions/attest-build-provenance@v2 + with: + subject-path: | + build/exe.*/ArchipelagoLauncher.exe + build/exe.*/ArchipelagoLauncherDebug.exe + build/exe.*/ArchipelagoGenerate.exe + build/exe.*/ArchipelagoServer.exe + setups/* + - name: Add to Release + uses: softprops/action-gh-release@975c1b265e11dd76618af1c374e7981f9a6ff44a + with: + draft: true # see above + prerelease: false + name: Archipelago ${{ env.RELEASE_VERSION }} + files: | + setups/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + build-release-ubuntu2204: runs-on: ubuntu-22.04 + needs: create-release steps: - name: Set env run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV @@ -74,6 +147,14 @@ jobs: echo "APPIMAGE_NAME=$APPIMAGE_NAME" >> $GITHUB_ENV echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV # - code above copied from build.yml - + - name: Attest Build + uses: actions/attest-build-provenance@v2 + with: + subject-path: | + build/exe.*/ArchipelagoLauncher + build/exe.*/ArchipelagoGenerate + build/exe.*/ArchipelagoServer + dist/* - name: Add to Release uses: softprops/action-gh-release@975c1b265e11dd76618af1c374e7981f9a6ff44a with: From ec768a2e897987e7be9673b46ec5984cf8770335 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Tue, 29 Apr 2025 10:53:31 -0400 Subject: [PATCH 089/199] ALTTP: Swamp Palace West logic fix (#4936) --- worlds/alttp/Rules.py | 4 +--- worlds/alttp/test/dungeons/TestSwampPalace.py | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 452c15223c..2d11d537fb 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -393,9 +393,7 @@ def global_rules(multiworld: MultiWorld, player: int): if world.options.pot_shuffle: # it could move the key to the top right platform which can only be reached with bombs add_rule(multiworld.get_location('Swamp Palace - Hookshot Pot Key', player), lambda state: can_use_bombs(state, player)) - set_rule(multiworld.get_entrance('Swamp Palace (West)', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6) - if state.has('Hookshot', player) - else state._lttp_has_key('Small Key (Swamp Palace)', player, 4)) + set_rule(multiworld.get_entrance('Swamp Palace (West)', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6)) set_rule(multiworld.get_location('Swamp Palace - Big Chest', player), lambda state: state.has('Big Key (Swamp Palace)', player)) if world.options.accessibility != 'full': allow_self_locking_items(multiworld.get_location('Swamp Palace - Big Chest', player), 'Big Key (Swamp Palace)') diff --git a/worlds/alttp/test/dungeons/TestSwampPalace.py b/worlds/alttp/test/dungeons/TestSwampPalace.py index fb0672a5a9..5bfd90171f 100644 --- a/worlds/alttp/test/dungeons/TestSwampPalace.py +++ b/worlds/alttp/test/dungeons/TestSwampPalace.py @@ -24,7 +24,7 @@ class TestSwampPalace(TestDungeon): ["Swamp Palace - Big Key Chest", False, [], ['Open Floodgate']], ["Swamp Palace - Big Key Chest", False, [], ['Hammer']], ["Swamp Palace - Big Key Chest", False, [], ['Small Key (Swamp Palace)']], - ["Swamp Palace - Big Key Chest", True, ['Open Floodgate', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Flippers', 'Hammer']], + ["Swamp Palace - Big Key Chest", True, ['Open Floodgate', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Flippers', 'Hammer']], ["Swamp Palace - Map Chest", False, []], ["Swamp Palace - Map Chest", False, [], ['Flippers']], @@ -38,7 +38,7 @@ class TestSwampPalace(TestDungeon): ["Swamp Palace - West Chest", False, [], ['Open Floodgate']], ["Swamp Palace - West Chest", False, [], ['Hammer']], ["Swamp Palace - West Chest", False, [], ['Small Key (Swamp Palace)']], - ["Swamp Palace - West Chest", True, ['Open Floodgate', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Flippers', 'Hammer']], + ["Swamp Palace - West Chest", True, ['Open Floodgate', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Small Key (Swamp Palace)', 'Flippers', 'Hammer']], ["Swamp Palace - Compass Chest", False, []], ["Swamp Palace - Compass Chest", False, [], ['Flippers']], From 3ef35105c88c7ea44dfa52229b055deb7a45dcf3 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Tue, 29 Apr 2025 22:27:54 -0400 Subject: [PATCH 090/199] LADX: Remove copyrighted assets (#4935) --- LinksAwakeningClient.py | 26 +++++++------------------- data/sprites/ladx/Bowwow.bdiff | Bin 7354 -> 0 bytes data/sprites/ladx/Bunny.bdiff | Bin 3083 -> 0 bytes data/sprites/ladx/Luigi.bdiff | Bin 13112 -> 0 bytes data/sprites/ladx/Mario.bdiff | Bin 9025 -> 0 bytes data/sprites/ladx/Richard.bdiff | Bin 8207 -> 0 bytes data/sprites/ladx/Tarin.bdiff | Bin 8309 -> 0 bytes 7 files changed, 7 insertions(+), 19 deletions(-) delete mode 100644 data/sprites/ladx/Bowwow.bdiff delete mode 100644 data/sprites/ladx/Bunny.bdiff delete mode 100644 data/sprites/ladx/Luigi.bdiff delete mode 100644 data/sprites/ladx/Mario.bdiff delete mode 100644 data/sprites/ladx/Richard.bdiff delete mode 100644 data/sprites/ladx/Tarin.bdiff diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index 69f50938d2..16896540d6 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -52,22 +52,6 @@ class BadRetroArchResponse(GameboyException): pass -def magpie_logo(): - from kivy.uix.image import CoreImage - binary_data = """ -iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXN -SR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA -7DAcdvqGQAAADGSURBVDhPhVLBEcIwDHOYhjHCBuXHj2OTbAL8+ -MEGZIxOQ1CinOOk0Op0bmo7tlXXeR9FJMYDLOD9mwcLjQK7+hSZ -wgcWMZJOAGeGKtChNHFL0j+FZD3jSCuo0w7l03wDrWdg00C4/aW -eDEYNenuzPOfPspBnxf0kssE80vN0L8361j10P03DK4x6FHabuV -ear8fHme+b17rwSjbAXeUMLb+EVTV2QHm46MWQanmnydA98KsVS -XkV+qFpGQXrLhT/fqraQeQLuplpNH5g+WkAAAAASUVORK5CYII=""" - binary_data = base64.b64decode(binary_data) - data = io.BytesIO(binary_data) - return CoreImage(data, ext="png").texture - - class LAClientConstants: # Connector version VERSION = 0x01 @@ -530,7 +514,9 @@ class LinksAwakeningContext(CommonContext): def run_gui(self) -> None: import webbrowser - from kvui import GameManager, ImageButton + from kvui import GameManager + from kivy.metrics import dp + from kivymd.uix.button import MDButton, MDButtonText class LADXManager(GameManager): logging_pairs = [ @@ -543,8 +529,10 @@ class LinksAwakeningContext(CommonContext): b = super().build() if self.ctx.magpie_enabled: - button = ImageButton(texture=magpie_logo(), fit_mode="cover", image_size=(32, 32), size_hint_x=None, - on_press=lambda _: webbrowser.open('https://magpietracker.us/?enable_autotracker=1')) + button = MDButton(MDButtonText(text="Open Tracker"), style="filled", size=(dp(100), dp(70)), radius=5, + size_hint_x=None, size_hint_y=None, pos_hint={"center_y": 0.55}, + on_press=lambda _: webbrowser.open('https://magpietracker.us/?enable_autotracker=1')) + button.height = self.server_connect_bar.height self.connect_layout.add_widget(button) return b diff --git a/data/sprites/ladx/Bowwow.bdiff b/data/sprites/ladx/Bowwow.bdiff deleted file mode 100644 index bdfe9f42f23bf24c4ea8901ef9ba1dde5f4827a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7354 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 XNBPQyn4D6uElTZHxZ+2Vu diff --git a/data/sprites/ladx/Luigi.bdiff b/data/sprites/ladx/Luigi.bdiff deleted file mode 100644 index 1897a65d01463797e61e535ea26cb79882f42171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13112 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 diff --git a/data/sprites/ladx/Mario.bdiff b/data/sprites/ladx/Mario.bdiff deleted file mode 100644 index 389fa94ab12862aef4cb035ff2ae688704ed25bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9025 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 Date: Wed, 30 Apr 2025 03:57:35 +0100 Subject: [PATCH 091/199] SM: Fix FakeROM instances sharing the same data dictionary (#4912) FakeROM instances were being created with default arguments, which included a mutable default argument data dictionary, so all FakeROM instances would be writing to and reading the same dictionary, resulting in broken patch data in multiworlds with more than one Super Metroid world. --- worlds/sm/variaRandomizer/rom/rom.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/worlds/sm/variaRandomizer/rom/rom.py b/worlds/sm/variaRandomizer/rom/rom.py index f0f37b76a3..05218ff52a 100644 --- a/worlds/sm/variaRandomizer/rom/rom.py +++ b/worlds/sm/variaRandomizer/rom/rom.py @@ -89,9 +89,12 @@ class ROM(object): class FakeROM(ROM): # to have the same code for real ROM and the webservice - def __init__(self, data={}): + def __init__(self, data=None): super(FakeROM, self).__init__() - self.data = data + if data is None: + self.data = {} + else: + self.data = data self.ipsPatches = [] def write(self, bytes): From 611e1c2b1928ba3ffda7bbef2bae33c4ac1a056d Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:24:10 -0400 Subject: [PATCH 092/199] SMW: v2.1 Feature Update (#4652) ### Features: - Trap Link - When you receive a trap, you send a copy of it to every other player with Trap Link enabled - Ring Link - Any coin amounts gained and lost by a linked player will be instantly shared with all other active linked players Co-authored-by: TheLX5 --- worlds/smw/CHANGELOG.md | 9 ++ worlds/smw/Client.py | 225 +++++++++++++++++++++++++++++++++--- worlds/smw/Items.py | 46 ++++++++ worlds/smw/Names/TextBox.py | 25 ++++ worlds/smw/Options.py | 16 +++ worlds/smw/Rom.py | 6 +- worlds/smw/__init__.py | 13 +++ 7 files changed, 320 insertions(+), 20 deletions(-) diff --git a/worlds/smw/CHANGELOG.md b/worlds/smw/CHANGELOG.md index 7f62997adc..f1e031197c 100644 --- a/worlds/smw/CHANGELOG.md +++ b/worlds/smw/CHANGELOG.md @@ -1,6 +1,15 @@ # Super Mario World - Changelog +## v2.1 + +### Features: +- Trap Link + - When you receive a trap, you send a copy of it to every other player with Trap Link enabled +- Ring Link + - Any coin amounts gained and lost by a linked player will be instantly shared with all other active linked players + + ## v2.0 ### Features: diff --git a/worlds/smw/Client.py b/worlds/smw/Client.py index 600e1bff83..85524eb7ad 100644 --- a/worlds/smw/Client.py +++ b/worlds/smw/Client.py @@ -1,9 +1,11 @@ import logging import time +from typing import Any -from NetUtils import ClientStatus, color +from NetUtils import ClientStatus, NetworkItem, color from worlds.AutoSNIClient import SNIClient -from .Names.TextBox import generate_received_text +from .Names.TextBox import generate_received_text, generate_received_trap_link_text +from .Items import trap_value_to_name, trap_name_to_value snes_logger = logging.getLogger("SNES") @@ -42,10 +44,13 @@ SMW_MOON_ACTIVE_ADDR = ROM_START + 0x01BFA8 SMW_HIDDEN_1UP_ACTIVE_ADDR = ROM_START + 0x01BFA9 SMW_BONUS_BLOCK_ACTIVE_ADDR = ROM_START + 0x01BFAA SMW_BLOCKSANITY_ACTIVE_ADDR = ROM_START + 0x01BFAB +SMW_TRAP_LINK_ACTIVE_ADDR = ROM_START + 0x01BFB7 +SMW_RING_LINK_ACTIVE_ADDR = ROM_START + 0x01BFB8 SMW_GAME_STATE_ADDR = WRAM_START + 0x100 SMW_MARIO_STATE_ADDR = WRAM_START + 0x71 +SMW_COIN_COUNT_ADDR = WRAM_START + 0xDBF SMW_BOSS_STATE_ADDR = WRAM_START + 0xD9B SMW_ACTIVE_BOSS_ADDR = WRAM_START + 0x13FC SMW_CURRENT_LEVEL_ADDR = WRAM_START + 0x13BF @@ -76,6 +81,7 @@ SMW_UNCOLLECTABLE_DRAGON_COINS = [0x24] class SMWSNIClient(SNIClient): game = "Super Mario World" patch_suffix = ".apsmw" + slot_data: dict[str, Any] | None async def deathlink_kill_player(self, ctx): from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read @@ -111,6 +117,84 @@ class SMWSNIClient(SNIClient): ctx.last_death_link = time.time() + def on_package(self, ctx: SNIClient, cmd: str, args: dict[str, Any]) -> None: + super().on_package(ctx, cmd, args) + + if cmd == "Connected": + self.slot_data = args.get("slot_data", None) + + if cmd != "Bounced": + return + if "tags" not in args: + return + + if not hasattr(self, "instance_id"): + self.instance_id = time.time() + + source_name = args["data"]["source"] + if "TrapLink" in ctx.tags and "TrapLink" in args["tags"] and source_name != ctx.slot_info[ctx.slot].name: + trap_name: str = args["data"]["trap_name"] + if trap_name not in trap_name_to_value: + # We don't know how to handle this trap, ignore it + return + + trap_id: int = trap_name_to_value[trap_name] + + if "trap_weights" not in self.slot_data: + return + + if f"{trap_id}" not in self.slot_data["trap_weights"]: + return + + if self.slot_data["trap_weights"][f"{trap_id}"] == 0: + # The player disabled this trap type + return + + self.priority_trap = NetworkItem(trap_id, None, None) + self.priority_trap_message = generate_received_trap_link_text(trap_name, source_name) + self.priority_trap_message_str = f"Received linked {trap_name} from {source_name}" + elif "RingLink" in ctx.tags and "RingLink" in args["tags"] and source_name != self.instance_id: + if not hasattr(self, "pending_ring_link"): + self.pending_ring_link = 0 + self.pending_ring_link += args["data"]["amount"] + + async def send_trap_link(self, ctx: SNIClient, trap_name: str): + if "TrapLink" not in ctx.tags or ctx.slot == None: + return + + await ctx.send_msgs([{ + "cmd": "Bounce", "tags": ["TrapLink"], + "data": { + "time": time.time(), + "source": ctx.player_names[ctx.slot], + "trap_name": trap_name + } + }]) + snes_logger.info(f"Sent linked {trap_name}") + + async def send_ring_link(self, ctx: SNIClient, amount: int): + from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read + + if "RingLink" not in ctx.tags or ctx.slot == None: + return + + game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1) + if game_state[0] != 0x14: + return + + if not hasattr(self, "instance_id"): + self.instance_id = time.time() + + await ctx.send_msgs([{ + "cmd": "Bounce", "tags": ["RingLink"], + "data": { + "time": time.time(), + "source": self.instance_id, + "amount": amount + } + }]) + + async def validate_rom(self, ctx): from SNIClient import snes_buffered_write, snes_flush_writes, snes_read @@ -123,9 +207,11 @@ class SMWSNIClient(SNIClient): receive_option = await snes_read(ctx, SMW_RECEIVE_MSG_DATA, 0x1) send_option = await snes_read(ctx, SMW_SEND_MSG_DATA, 0x1) + trap_link = await snes_read(ctx, SMW_TRAP_LINK_ACTIVE_ADDR, 0x1) ctx.receive_option = receive_option[0] ctx.send_option = send_option[0] + ctx.trap_link = trap_link[0] ctx.allow_collect = True @@ -133,6 +219,15 @@ class SMWSNIClient(SNIClient): if death_link: await ctx.update_death_link(bool(death_link[0] & 0b1)) + if trap_link and bool(trap_link[0] & 0b1) and "TrapLink" not in ctx.tags: + ctx.tags.add("TrapLink") + await ctx.send_msgs([{"cmd": "ConnectUpdate", "tags": ctx.tags}]) + + ring_link = await snes_read(ctx, SMW_RING_LINK_ACTIVE_ADDR, 1) + if ring_link and bool(ring_link[0] & 0b1) and "RingLink" not in ctx.tags: + ctx.tags.add("RingLink") + await ctx.send_msgs([{"cmd": "ConnectUpdate", "tags": ctx.tags}]) + if ctx.rom != rom_name: ctx.current_sublevel_value = 0 @@ -142,12 +237,17 @@ class SMWSNIClient(SNIClient): def add_message_to_queue(self, new_message): - if not hasattr(self, "message_queue"): self.message_queue = [] self.message_queue.append(new_message) + def add_message_to_queue_front(self, new_message): + if not hasattr(self, "message_queue"): + self.message_queue = [] + + self.message_queue.insert(0, new_message) + async def handle_message_queue(self, ctx): from SNIClient import snes_buffered_write, snes_flush_writes, snes_read @@ -206,7 +306,8 @@ class SMWSNIClient(SNIClient): async def handle_trap_queue(self, ctx): from SNIClient import snes_buffered_write, snes_flush_writes, snes_read - if not hasattr(self, "trap_queue") or len(self.trap_queue) == 0: + if (not hasattr(self, "trap_queue") or len(self.trap_queue) == 0) and\ + (not hasattr(self, "priority_trap") or self.priority_trap == 0): return game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1) @@ -221,7 +322,24 @@ class SMWSNIClient(SNIClient): if pause_state[0] != 0x00: return - next_trap, message = self.trap_queue.pop(0) + + next_trap = None + message = bytearray() + message_str = "" + from_queue = False + + if getattr(self, "priority_trap", None) and self.priority_trap.item != 0: + next_trap = self.priority_trap + message = self.priority_trap_message + message_str = self.priority_trap_message_str + self.priority_trap = None + self.priority_trap_message = bytearray() + self.priority_trap_message_str = "" + elif hasattr(self, "trap_queue") and len(self.trap_queue) > 0: + from_queue = True + next_trap, message = self.trap_queue.pop(0) + else: + return from .Rom import trap_rom_data if next_trap.item in trap_rom_data: @@ -231,16 +349,22 @@ class SMWSNIClient(SNIClient): # Timer Trap if trap_active[0] == 0 or (trap_active[0] == 1 and trap_active[1] == 0 and trap_active[2] == 0): # Trap already active - self.add_trap_to_queue(next_trap, message) + if from_queue: + self.add_trap_to_queue(next_trap, message) return else: + if len(message_str) > 0: + snes_logger.info(message_str) + if "TrapLink" in ctx.tags and from_queue: + await self.send_trap_link(ctx, trap_value_to_name[next_trap.item]) snes_buffered_write(ctx, WRAM_START + trap_rom_data[next_trap.item][0], bytes([0x01])) snes_buffered_write(ctx, WRAM_START + trap_rom_data[next_trap.item][0] + 1, bytes([0x00])) snes_buffered_write(ctx, WRAM_START + trap_rom_data[next_trap.item][0] + 2, bytes([0x00])) else: if trap_active[0] > 0: # Trap already active - self.add_trap_to_queue(next_trap, message) + if from_queue: + self.add_trap_to_queue(next_trap, message) return else: if next_trap.item == 0xBC001D: @@ -248,12 +372,18 @@ class SMWSNIClient(SNIClient): # Do not fire if the previous thwimp hasn't reached the player's Y pos active_thwimp = await snes_read(ctx, SMW_ACTIVE_THWIMP_ADDR, 0x1) if active_thwimp[0] != 0xFF: - self.add_trap_to_queue(next_trap, message) + if from_queue: + self.add_trap_to_queue(next_trap, message) return verify_game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1) if verify_game_state[0] == 0x14 and len(trap_rom_data[next_trap.item]) > 2: snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([trap_rom_data[next_trap.item][2]])) + if len(message_str) > 0: + snes_logger.info(message_str) + if "TrapLink" in ctx.tags and from_queue: + await self.send_trap_link(ctx, trap_value_to_name[next_trap.item]) + new_item_count = trap_rom_data[next_trap.item][1] snes_buffered_write(ctx, WRAM_START + trap_rom_data[next_trap.item][0], bytes([new_item_count])) @@ -270,9 +400,75 @@ class SMWSNIClient(SNIClient): return if self.should_show_message(ctx, next_trap): + self.add_message_to_queue_front(message) + elif next_trap.item == 0xBC0015: + if self.should_show_message(ctx, next_trap): + self.add_message_to_queue_front(message) + if len(message_str) > 0: + snes_logger.info(message_str) + if "TrapLink" in ctx.tags and from_queue: + await self.send_trap_link(ctx, trap_value_to_name[next_trap.item]) + + # Handle Literature Trap + from .Names.LiteratureTrap import lit_trap_text_list + import random + rand_trap = random.choice(lit_trap_text_list) + + for message in rand_trap: self.add_message_to_queue(message) + async def handle_ring_link(self, ctx): + from SNIClient import snes_buffered_write, snes_flush_writes, snes_read + + if "RingLink" not in ctx.tags: + return + + if not hasattr(self, "prev_coins"): + self.prev_coins = 0 + + curr_coins_byte = await snes_read(ctx, SMW_COIN_COUNT_ADDR, 0x1) + curr_coins = curr_coins_byte[0] + + if curr_coins < self.prev_coins: + # Coins rolled over from 1-Up + curr_coins += 100 + + coins_diff = curr_coins - self.prev_coins + if coins_diff > 0: + await self.send_ring_link(ctx, coins_diff) + self.prev_coins = curr_coins % 100 + + new_coins = curr_coins + if not hasattr(self, "pending_ring_link"): + self.pending_ring_link = 0 + + if self.pending_ring_link != 0: + new_coins += self.pending_ring_link + new_coins = max(new_coins, 0) + + new_1_ups = 0 + while new_coins >= 100: + new_1_ups += 1 + new_coins -= 100 + + if new_1_ups > 0: + curr_lives_inc_byte = await snes_read(ctx, WRAM_START + 0x18E4, 0x1) + curr_lives_inc = curr_lives_inc_byte[0] + new_lives_inc = curr_lives_inc + new_1_ups + snes_buffered_write(ctx, WRAM_START + 0x18E4, bytes([new_lives_inc])) + + snes_buffered_write(ctx, SMW_COIN_COUNT_ADDR, bytes([new_coins])) + if self.pending_ring_link > 0: + snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x01])) + else: + snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x2A])) + self.pending_ring_link = 0 + self.prev_coins = new_coins + + await snes_flush_writes(ctx) + + async def game_watcher(self, ctx): from SNIClient import snes_buffered_write, snes_flush_writes, snes_read @@ -333,6 +529,7 @@ class SMWSNIClient(SNIClient): await self.handle_message_queue(ctx) await self.handle_trap_queue(ctx) + await self.handle_ring_link(ctx) new_checks = [] event_data = await snes_read(ctx, SMW_EVENT_ROM_DATA, 0x60) @@ -506,7 +703,7 @@ class SMWSNIClient(SNIClient): ctx.location_names.lookup_in_slot(item.location, item.player), recv_index, len(ctx.items_received))) if self.should_show_message(ctx, item): - if item.item != 0xBC0012 and item.item not in trap_rom_data: + if item.item != 0xBC0012 and item.item != 0xBC0015 and item.item not in trap_rom_data: # Don't send messages for Boss Tokens item_name = ctx.item_names.lookup_in_game(item.item) player_name = ctx.player_names[item.player] @@ -515,7 +712,7 @@ class SMWSNIClient(SNIClient): self.add_message_to_queue(receive_message) snes_buffered_write(ctx, SMW_RECV_PROGRESS_ADDR, bytes([recv_index&0xFF, (recv_index>>8)&0xFF])) - if item.item in trap_rom_data: + if item.item in trap_rom_data or item.item == 0xBC0015: item_name = ctx.item_names.lookup_in_game(item.item) player_name = ctx.player_names[item.player] @@ -572,14 +769,6 @@ class SMWSNIClient(SNIClient): else: # Extra Powerup? pass - elif item.item == 0xBC0015: - # Handle Literature Trap - from .Names.LiteratureTrap import lit_trap_text_list - import random - rand_trap = random.choice(lit_trap_text_list) - - for message in rand_trap: - self.add_message_to_queue(message) await snes_flush_writes(ctx) diff --git a/worlds/smw/Items.py b/worlds/smw/Items.py index eaf58b9b8e..e5f5c27223 100644 --- a/worlds/smw/Items.py +++ b/worlds/smw/Items.py @@ -75,3 +75,49 @@ item_table = { } lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code} + + +trap_value_to_name: typing.Dict[int, str] = { + 0xBC0013: ItemName.ice_trap, + 0xBC0014: ItemName.stun_trap, + 0xBC0015: ItemName.literature_trap, + 0xBC0016: ItemName.timer_trap, + 0xBC001C: ItemName.reverse_controls_trap, + 0xBC001D: ItemName.thwimp_trap, +} + +trap_name_to_value: typing.Dict[str, int] = { + # Our native Traps + ItemName.ice_trap: 0xBC0013, + ItemName.stun_trap: 0xBC0014, + ItemName.literature_trap: 0xBC0015, + ItemName.timer_trap: 0xBC0016, + ItemName.reverse_controls_trap: 0xBC001C, + ItemName.thwimp_trap: 0xBC001D, + + # Common other trap names + "Chaos Control Trap": 0xBC0014, # Stun Trap + "Confuse Trap": 0xBC001C, # Reverse Trap + "Exposition Trap": 0xBC0015, # Literature Trap + "Cutscene Trap": 0xBC0015, # Literature Trap + "Freeze Trap": 0xBC0014, # Stun Trap + "Frozen Trap": 0xBC0014, # Stun Trap + "Paralyze Trap": 0xBC0014, # Stun Trap + "Reversal Trap": 0xBC001C, # Reverse Trap + "Fuzzy Trap": 0xBC001C, # Reverse Trap + "Confound Trap": 0xBC001C, # Reverse Trap + "Confusion Trap": 0xBC001C, # Reverse Trap + "Police Trap": 0xBC001D, # Thwimp Trap + "Buyon Trap": 0xBC001D, # Thwimp Trap + "Gooey Bag": 0xBC001D, # Thwimp Trap + "TNT Barrel Trap": 0xBC001D, # Thwimp Trap + "Honey Trap": 0xBC0014, # Stun Trap + "Screen Flip Trap": 0xBC001C, # Reverse Trap + "Banana Trap": 0xBC0013, # Ice Trap + "Bomb": 0xBC001D, # Thwimp Trap + "Bonk Trap": 0xBC0014, # Stun Trap + "Ghost": 0xBC001D, # Thwimp Trap + "Fast Trap": 0xBC0016, # Timer Trap + "Nut Trap": 0xBC001D, # Thwimp Trap + "Army Trap": 0xBC001D, # Thwimp Trap +} diff --git a/worlds/smw/Names/TextBox.py b/worlds/smw/Names/TextBox.py index 2302a5f85f..fef04627b6 100644 --- a/worlds/smw/Names/TextBox.py +++ b/worlds/smw/Names/TextBox.py @@ -117,6 +117,31 @@ def generate_received_text(item_name: str, player_name: str): return out_array +def generate_received_trap_link_text(item_name: str, player_name: str): + out_array = bytearray() + + item_name = item_name[:18] + player_name = player_name[:18] + + item_buffer = max(0, math.floor((18 - len(item_name)) / 2)) + player_buffer = max(0, math.floor((18 - len(player_name)) / 2)) + + out_array += bytearray([0x9F, 0x9F]) + out_array += string_to_bytes(" Received linked") + out_array[-1] += 0x80 + out_array += bytearray([0x1F] * item_buffer) + out_array += string_to_bytes(item_name) + out_array[-1] += 0x80 + out_array += string_to_bytes(" from") + out_array[-1] += 0x80 + out_array += bytearray([0x1F] * player_buffer) + out_array += string_to_bytes(player_name) + out_array[-1] += 0x80 + out_array += bytearray([0x9F, 0x9F]) + + return out_array + + def generate_sent_text(item_name: str, player_name: str): out_array = bytearray() diff --git a/worlds/smw/Options.py b/worlds/smw/Options.py index 545b3c931b..1dcfb16b85 100644 --- a/worlds/smw/Options.py +++ b/worlds/smw/Options.py @@ -398,6 +398,20 @@ class StartingLifeCount(Range): default = 5 +class RingLink(Toggle): + """ + Whether your in-level coin gain/loss is linked to other players + """ + display_name = "Ring Link" + + +class TrapLink(Toggle): + """ + Whether your received traps are linked to other players + """ + display_name = "Trap Link" + + smw_option_groups = [ OptionGroup("Goal Options", [ Goal, @@ -447,6 +461,8 @@ smw_option_groups = [ @dataclass class SMWOptions(PerGameCommonOptions): death_link: DeathLink + ring_link: RingLink + trap_link: TrapLink goal: Goal bosses_required: BossesRequired max_yoshi_egg_cap: NumberOfYoshiEggs diff --git a/worlds/smw/Rom.py b/worlds/smw/Rom.py index ff3b5c3163..9016e14def 100644 --- a/worlds/smw/Rom.py +++ b/worlds/smw/Rom.py @@ -719,8 +719,8 @@ def handle_vertical_scroll(rom): 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, # Levels 0D0-0DF 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, # Levels 0E0-0EF 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, # Levels 0F0-0FF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, # Levels 100-10F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, # Levels 110-11F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, # Levels 100-10F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, # Levels 110-11F 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, # Levels 120-12F 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, # Levels 130-13F 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, # Levels 140-14F @@ -3160,6 +3160,8 @@ def patch_rom(world: World, rom, player, active_level_dict): rom.write_byte(0x01BFA9, world.options.hidden_1up_checks.value) rom.write_byte(0x01BFAA, world.options.bonus_block_checks.value) rom.write_byte(0x01BFAB, world.options.blocksanity.value) + rom.write_byte(0x01BFB7, world.options.trap_link.value) + rom.write_byte(0x01BFB8, world.options.ring_link.value) from Utils import __version__ diff --git a/worlds/smw/__init__.py b/worlds/smw/__init__.py index 97fc84f003..56ca82abb2 100644 --- a/worlds/smw/__init__.py +++ b/worlds/smw/__init__.py @@ -90,6 +90,7 @@ class SMWWorld(World): "blocksanity", ) slot_data["active_levels"] = self.active_level_dict + slot_data["trap_weights"] = self.output_trap_weights() return slot_data @@ -322,3 +323,15 @@ class SMWWorld(World): def set_rules(self): set_rules(self) + + def output_trap_weights(self) -> dict[int, int]: + trap_data = {} + + trap_data[0xBC0013] = self.options.ice_trap_weight.value + trap_data[0xBC0014] = self.options.stun_trap_weight.value + trap_data[0xBC0015] = self.options.literature_trap_weight.value + trap_data[0xBC0016] = self.options.timer_trap_weight.value + trap_data[0xBC001C] = self.options.reverse_trap_weight.value + trap_data[0xBC001D] = self.options.thwimp_trap_weight.value + + return trap_data From 227f0bce3d8c904a153d993da2da27b26b63aac6 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Wed, 30 Apr 2025 07:31:33 -0700 Subject: [PATCH 093/199] Pokemon Red/Blue: Convert to Procedure Patch (#4801) --- worlds/pokemon_rb/__init__.py | 16 +- worlds/pokemon_rb/pokemon.py | 21 +- worlds/pokemon_rb/rock_tunnel.py | 87 +++-- worlds/pokemon_rb/rom.py | 539 +++++++++++++++---------------- 4 files changed, 334 insertions(+), 329 deletions(-) diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index 644aa1ed9c..6bf66a1106 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -18,7 +18,7 @@ from .regions import create_regions from .options import PokemonRBOptions from .rom_addresses import rom_addresses from .text import encode_text -from .rom import generate_output, get_base_rom_bytes, get_base_rom_path, RedDeltaPatch, BlueDeltaPatch +from .rom import generate_output, PokemonRedProcedurePatch, PokemonBlueProcedurePatch from .pokemon import process_pokemon_data, process_move_data, verify_hm_moves from .encounters import process_pokemon_locations, process_trainer_data from .rules import set_rules @@ -33,12 +33,12 @@ class PokemonSettings(settings.Group): """File names of the Pokemon Red and Blue roms""" description = "Pokemon Red (UE) ROM File" copy_to = "Pokemon Red (UE) [S][!].gb" - md5s = [RedDeltaPatch.hash] + md5s = [PokemonRedProcedurePatch.hash] class BlueRomFile(settings.UserFilePath): description = "Pokemon Blue (UE) ROM File" copy_to = "Pokemon Blue (UE) [S][!].gb" - md5s = [BlueDeltaPatch.hash] + md5s = [PokemonBlueProcedurePatch.hash] red_rom_file: RedRomFile = RedRomFile(RedRomFile.copy_to) blue_rom_file: BlueRomFile = BlueRomFile(BlueRomFile.copy_to) @@ -113,16 +113,6 @@ class PokemonRedBlueWorld(World): self.local_locs = [] self.pc_item = None - @classmethod - def stage_assert_generate(cls, multiworld: MultiWorld): - versions = set() - for player in multiworld.player_ids: - if multiworld.worlds[player].game == "Pokemon Red and Blue": - versions.add(multiworld.worlds[player].options.game_version.current_key) - for version in versions: - if not os.path.exists(get_base_rom_path(version)): - raise FileNotFoundError(get_base_rom_path(version)) - @classmethod def stage_generate_early(cls, multiworld: MultiWorld): diff --git a/worlds/pokemon_rb/pokemon.py b/worlds/pokemon_rb/pokemon.py index 32c0e36869..e5d161a433 100644 --- a/worlds/pokemon_rb/pokemon.py +++ b/worlds/pokemon_rb/pokemon.py @@ -1,9 +1,17 @@ from copy import deepcopy +import typing + +from worlds.Files import APTokenTypes + from . import poke_data, logic from .rom_addresses import rom_addresses +if typing.TYPE_CHECKING: + from . import PokemonRedBlueWorld + from .rom import PokemonRedProcedurePatch, PokemonBlueProcedurePatch -def set_mon_palettes(world, random, data): + +def set_mon_palettes(world: "PokemonRedBlueWorld", patch: "PokemonRedProcedurePatch | PokemonBlueProcedurePatch"): if world.options.randomize_pokemon_palettes == "vanilla": return pallet_map = { @@ -31,12 +39,9 @@ def set_mon_palettes(world, random, data): poke_data.evolves_from and poke_data.evolves_from[mon] != "Eevee"): pallet = palettes[-1] else: # completely_random or follow_evolutions and it is not an evolved form (except eeveelutions) - pallet = random.choice(list(pallet_map.values())) + pallet = world.random.choice(list(pallet_map.values())) palettes.append(pallet) - address = rom_addresses["Mon_Palettes"] - for pallet in palettes: - data[address] = pallet - address += 1 + patch.write_token(APTokenTypes.WRITE, rom_addresses["Mon_Palettes"], bytes(palettes)) def choose_forced_type(chances, random): @@ -253,9 +258,9 @@ def process_pokemon_data(self): mon_data[f"start move {i}"] = learnsets[mon].pop(0) if self.options.randomize_pokemon_catch_rates: - mon_data["catch rate"] = self.random.randint(self.options.minimum_catch_rate, 255) + mon_data["catch rate"] = self.random.randint(self.options.minimum_catch_rate.value, 255) else: - mon_data["catch rate"] = max(self.options.minimum_catch_rate, mon_data["catch rate"]) + mon_data["catch rate"] = max(self.options.minimum_catch_rate.value, mon_data["catch rate"]) def roll_tm_compat(roll_move): if self.local_move_data[roll_move]["type"] in [mon_data["type1"], mon_data["type2"]]: diff --git a/worlds/pokemon_rb/rock_tunnel.py b/worlds/pokemon_rb/rock_tunnel.py index 46b2be3040..83b59255c6 100644 --- a/worlds/pokemon_rb/rock_tunnel.py +++ b/worlds/pokemon_rb/rock_tunnel.py @@ -1,5 +1,55 @@ +import random +import typing + +from worlds.Files import APTokenTypes + from .rom_addresses import rom_addresses +if typing.TYPE_CHECKING: + from .rom import PokemonBlueProcedurePatch, PokemonRedProcedurePatch + + +layout1F = [ + [20, 22, 32, 34, 20, 25, 22, 32, 34, 20, 25, 25, 25, 22, 20, 25, 22, 2, 2, 2], + [24, 26, 40, 1, 24, 25, 26, 62, 1, 28, 29, 29, 29, 30, 28, 29, 30, 1, 40, 2], + [28, 30, 1, 1, 28, 29, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 23], + [23, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 31], + [31, 1, 1, 1, 1, 1, 31, 32, 34, 2, 1, 1, 2, 32, 34, 32, 34, 1, 1, 23], + [23, 1, 1, 23, 1, 1, 23, 1, 40, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31], + [31, 1, 1, 31, 1, 1, 31, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23], + [23, 1, 1, 23, 1, 1, 1, 1, 1, 2, 32, 34, 32, 34, 32, 34, 32, 34, 2, 31], + [31, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 23, 1, 1, 40, 23], + [23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 31, 1, 1, 1, 31], + [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 23, 1, 1, 1, 23], + [23, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 31, 1, 1, 1, 31, 1, 1, 1, 31], + [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 23], + [ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 31], + [20, 21, 21, 21, 22, 42, 1, 1, 1, 1, 20, 21, 22, 1, 1, 1, 1, 1, 1, 23], + [24, 25, 25, 25, 26, 1, 1, 1, 1, 1, 24, 25, 26, 1, 1, 1, 1, 1, 1, 31], + [24, 25, 25, 25, 26, 1, 1, 62, 1, 1, 24, 25, 26, 20, 21, 21, 21, 21, 21, 22], + [28, 29, 29, 29, 30, 78, 81, 82, 77, 78, 28, 29, 30, 28, 29, 29, 29, 29, 29, 30], +] +layout2F = [ + [23, 2, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34], + [31, 62, 1, 23, 1, 1, 23, 1, 1, 1, 1, 1, 23, 62, 1, 1, 1, 1, 1, 2], + [23, 1, 1, 31, 1, 1, 31, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 23], + [31, 1, 1, 23, 1, 1, 23, 1, 1, 23, 1, 1, 23, 1, 1, 23, 23, 1, 1, 31], + [23, 1, 1, 31, 1, 1, 31, 1, 1, 31, 2, 2, 31, 1, 1, 31, 31, 1, 1, 23], + [31, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 62, 23, 1, 1, 1, 1, 1, 1, 31], + [23, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 23], + [31, 1, 1, 23, 1, 1, 1, 1, 1, 23, 32, 34, 32, 34, 32, 34, 1, 1, 1, 31], + [23, 1, 1, 31, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23], + [31, 1, 1, 23, 1, 1, 2, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31], + [23, 1, 1, 31, 1, 1, 2, 1, 1, 31, 1, 1, 1, 32, 34, 32, 34, 32, 34, 23], + [31, 2, 2, 2, 1, 1, 32, 34, 32, 34, 1, 1, 1, 23, 1, 1, 1, 1, 1, 31], + [23, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 31, 1, 1, 62, 1, 1, 23], + [31, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 31], + [23, 32, 34, 32, 34, 32, 34, 1, 1, 32, 34, 32, 34, 31, 1, 1, 1, 1, 1, 23], + [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31], + [ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23], + [32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 32, 34, 2, 31] +] + disallowed1F = [[2, 2], [3, 2], [1, 8], [2, 8], [7, 7], [8, 7], [10, 4], [11, 4], [11, 12], [11, 13], [16, 10], [17, 10], [18, 10], [16, 12], [17, 12], [18, 12]] disallowed2F = [[16, 2], [17, 2], [18, 2], [15, 5], [15, 6], [10, 10], [11, 10], [12, 10], [7, 14], [8, 14], [1, 15], @@ -7,29 +57,12 @@ disallowed2F = [[16, 2], [17, 2], [18, 2], [15, 5], [15, 6], [10, 10], [11, 10], [11, 1]] -def randomize_rock_tunnel(data, random): - +def randomize_rock_tunnel(patch: "PokemonRedProcedurePatch | PokemonBlueProcedurePatch", random: random.Random): seed = random.randint(0, 999999999999999999) random.seed(seed) - map1f = [] - map2f = [] - - address = rom_addresses["Map_Rock_Tunnel1F"] - for y in range(0, 18): - row = [] - for x in range(0, 20): - row.append(data[address]) - address += 1 - map1f.append(row) - - address = rom_addresses["Map_Rock_TunnelB1F"] - for y in range(0, 18): - row = [] - for x in range(0, 20): - row.append(data[address]) - address += 1 - map2f.append(row) + map1f = [row.copy() for row in layout1F] + map2f = [row.copy() for row in layout2F] current_map = map1f @@ -305,14 +338,6 @@ def randomize_rock_tunnel(data, random): current_map = map2f check_addable_block(map2f, disallowed2F) - address = rom_addresses["Map_Rock_Tunnel1F"] - for y in map1f: - for x in y: - data[address] = x - address += 1 - address = rom_addresses["Map_Rock_TunnelB1F"] - for y in map2f: - for x in y: - data[address] = x - address += 1 - return seed \ No newline at end of file + patch.write_token(APTokenTypes.WRITE, rom_addresses["Map_Rock_Tunnel1F"], bytes([b for row in map1f for b in row])) + patch.write_token(APTokenTypes.WRITE, rom_addresses["Map_Rock_TunnelB1F"], bytes([b for row in map2f for b in row])) + return seed diff --git a/worlds/pokemon_rb/rom.py b/worlds/pokemon_rb/rom.py index 5ebd204c9a..e49da82cc4 100644 --- a/worlds/pokemon_rb/rom.py +++ b/worlds/pokemon_rb/rom.py @@ -1,21 +1,66 @@ import os -import hashlib -import Utils -import bsdiff4 import pkgutil -from worlds.Files import APDeltaPatch -from .text import encode_text +import typing + +import Utils +from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes + +from . import poke_data from .items import item_table +from .text import encode_text from .pokemon import set_mon_palettes +from .regions import PokemonRBWarp, map_ids, town_map_coords from .rock_tunnel import randomize_rock_tunnel from .rom_addresses import rom_addresses -from .regions import PokemonRBWarp, map_ids, town_map_coords -from . import poke_data + +if typing.TYPE_CHECKING: + from . import PokemonRedBlueWorld -def write_quizzes(world, data, random): +class PokemonRedProcedurePatch(APProcedurePatch, APTokenMixin): + game = "Pokemon Red and Blue" + hash = "3d45c1ee9abd5738df46d2bdda8b57dc" + patch_file_ending = ".apred" + result_file_ending = ".gb" - def get_quiz(q, a): + procedure = [ + ("apply_bsdiff4", ["base_patch.bsdiff4"]), + ("apply_tokens", ["token_data.bin"]), + ] + + @classmethod + def get_source_data(cls) -> bytes: + from . import PokemonRedBlueWorld + with open(PokemonRedBlueWorld.settings.red_rom_file, "rb") as infile: + base_rom_bytes = bytes(infile.read()) + + return base_rom_bytes + + +class PokemonBlueProcedurePatch(APProcedurePatch, APTokenMixin): + game = "Pokemon Red and Blue" + hash = "50927e843568814f7ed45ec4f944bd8b" + patch_file_ending = ".apblue" + result_file_ending = ".gb" + + procedure = [ + ("apply_bsdiff4", ["base_patch.bsdiff4"]), + ("apply_tokens", ["token_data.bin"]), + ] + + @classmethod + def get_source_data(cls) -> bytes: + from . import PokemonRedBlueWorld + with open(PokemonRedBlueWorld.settings.blue_rom_file, "rb") as infile: + base_rom_bytes = bytes(infile.read()) + + return base_rom_bytes + + +def write_quizzes(world: "PokemonRedBlueWorld", patch: PokemonBlueProcedurePatch | PokemonRedProcedurePatch): + random = world.random + + def get_quiz(q: int, a: int): if q == 0: r = random.randint(0, 3) if r == 0: @@ -122,13 +167,13 @@ def write_quizzes(world, data, random): elif q2 == 1: if a: state = random.choice( - ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', - 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', - 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', - 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Jersey', 'New Mexico', - 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', - 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', - 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming']) + ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", + "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", + "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", + "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Jersey", "New Mexico", + "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", + "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", + "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"]) else: state = "New Hampshire" return encode_text( @@ -209,7 +254,7 @@ def write_quizzes(world, data, random): return encode_text(f"{type1} deals{eff}damage to{type2} type?") elif q == 14: fossil_level = world.multiworld.get_location("Fossil Level - Trainer Parties", - world.player).party_data[0]['level'] + world.player).party_data[0]["level"] if not a: fossil_level += random.choice((-5, 5)) return encode_text(f"Fossil #MONrevive at level{fossil_level}?") @@ -224,46 +269,49 @@ def write_quizzes(world, data, random): return encode_text(f"According toMonash Uni.,{fodmap} {are_is}considered highin FODMAPs?") answers = [random.randint(0, 1) for _ in range(6)] - questions = random.sample((range(0, 16)), 6) - - question_texts = [] + question_texts: list[bytearray] = [] for i, question in enumerate(questions): question_texts.append(get_quiz(question, answers[i])) for i, quiz in enumerate(["A", "B", "C", "D", "E", "F"]): - data[rom_addresses[f"Quiz_Answer_{quiz}"]] = int(not answers[i]) << 4 | (i + 1) - write_bytes(data, question_texts[i], rom_addresses[f"Text_Quiz_{quiz}"]) + patch.write_token(APTokenTypes.WRITE, rom_addresses[f"Quiz_Answer_{quiz}"], bytes([int(not answers[i]) << 4 | (i + 1)])) + patch.write_token(APTokenTypes.WRITE, rom_addresses[f"Text_Quiz_{quiz}"], bytes(question_texts[i])) -def generate_output(world, output_directory: str): - random = world.random +def generate_output(world: "PokemonRedBlueWorld", output_directory: str): game_version = world.options.game_version.current_key - data = bytes(get_base_rom_bytes(game_version)) - base_patch = pkgutil.get_data(__name__, f'basepatch_{game_version}.bsdiff4') + patch_type = PokemonBlueProcedurePatch if game_version == "blue" else PokemonRedProcedurePatch + patch = patch_type(player=world.player, player_name=world.player_name) + patch.write_file("base_patch.bsdiff4", pkgutil.get_data(__name__, f"basepatch_{game_version}.bsdiff4")) - data = bytearray(bsdiff4.patch(data, base_patch)) + def write_bytes(address: int, data: typing.Sequence[int] | int): + if isinstance(data, int): + data = bytes([data]) + else: + data = bytes(data) - basemd5 = hashlib.md5() - basemd5.update(data) + patch.write_token(APTokenTypes.WRITE, address, data) pallet_connections = {entrance: world.multiworld.get_entrance(f"Pallet Town to {entrance}", - world.player).connected_region.name for - entrance in ["Player's House 1F", "Oak's Lab", - "Rival's House"]} + world.player).connected_region.name + for entrance in ["Player's House 1F", "Oak's Lab", "Rival's House"]} paths = None + if pallet_connections["Player's House 1F"] == "Oak's Lab": - paths = ((0x00, 4, 0x80, 5, 0x40, 1, 0xE0, 1, 0xFF), (0x40, 2, 0x20, 5, 0x80, 5, 0xFF)) + paths = (bytes([0x00, 4, 0x80, 5, 0x40, 1, 0xE0, 1, 0xFF]), bytes([0x40, 2, 0x20, 5, 0x80, 5, 0xFF])) elif pallet_connections["Rival's House"] == "Oak's Lab": - paths = ((0x00, 4, 0xC0, 3, 0x40, 1, 0xE0, 1, 0xFF), (0x40, 2, 0x10, 3, 0x80, 5, 0xFF)) + paths = (bytes([0x00, 4, 0xC0, 3, 0x40, 1, 0xE0, 1, 0xFF]), bytes([0x40, 2, 0x10, 3, 0x80, 5, 0xFF])) + if paths: - write_bytes(data, paths[0], rom_addresses["Path_Pallet_Oak"]) - write_bytes(data, paths[1], rom_addresses["Path_Pallet_Player"]) + write_bytes(rom_addresses["Path_Pallet_Oak"], paths[0]) + write_bytes(rom_addresses["Path_Pallet_Player"], paths[1]) + if pallet_connections["Rival's House"] == "Player's House 1F": - write_bytes(data, [0x2F, 0xC7, 0x06, 0x0D, 0x00, 0x01], rom_addresses["Pallet_Fly_Coords"]) + write_bytes(rom_addresses["Pallet_Fly_Coords"], [0x2F, 0xC7, 0x06, 0x0D, 0x00, 0x01]) elif pallet_connections["Oak's Lab"] == "Player's House 1F": - write_bytes(data, [0x5F, 0xC7, 0x0C, 0x0C, 0x00, 0x00], rom_addresses["Pallet_Fly_Coords"]) + write_bytes(rom_addresses["Pallet_Fly_Coords"], [0x5F, 0xC7, 0x0C, 0x0C, 0x00, 0x00]) for region in world.multiworld.get_regions(world.player): for entrance in region.exits: @@ -281,16 +329,18 @@ def generate_output(world, output_directory: str): while i > len(warp_to_ids) - 1: i -= len(warp_to_ids) connected_map_name = entrance.connected_region.name.split("-")[0] - data[address] = 0 if "Elevator" in connected_map_name else warp_to_ids[i] - data[address + 1] = map_ids[connected_map_name] + write_bytes(address, [ + 0 if "Elevator" in connected_map_name else warp_to_ids[i], + map_ids[connected_map_name] + ]) if world.options.door_shuffle == "simple": for (entrance, _, _, map_coords_entries, map_name, _) in town_map_coords.values(): destination = world.multiworld.get_entrance(entrance, world.player).connected_region.name (_, x, y, _, _, map_order_entry) = town_map_coords[destination] for map_coord_entry in map_coords_entries: - data[rom_addresses["Town_Map_Coords"] + (map_coord_entry * 4) + 1] = (y << 4) | x - data[rom_addresses["Town_Map_Order"] + map_order_entry] = map_ids[map_name] + write_bytes(rom_addresses["Town_Map_Coords"] + (map_coord_entry * 4) + 1, (y << 4) | x) + write_bytes(rom_addresses["Town_Map_Order"] + map_order_entry, map_ids[map_name]) if not world.options.key_items_only: for i, gym_leader in enumerate(("Pewter Gym - Brock TM", "Cerulean Gym - Misty TM", @@ -302,13 +352,13 @@ def generate_output(world, output_directory: str): try: tm = int(item_name[2:4]) move = poke_data.moves[world.local_tms[tm - 1]]["id"] - data[rom_addresses["Gym_Leader_Moves"] + (2 * i)] = move + write_bytes(rom_addresses["Gym_Leader_Moves"] + (2 * i), move) except KeyError: pass def set_trade_mon(address, loc): mon = world.multiworld.get_location(loc, world.player).item.name - data[rom_addresses[address]] = poke_data.pokemon_data[mon]["id"] + write_bytes(rom_addresses[address], poke_data.pokemon_data[mon]["id"]) world.trade_mons[address] = mon if game_version == "red": @@ -325,141 +375,139 @@ def generate_output(world, output_directory: str): set_trade_mon("Trade_Doris", "Cerulean Cave 1F - Wild Pokemon - 9") set_trade_mon("Trade_Crinkles", "Route 12 - Wild Pokemon - 4") - data[rom_addresses['Fly_Location']] = world.fly_map_code - data[rom_addresses['Map_Fly_Location']] = world.town_map_fly_map_code + write_bytes(rom_addresses["Fly_Location"], world.fly_map_code) + write_bytes(rom_addresses["Map_Fly_Location"], world.town_map_fly_map_code) if world.options.fix_combat_bugs: - data[rom_addresses["Option_Fix_Combat_Bugs"]] = 1 - data[rom_addresses["Option_Fix_Combat_Bugs_Focus_Energy"]] = 0x28 # jr z - data[rom_addresses["Option_Fix_Combat_Bugs_HP_Drain_Dream_Eater"]] = 0x1A # ld a, (de) - data[rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"]] = 0xe6 # and a, direct - data[rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"] + 1] = 0b0011111 - data[rom_addresses["Option_Fix_Combat_Bugs_Struggle"]] = 0xe6 # and a, direct - data[rom_addresses["Option_Fix_Combat_Bugs_Struggle"] + 1] = 0x3f - data[rom_addresses["Option_Fix_Combat_Bugs_Dig_Fly"]] = 0b10001100 - data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"]] = 0x20 # jr nz, - data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"] + 1] = 5 # 5 bytes ahead - data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Stat_Modifiers"]] = 1 + write_bytes(rom_addresses["Option_Fix_Combat_Bugs"], 1) + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Focus_Energy"], 0x28) # jr z + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_HP_Drain_Dream_Eater"], 0x1A) # ld a, (de) + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"], 0xe6) # and a, direct + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"] + 1, 0b0011111) + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Struggle"], 0xe6) # and a, direct + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Struggle"] + 1, 0x3f) + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Dig_Fly"], 0b10001100) + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"], 0x20) # jr nz, + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"] + 1, 5) # 5 bytes ahead + write_bytes(rom_addresses["Option_Fix_Combat_Bugs_Heal_Stat_Modifiers"], 1) if world.options.poke_doll_skip == "in_logic": - data[rom_addresses["Option_Silph_Scope_Skip"]] = 0x00 # nop - data[rom_addresses["Option_Silph_Scope_Skip"] + 1] = 0x00 # nop - data[rom_addresses["Option_Silph_Scope_Skip"] + 2] = 0x00 # nop + write_bytes(rom_addresses["Option_Silph_Scope_Skip"], 0x00) # nop + write_bytes(rom_addresses["Option_Silph_Scope_Skip"] + 1, 0x00) # nop + write_bytes(rom_addresses["Option_Silph_Scope_Skip"] + 2, 0x00) # nop if world.options.bicycle_gate_skips == "patched": - data[rom_addresses["Option_Route_16_Gate_Fix"]] = 0x00 # nop - data[rom_addresses["Option_Route_16_Gate_Fix"] + 1] = 0x00 # nop - data[rom_addresses["Option_Route_18_Gate_Fix"]] = 0x00 # nop - data[rom_addresses["Option_Route_18_Gate_Fix"] + 1] = 0x00 # nop + write_bytes(rom_addresses["Option_Route_16_Gate_Fix"], 0x00) # nop + write_bytes(rom_addresses["Option_Route_16_Gate_Fix"] + 1, 0x00) # nop + write_bytes(rom_addresses["Option_Route_18_Gate_Fix"], 0x00) # nop + write_bytes(rom_addresses["Option_Route_18_Gate_Fix"] + 1, 0x00) # nop if world.options.door_shuffle: - data[rom_addresses["Entrance_Shuffle_Fuji_Warp"]] = 1 # prevent warping to Fuji's House from Pokemon Tower 7F + write_bytes(rom_addresses["Entrance_Shuffle_Fuji_Warp"], 1) # prevent warping to Fuji's House from Pokemon Tower 7F if world.options.all_elevators_locked: - data[rom_addresses["Option_Locked_Elevator_Celadon"]] = 0x20 # jr nz - data[rom_addresses["Option_Locked_Elevator_Silph"]] = 0x20 # jr nz + write_bytes(rom_addresses["Option_Locked_Elevator_Celadon"], 0x20) # jr nz + write_bytes(rom_addresses["Option_Locked_Elevator_Silph"], 0x20) # jr nz if world.options.tea: - data[rom_addresses["Option_Tea"]] = 1 - data[rom_addresses["Guard_Drink_List"]] = 0x54 - data[rom_addresses["Guard_Drink_List"] + 1] = 0 - data[rom_addresses["Guard_Drink_List"] + 2] = 0 - write_bytes(data, encode_text("Gee, I have theworst caffeineheadache though." - "Oh wait there,the road's closed."), - rom_addresses["Text_Saffron_Gate"]) + write_bytes(rom_addresses["Option_Tea"], 1) + write_bytes(rom_addresses["Guard_Drink_List"], 0x54) + write_bytes(rom_addresses["Guard_Drink_List"] + 1, 0) + write_bytes(rom_addresses["Guard_Drink_List"] + 2, 0) + write_bytes(rom_addresses["Text_Saffron_Gate"], + encode_text("Gee, I have theworst caffeineheadache though." + "Oh wait there,the road's closed.")) - data[rom_addresses["Tea_Key_Item_A"]] = 0x28 # jr .z - data[rom_addresses["Tea_Key_Item_B"]] = 0x28 # jr .z - data[rom_addresses["Tea_Key_Item_C"]] = 0x28 # jr .z + write_bytes(rom_addresses["Tea_Key_Item_A"], 0x28) # jr .z + write_bytes(rom_addresses["Tea_Key_Item_B"], 0x28) # jr .z + write_bytes(rom_addresses["Tea_Key_Item_C"], 0x28) # jr .z - data[rom_addresses["Fossils_Needed_For_Second_Item"]] = ( - world.options.second_fossil_check_condition.value) + write_bytes(rom_addresses["Fossils_Needed_For_Second_Item"], world.options.second_fossil_check_condition.value) - data[rom_addresses["Option_Lose_Money"]] = int(not world.options.lose_money_on_blackout.value) + write_bytes(rom_addresses["Option_Lose_Money"], int(not world.options.lose_money_on_blackout.value)) if world.options.extra_key_items: - data[rom_addresses['Option_Extra_Key_Items_A']] = 1 - data[rom_addresses['Option_Extra_Key_Items_B']] = 1 - data[rom_addresses['Option_Extra_Key_Items_C']] = 1 - data[rom_addresses['Option_Extra_Key_Items_D']] = 1 - data[rom_addresses["Option_Split_Card_Key"]] = world.options.split_card_key.value - data[rom_addresses["Option_Blind_Trainers"]] = round(world.options.blind_trainers.value * 2.55) - data[rom_addresses["Option_Cerulean_Cave_Badges"]] = world.options.cerulean_cave_badges_condition.value - data[rom_addresses["Option_Cerulean_Cave_Key_Items"]] = world.options.cerulean_cave_key_items_condition.total - write_bytes(data, encode_text(str(world.options.cerulean_cave_badges_condition.value)), rom_addresses["Text_Cerulean_Cave_Badges"]) - write_bytes(data, encode_text(str(world.options.cerulean_cave_key_items_condition.total) + " key items."), rom_addresses["Text_Cerulean_Cave_Key_Items"]) - data[rom_addresses['Option_Encounter_Minimum_Steps']] = world.options.minimum_steps_between_encounters.value - data[rom_addresses['Option_Route23_Badges']] = world.options.victory_road_condition.value - data[rom_addresses['Option_Victory_Road_Badges']] = world.options.route_22_gate_condition.value - data[rom_addresses['Option_Elite_Four_Pokedex']] = world.options.elite_four_pokedex_condition.total - data[rom_addresses['Option_Elite_Four_Key_Items']] = world.options.elite_four_key_items_condition.total - data[rom_addresses['Option_Elite_Four_Badges']] = world.options.elite_four_badges_condition.value - write_bytes(data, encode_text(str(world.options.elite_four_badges_condition.value)), rom_addresses["Text_Elite_Four_Badges"]) - write_bytes(data, encode_text(str(world.options.elite_four_key_items_condition.total) + " key items, and"), rom_addresses["Text_Elite_Four_Key_Items"]) - write_bytes(data, encode_text(str(world.options.elite_four_pokedex_condition.total) + " #MON"), rom_addresses["Text_Elite_Four_Pokedex"]) - write_bytes(data, encode_text(str(world.total_key_items), length=2), rom_addresses["Trainer_Screen_Total_Key_Items"]) + write_bytes(rom_addresses["Option_Extra_Key_Items_A"], 1) + write_bytes(rom_addresses["Option_Extra_Key_Items_B"], 1) + write_bytes(rom_addresses["Option_Extra_Key_Items_C"], 1) + write_bytes(rom_addresses["Option_Extra_Key_Items_D"], 1) + write_bytes(rom_addresses["Option_Split_Card_Key"], world.options.split_card_key.value) + write_bytes(rom_addresses["Option_Blind_Trainers"], round(world.options.blind_trainers.value * 2.55)) + write_bytes(rom_addresses["Option_Cerulean_Cave_Badges"], world.options.cerulean_cave_badges_condition.value) + write_bytes(rom_addresses["Option_Cerulean_Cave_Key_Items"], world.options.cerulean_cave_key_items_condition.total) + write_bytes(rom_addresses["Text_Cerulean_Cave_Badges"], encode_text(str(world.options.cerulean_cave_badges_condition.value))) + write_bytes(rom_addresses["Text_Cerulean_Cave_Key_Items"], encode_text(str(world.options.cerulean_cave_key_items_condition.total) + " key items.")) + write_bytes(rom_addresses["Option_Encounter_Minimum_Steps"], world.options.minimum_steps_between_encounters.value) + write_bytes(rom_addresses["Option_Route23_Badges"], world.options.victory_road_condition.value) + write_bytes(rom_addresses["Option_Victory_Road_Badges"], world.options.route_22_gate_condition.value) + write_bytes(rom_addresses["Option_Elite_Four_Pokedex"], world.options.elite_four_pokedex_condition.total) + write_bytes(rom_addresses["Option_Elite_Four_Key_Items"], world.options.elite_four_key_items_condition.total) + write_bytes(rom_addresses["Option_Elite_Four_Badges"], world.options.elite_four_badges_condition.value) + write_bytes(rom_addresses["Text_Elite_Four_Badges"], encode_text(str(world.options.elite_four_badges_condition.value))) + write_bytes(rom_addresses["Text_Elite_Four_Key_Items"], encode_text(str(world.options.elite_four_key_items_condition.total) + " key items, and")) + write_bytes(rom_addresses["Text_Elite_Four_Pokedex"], encode_text(str(world.options.elite_four_pokedex_condition.total) + " #MON")) + write_bytes(rom_addresses["Trainer_Screen_Total_Key_Items"], encode_text(str(world.total_key_items), length=2)) - data[rom_addresses['Option_Viridian_Gym_Badges']] = world.options.viridian_gym_condition.value - data[rom_addresses['Option_EXP_Modifier']] = world.options.exp_modifier.value + write_bytes(rom_addresses["Option_Viridian_Gym_Badges"], world.options.viridian_gym_condition.value) + write_bytes(rom_addresses["Option_EXP_Modifier"], world.options.exp_modifier.value) if not world.options.require_item_finder: - data[rom_addresses['Option_Itemfinder']] = 0 # nop + write_bytes(rom_addresses["Option_Itemfinder"], 0) # nop if world.options.extra_strength_boulders: for i in range(0, 3): - data[rom_addresses['Option_Boulders'] + (i * 3)] = 0x15 + write_bytes(rom_addresses["Option_Boulders"] + (i * 3), 0x15) if world.options.extra_key_items: for i in range(0, 4): - data[rom_addresses['Option_Rock_Tunnel_Extra_Items'] + (i * 3)] = 0x15 + write_bytes(rom_addresses["Option_Rock_Tunnel_Extra_Items"] + (i * 3), 0x15) if world.options.old_man == "open_viridian_city": - data[rom_addresses['Option_Old_Man']] = 0x11 - data[rom_addresses['Option_Old_Man_Lying']] = 0x15 - data[rom_addresses['Option_Route3_Guard_B']] = world.options.route_3_condition.value + write_bytes(rom_addresses["Option_Old_Man"], 0x11) + write_bytes(rom_addresses["Option_Old_Man_Lying"], 0x15) + write_bytes(rom_addresses["Option_Route3_Guard_B"], world.options.route_3_condition.value) if world.options.route_3_condition == "open": - data[rom_addresses['Option_Route3_Guard_A']] = 0x11 + write_bytes(rom_addresses["Option_Route3_Guard_A"], 0x11) if not world.options.robbed_house_officer: - data[rom_addresses['Option_Trashed_House_Guard_A']] = 0x15 - data[rom_addresses['Option_Trashed_House_Guard_B']] = 0x11 + write_bytes(rom_addresses["Option_Trashed_House_Guard_A"], 0x15) + write_bytes(rom_addresses["Option_Trashed_House_Guard_B"], 0x11) if world.options.require_pokedex: - data[rom_addresses["Require_Pokedex_A"]] = 1 - data[rom_addresses["Require_Pokedex_B"]] = 1 - data[rom_addresses["Require_Pokedex_C"]] = 1 + write_bytes(rom_addresses["Require_Pokedex_A"], 1) + write_bytes(rom_addresses["Require_Pokedex_B"], 1) + write_bytes(rom_addresses["Require_Pokedex_C"], 1) else: - data[rom_addresses["Require_Pokedex_D"]] = 0x18 # jr + write_bytes(rom_addresses["Require_Pokedex_D"], 0x18) # jr if world.options.dexsanity: - data[rom_addresses["Option_Dexsanity_A"]] = 1 - data[rom_addresses["Option_Dexsanity_B"]] = 1 + write_bytes(rom_addresses["Option_Dexsanity_A"], 1) + write_bytes(rom_addresses["Option_Dexsanity_B"], 1) if world.options.all_pokemon_seen: - data[rom_addresses["Option_Pokedex_Seen"]] = 1 + write_bytes(rom_addresses["Option_Pokedex_Seen"], 1) money = str(world.options.starting_money.value).zfill(6) - data[rom_addresses["Starting_Money_High"]] = int(money[:2], 16) - data[rom_addresses["Starting_Money_Middle"]] = int(money[2:4], 16) - data[rom_addresses["Starting_Money_Low"]] = int(money[4:], 16) - data[rom_addresses["Text_Badges_Needed_Viridian_Gym"]] = encode_text( - str(world.options.viridian_gym_condition.value))[0] - data[rom_addresses["Text_Rt23_Badges_A"]] = encode_text( - str(world.options.victory_road_condition.value))[0] - data[rom_addresses["Text_Rt23_Badges_B"]] = encode_text( - str(world.options.victory_road_condition.value))[0] - data[rom_addresses["Text_Rt23_Badges_C"]] = encode_text( - str(world.options.victory_road_condition.value))[0] - data[rom_addresses["Text_Rt23_Badges_D"]] = encode_text( - str(world.options.victory_road_condition.value))[0] - data[rom_addresses["Text_Badges_Needed"]] = encode_text( - str(world.options.elite_four_badges_condition.value))[0] - write_bytes(data, encode_text( - " ".join(world.multiworld.get_location("Route 4 Pokemon Center - Pokemon For Sale", world.player).item.name.upper().split()[1:])), - rom_addresses["Text_Magikarp_Salesman"]) + write_bytes(rom_addresses["Starting_Money_High"], int(money[:2], 16)) + write_bytes(rom_addresses["Starting_Money_Middle"], int(money[2:4], 16)) + write_bytes(rom_addresses["Starting_Money_Low"], int(money[4:], 16)) + write_bytes(rom_addresses["Text_Badges_Needed_Viridian_Gym"], + encode_text(str(world.options.viridian_gym_condition.value))[0]) + write_bytes(rom_addresses["Text_Rt23_Badges_A"], + encode_text(str(world.options.victory_road_condition.value))[0]) + write_bytes(rom_addresses["Text_Rt23_Badges_B"], + encode_text(str(world.options.victory_road_condition.value))[0]) + write_bytes(rom_addresses["Text_Rt23_Badges_C"], + encode_text(str(world.options.victory_road_condition.value))[0]) + write_bytes(rom_addresses["Text_Rt23_Badges_D"], + encode_text(str(world.options.victory_road_condition.value))[0]) + write_bytes(rom_addresses["Text_Badges_Needed"], + encode_text(str(world.options.elite_four_badges_condition.value))[0]) + write_bytes(rom_addresses["Text_Magikarp_Salesman"], + encode_text(" ".join(world.multiworld.get_location("Route 4 Pokemon Center - Pokemon For Sale", world.player).item.name.upper().split()[1:]))) if world.options.badges_needed_for_hm_moves.value == 0: for hm_move in poke_data.hm_moves: - write_bytes(data, bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), - rom_addresses["HM_" + hm_move + "_Badge_a"]) + write_bytes(rom_addresses["HM_" + hm_move + "_Badge_a"], [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) elif world.extra_badges: written_badges = {} + badge_codes = {"Boulder Badge": 0x47, "Cascade Badge": 0x4F, + "Thunder Badge": 0x57, "Rainbow Badge": 0x5F, + "Soul Badge": 0x67, "Marsh Badge": 0x6F, + "Volcano Badge": 0x77, "Earth Badge": 0x7F} for hm_move, badge in world.extra_badges.items(): - data[rom_addresses["HM_" + hm_move + "_Badge_b"]] = {"Boulder Badge": 0x47, "Cascade Badge": 0x4F, - "Thunder Badge": 0x57, "Rainbow Badge": 0x5F, - "Soul Badge": 0x67, "Marsh Badge": 0x6F, - "Volcano Badge": 0x77, "Earth Badge": 0x7F}[badge] + write_bytes(rom_addresses["HM_" + hm_move + "_Badge_b"], badge_codes[badge]) move_text = hm_move if badge not in ["Marsh Badge", "Volcano Badge", "Earth Badge"]: move_text = ", " + move_text @@ -467,62 +515,58 @@ def generate_output(world, output_directory: str): if badge in written_badges: rom_address += len(written_badges[badge]) move_text = ", " + move_text - write_bytes(data, encode_text(move_text.upper()), rom_address) + write_bytes(rom_address, encode_text(move_text.upper())) written_badges[badge] = move_text for badge in ["Marsh Badge", "Volcano Badge", "Earth Badge"]: if badge not in written_badges: - write_bytes(data, encode_text("Nothing"), rom_addresses["Badge_Text_" + badge.replace(" ", "_")]) + write_bytes(rom_addresses["Badge_Text_" + badge.replace(" ", "_")], encode_text("Nothing")) type_loc = rom_addresses["Type_Chart"] for matchup in world.type_chart: if matchup[2] != 10: # don't needlessly divide damage by 10 and multiply by 10 - data[type_loc] = poke_data.type_ids[matchup[0]] - data[type_loc + 1] = poke_data.type_ids[matchup[1]] - data[type_loc + 2] = matchup[2] + write_bytes(type_loc, [poke_data.type_ids[matchup[0]], poke_data.type_ids[matchup[1]], matchup[2]]) type_loc += 3 - data[type_loc] = 0xFF - data[type_loc + 1] = 0xFF - data[type_loc + 2] = 0xFF + write_bytes(type_loc, b"\xFF\xFF\xFF") if world.options.normalize_encounter_chances.value: chances = [25, 51, 77, 103, 129, 155, 180, 205, 230, 255] for i, chance in enumerate(chances): - data[rom_addresses['Encounter_Chances'] + (i * 2)] = chance + write_bytes(rom_addresses["Encounter_Chances"] + (i * 2), chance) for mon, mon_data in world.local_poke_data.items(): if mon == "Mew": address = rom_addresses["Base_Stats_Mew"] else: address = rom_addresses["Base_Stats"] + (28 * (mon_data["dex"] - 1)) - data[address + 1] = world.local_poke_data[mon]["hp"] - data[address + 2] = world.local_poke_data[mon]["atk"] - data[address + 3] = world.local_poke_data[mon]["def"] - data[address + 4] = world.local_poke_data[mon]["spd"] - data[address + 5] = world.local_poke_data[mon]["spc"] - data[address + 6] = poke_data.type_ids[world.local_poke_data[mon]["type1"]] - data[address + 7] = poke_data.type_ids[world.local_poke_data[mon]["type2"]] - data[address + 8] = world.local_poke_data[mon]["catch rate"] - data[address + 15] = poke_data.moves[world.local_poke_data[mon]["start move 1"]]["id"] - data[address + 16] = poke_data.moves[world.local_poke_data[mon]["start move 2"]]["id"] - data[address + 17] = poke_data.moves[world.local_poke_data[mon]["start move 3"]]["id"] - data[address + 18] = poke_data.moves[world.local_poke_data[mon]["start move 4"]]["id"] - write_bytes(data, world.local_poke_data[mon]["tms"], address + 20) + write_bytes(address + 1, world.local_poke_data[mon]["hp"]) + write_bytes(address + 2, world.local_poke_data[mon]["atk"]) + write_bytes(address + 3, world.local_poke_data[mon]["def"]) + write_bytes(address + 4, world.local_poke_data[mon]["spd"]) + write_bytes(address + 5, world.local_poke_data[mon]["spc"]) + write_bytes(address + 6, poke_data.type_ids[world.local_poke_data[mon]["type1"]]) + write_bytes(address + 7, poke_data.type_ids[world.local_poke_data[mon]["type2"]]) + write_bytes(address + 8, world.local_poke_data[mon]["catch rate"]) + write_bytes(address + 15, poke_data.moves[world.local_poke_data[mon]["start move 1"]]["id"]) + write_bytes(address + 16, poke_data.moves[world.local_poke_data[mon]["start move 2"]]["id"]) + write_bytes(address + 17, poke_data.moves[world.local_poke_data[mon]["start move 3"]]["id"]) + write_bytes(address + 18, poke_data.moves[world.local_poke_data[mon]["start move 4"]]["id"]) + write_bytes(address + 20, world.local_poke_data[mon]["tms"]) if mon in world.learnsets and world.learnsets[mon]: address = rom_addresses["Learnset_" + mon.replace(" ", "")] for i, move in enumerate(world.learnsets[mon]): - data[(address + 1) + i * 2] = poke_data.moves[move]["id"] + write_bytes((address + 1) + i * 2, poke_data.moves[move]["id"]) - data[rom_addresses["Option_Aide_Rt2"]] = world.options.oaks_aide_rt_2.value - data[rom_addresses["Option_Aide_Rt11"]] = world.options.oaks_aide_rt_11.value - data[rom_addresses["Option_Aide_Rt15"]] = world.options.oaks_aide_rt_15.value + write_bytes(rom_addresses["Option_Aide_Rt2"], world.options.oaks_aide_rt_2.value) + write_bytes(rom_addresses["Option_Aide_Rt11"], world.options.oaks_aide_rt_11.value) + write_bytes(rom_addresses["Option_Aide_Rt15"], world.options.oaks_aide_rt_15.value) if world.options.safari_zone_normal_battles.value == 1: - data[rom_addresses["Option_Safari_Zone_Battle_Type"]] = 255 + write_bytes(rom_addresses["Option_Safari_Zone_Battle_Type"], 255) if world.options.reusable_tms.value: - data[rom_addresses["Option_Reusable_TMs"]] = 0xC9 + write_bytes(rom_addresses["Option_Reusable_TMs"], 0xC9) - data[rom_addresses["Option_Always_Half_STAB"]] = int(not world.options.same_type_attack_bonus.value) + write_bytes(rom_addresses["Option_Always_Half_STAB"], int(not world.options.same_type_attack_bonus.value)) if world.options.better_shops: inventory = ["Poke Ball", "Great Ball", "Ultra Ball"] @@ -531,43 +575,45 @@ def generate_output(world, output_directory: str): inventory += ["Potion", "Super Potion", "Hyper Potion", "Max Potion", "Full Restore", "Revive", "Antidote", "Awakening", "Burn Heal", "Ice Heal", "Paralyze Heal", "Full Heal", "Repel", "Super Repel", "Max Repel", "Escape Rope"] - shop_data = bytearray([0xFE, len(inventory)]) - shop_data += bytearray([item_table[item].id - 172000000 for item in inventory]) + shop_data = [0xFE, len(inventory)] + shop_data += [item_table[item].id - 172000000 for item in inventory] shop_data.append(0xFF) for shop in range(1, 11): - write_bytes(data, shop_data, rom_addresses[f"Shop{shop}"]) + write_bytes(rom_addresses[f"Shop{shop}"], shop_data) if world.options.stonesanity: - write_bytes(data, bytearray([0xFE, 1, item_table["Poke Doll"].id - 172000000, 0xFF]), rom_addresses[f"Shop_Stones"]) + write_bytes(rom_addresses["Shop_Stones"], [0xFE, 1, item_table["Poke Doll"].id - 172000000, 0xFF]) price = str(world.options.master_ball_price.value).zfill(6) - price = bytearray([int(price[:2], 16), int(price[2:4], 16), int(price[4:], 16)]) - write_bytes(data, price, rom_addresses["Price_Master_Ball"]) # Money values in Red and Blue are weird + price = [int(price[:2], 16), int(price[2:4], 16), int(price[4:], 16)] + write_bytes(rom_addresses["Price_Master_Ball"], price) # Money values in Red and Blue are weird - for item in reversed(world.multiworld.precollected_items[world.player]): - if data[rom_addresses["Start_Inventory"] + item.code - 172000000] < 255: - data[rom_addresses["Start_Inventory"] + item.code - 172000000] += 1 + from collections import Counter + start_inventory = Counter(item.code for item in reversed(world.multiworld.precollected_items[world.player])) + for item, value in start_inventory.items(): + write_bytes(rom_addresses["Start_Inventory"] + item - 172000000, min(value, 255)) - set_mon_palettes(world, random, data) + set_mon_palettes(world, patch) for move_data in world.local_move_data.values(): if move_data["id"] == 0: continue address = rom_addresses["Move_Data"] + ((move_data["id"] - 1) * 6) - write_bytes(data, bytearray([move_data["id"], move_data["effect"], move_data["power"], - poke_data.type_ids[move_data["type"]], round(move_data["accuracy"] * 2.55), move_data["pp"]]), address) + write_bytes(address, [move_data["id"], move_data["effect"], move_data["power"], + poke_data.type_ids[move_data["type"]], round(move_data["accuracy"] * 2.55), + move_data["pp"]]) - TM_IDs = bytearray([poke_data.moves[move]["id"] for move in world.local_tms]) - write_bytes(data, TM_IDs, rom_addresses["TM_Moves"]) + TM_IDs = [poke_data.moves[move]["id"] for move in world.local_tms] + write_bytes(rom_addresses["TM_Moves"], TM_IDs) if world.options.randomize_rock_tunnel: - seed = randomize_rock_tunnel(data, random) - write_bytes(data, encode_text(f"SEED: {seed}"), rom_addresses["Text_Rock_Tunnel_Sign"]) + seed = randomize_rock_tunnel(patch, world.random) + write_bytes(rom_addresses["Text_Rock_Tunnel_Sign"], encode_text(f"SEED: {seed}")) mons = [mon["id"] for mon in poke_data.pokemon_data.values()] - random.shuffle(mons) - data[rom_addresses['Title_Mon_First']] = mons.pop() + world.random.shuffle(mons) + write_bytes(rom_addresses["Title_Mon_First"], mons.pop()) for mon in range(0, 16): - data[rom_addresses['Title_Mons'] + mon] = mons.pop() + write_bytes(rom_addresses["Title_Mons"] + mon, mons.pop()) if world.options.game_version.value: mons.sort(key=lambda mon: 0 if mon == world.multiworld.get_location("Oak's Lab - Starter 1", world.player).item.name else 1 if mon == world.multiworld.get_location("Oak's Lab - Starter 2", world.player).item.name else @@ -576,34 +622,34 @@ def generate_output(world, output_directory: str): mons.sort(key=lambda mon: 0 if mon == world.multiworld.get_location("Oak's Lab - Starter 2", world.player).item.name else 1 if mon == world.multiworld.get_location("Oak's Lab - Starter 1", world.player).item.name else 2 if mon == world.multiworld.get_location("Oak's Lab - Starter 3", world.player).item.name else 3) - write_bytes(data, encode_text(world.multiworld.seed_name[-20:], 20, True), rom_addresses['Title_Seed']) + write_bytes(rom_addresses["Title_Seed"], encode_text(world.multiworld.seed_name[-20:], 20, True)) slot_name = world.multiworld.player_name[world.player] slot_name.replace("@", " ") slot_name.replace("<", " ") slot_name.replace(">", " ") - write_bytes(data, encode_text(slot_name, 16, True, True), rom_addresses['Title_Slot_Name']) + write_bytes(rom_addresses["Title_Slot_Name"], encode_text(slot_name, 16, True, True)) if world.trainer_name == "choose_in_game": - data[rom_addresses["Skip_Player_Name"]] = 0 + write_bytes(rom_addresses["Skip_Player_Name"], 0) else: - write_bytes(data, world.trainer_name, rom_addresses['Player_Name']) + write_bytes(rom_addresses["Player_Name"], world.trainer_name) if world.rival_name == "choose_in_game": - data[rom_addresses["Skip_Rival_Name"]] = 0 + write_bytes(rom_addresses["Skip_Rival_Name"], 0) else: - write_bytes(data, world.rival_name, rom_addresses['Rival_Name']) + write_bytes(rom_addresses["Rival_Name"], world.rival_name) - data[0xFF00] = 2 # client compatibility version - rom_name = bytearray(f'AP{Utils.__version__.replace(".", "")[0:3]}_{world.player}_{world.multiworld.seed:11}\0', - 'utf8')[:21] + write_bytes(0xFF00, 2) # client compatibility version + rom_name = bytearray(f"AP{Utils.__version__.replace('.', '')[0:3]}_{world.player}_{world.multiworld.seed:11}\0", + "utf8")[:21] rom_name.extend([0] * (21 - len(rom_name))) - write_bytes(data, rom_name, 0xFFC6) - write_bytes(data, world.multiworld.seed_name.encode(), 0xFFDB) - write_bytes(data, world.multiworld.player_name[world.player].encode(), 0xFFF0) + write_bytes(0xFFC6, rom_name) + write_bytes(0xFFDB, world.multiworld.seed_name.encode()) + write_bytes(0xFFF0, world.multiworld.player_name[world.player].encode()) world.finished_level_scaling.wait() - write_quizzes(world, data, random) + write_quizzes(world, patch) for location in world.multiworld.get_locations(world.player): if location.party_data: @@ -617,18 +663,18 @@ def generate_output(world, output_directory: str): levels = party["level"] for address, party in zip(addresses, parties): if isinstance(levels, int): - data[address] = levels + write_bytes(address, levels) address += 1 for mon in party: - data[address] = poke_data.pokemon_data[mon]["id"] + write_bytes(address, poke_data.pokemon_data[mon]["id"]) address += 1 else: address += 1 for level, mon in zip(levels, party): - data[address] = level - data[address + 1] = poke_data.pokemon_data[mon]["id"] + write_bytes(address, [level, poke_data.pokemon_data[mon]["id"]]) address += 2 - assert data[address] == 0 or location.name == "Fossil Level - Trainer Parties" + # This assert can't be done with procedure patch tokens. + # assert data[address] == 0 or location.name == "Fossil Level - Trainer Parties" continue elif location.rom_address is None: continue @@ -639,85 +685,24 @@ def generate_output(world, output_directory: str): rom_address = [rom_address] for address in rom_address: if location.item.name in poke_data.pokemon_data.keys(): - data[address] = poke_data.pokemon_data[location.item.name]["id"] + write_bytes(address, poke_data.pokemon_data[location.item.name]["id"]) elif " ".join(location.item.name.split()[1:]) in poke_data.pokemon_data.keys(): - data[address] = poke_data.pokemon_data[" ".join(location.item.name.split()[1:])]["id"] + write_bytes(address, poke_data.pokemon_data[" ".join(location.item.name.split()[1:])]["id"]) else: item_id = world.item_name_to_id[location.item.name] - 172000000 if item_id > 255: item_id -= 256 - data[address] = item_id + write_bytes(address, item_id) if location.level: - data[location.level_address] = location.level + write_bytes(location.level_address, location.level) else: rom_address = location.rom_address if not isinstance(rom_address, list): rom_address = [rom_address] for address in rom_address: - data[address] = 0x2C # AP Item + write_bytes(address, 0x2C) # AP Item - outfilepname = f'_P{world.player}' - outfilepname += f"_{world.multiworld.get_file_safe_player_name(world.player).replace(' ', '_')}" \ - if world.multiworld.player_name[world.player] != 'Player%d' % world.player else '' - rompath = os.path.join(output_directory, f'AP_{world.multiworld.seed_name}{outfilepname}.gb') - with open(rompath, 'wb') as outfile: - outfile.write(data) - if world.options.game_version.current_key == "red": - patch = RedDeltaPatch(os.path.splitext(rompath)[0] + RedDeltaPatch.patch_file_ending, player=world.player, - player_name=world.multiworld.player_name[world.player], patched_path=rompath) - else: - patch = BlueDeltaPatch(os.path.splitext(rompath)[0] + BlueDeltaPatch.patch_file_ending, player=world.player, - player_name=world.multiworld.player_name[world.player], patched_path=rompath) - - patch.write() - os.unlink(rompath) - - -def write_bytes(data, byte_array, address): - for byte in byte_array: - data[address] = byte - address += 1 - - -def get_base_rom_bytes(game_version: str, hash: str="") -> bytes: - file_name = get_base_rom_path(game_version) - with open(file_name, "rb") as file: - base_rom_bytes = bytes(file.read()) - if hash: - basemd5 = hashlib.md5() - basemd5.update(base_rom_bytes) - if hash != basemd5.hexdigest(): - raise Exception(f"Supplied Base Rom does not match known MD5 for Pokémon {game_version.title()} UE " - "release. Get the correct game and version, then dump it") - return base_rom_bytes - - -def get_base_rom_path(game_version: str) -> str: - options = Utils.get_options() - file_name = options["pokemon_rb_options"][f"{game_version}_rom_file"] - if not os.path.exists(file_name): - file_name = Utils.user_path(file_name) - return file_name - - -class BlueDeltaPatch(APDeltaPatch): - patch_file_ending = ".apblue" - hash = "50927e843568814f7ed45ec4f944bd8b" - game_version = "blue" - game = "Pokemon Red and Blue" - result_file_ending = ".gb" - @classmethod - def get_source_data(cls) -> bytes: - return get_base_rom_bytes(cls.game_version, cls.hash) - - -class RedDeltaPatch(APDeltaPatch): - patch_file_ending = ".apred" - hash = "3d45c1ee9abd5738df46d2bdda8b57dc" - game_version = "red" - game = "Pokemon Red and Blue" - result_file_ending = ".gb" - @classmethod - def get_source_data(cls) -> bytes: - return get_base_rom_bytes(cls.game_version, cls.hash) + patch.write_file("token_data.bin", patch.get_token_binary()) + out_file_name = world.multiworld.get_out_file_name_base(world.player) + patch.write(os.path.join(output_directory, f"{out_file_name}{patch.patch_file_ending}")) From c46ee7c4209f064e9aa90bc8e6eb141f4a438b6c Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Wed, 30 Apr 2025 15:57:46 -0400 Subject: [PATCH 094/199] TUNIC: Lock pre-placed filler to make the game play nicer with prog balancing (#4917) --- worlds/tunic/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 9d97e5711b..aa6c8cdfb9 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -486,10 +486,10 @@ class TunicWorld(World): multiworld.random.shuffle(non_grass_fill_locations) for filler_item in grass_fill: - multiworld.push_item(grass_fill_locations.pop(), filler_item, collect=False) + grass_fill_locations.pop().place_locked_item(filler_item) for filler_item in non_grass_fill: - multiworld.push_item(non_grass_fill_locations.pop(), filler_item, collect=False) + non_grass_fill_locations.pop().place_locked_item(filler_item) def create_regions(self) -> None: self.tunic_portal_pairs = {} From 6beaacb9058f645dbb3f4cc77702cf02c17e7e83 Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 2 May 2025 08:46:34 -0500 Subject: [PATCH 095/199] Generate: Better yaml parsing error messaging (#4927) Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> --- Generate.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Generate.py b/Generate.py index 5b5219841d..867a5b6c7a 100644 --- a/Generate.py +++ b/Generate.py @@ -252,7 +252,20 @@ def read_weights_yamls(path) -> Tuple[Any, ...]: except Exception as e: raise Exception(f"Failed to read weights ({path})") from e - return tuple(parse_yamls(yaml)) + from yaml.error import MarkedYAMLError + try: + return tuple(parse_yamls(yaml)) + except MarkedYAMLError as ex: + if ex.problem_mark: + lines = yaml.splitlines() + if ex.context_mark: + relevant_lines = "\n".join(lines[ex.context_mark.line:ex.problem_mark.line+1]) + else: + relevant_lines = lines[ex.problem_mark.line] + error_line = " " * ex.problem_mark.column + "^" + raise Exception(f"{ex.context} {ex.problem} on line {ex.problem_mark.line}:" + f"\n{relevant_lines}\n{error_line}") + raise ex def interpret_on_off(value) -> bool: From 1031fc49237b27f0ab18540fe64a826dc5823e62 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 2 May 2025 15:59:27 +0200 Subject: [PATCH 096/199] Factorio: remove FactorioClient executable (#4928) --- FactorioClient.py | 12 ------------ worlds/factorio/__init__.py | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 FactorioClient.py diff --git a/FactorioClient.py b/FactorioClient.py deleted file mode 100644 index 070ca50326..0000000000 --- a/FactorioClient.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import annotations - -import ModuleUpdate -ModuleUpdate.update() - -from worlds.factorio.Client import check_stdin, launch -import Utils - -if __name__ == "__main__": - Utils.init_logging("FactorioClient", exception_logger="Client") - check_stdin() - launch() diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index 87e36555a5..ddebc7e3fd 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -27,7 +27,7 @@ def launch_client(): launch_component(launch, name="FactorioClient") -components.append(Component("Factorio Client", "FactorioClient", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("Factorio Client", func=launch_client, component_type=Type.CLIENT)) class FactorioSettings(settings.Group): From 2455f1158ffff2bc919532374580f79a6f7b4aa9 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Fri, 2 May 2025 11:39:58 -0500 Subject: [PATCH 097/199] Options: Cleanup CommonOptions.as_dict (#4921) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- Options.py | 61 +++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Options.py b/Options.py index 6a6bbe5e77..bea3804d1e 100644 --- a/Options.py +++ b/Options.py @@ -1292,42 +1292,47 @@ class CommonOptions(metaclass=OptionsMetaProperty): progression_balancing: ProgressionBalancing accessibility: Accessibility - def as_dict(self, - *option_names: str, - casing: typing.Literal["snake", "camel", "pascal", "kebab"] = "snake", - toggles_as_bools: bool = False) -> typing.Dict[str, typing.Any]: + def as_dict( + self, + *option_names: str, + casing: typing.Literal["snake", "camel", "pascal", "kebab"] = "snake", + toggles_as_bools: bool = False, + ) -> dict[str, typing.Any]: """ Returns a dictionary of [str, Option.value] - :param option_names: names of the options to return - :param casing: case of the keys to return. Supports `snake`, `camel`, `pascal`, `kebab` - :param toggles_as_bools: whether toggle options should be output as bools instead of strings + :param option_names: Names of the options to get the values of. + :param casing: Casing of the keys to return. Supports `snake`, `camel`, `pascal`, `kebab`. + :param toggles_as_bools: Whether toggle options should be returned as bools instead of ints. + + :return: A dictionary of each option name to the value of its Option. If the option is an OptionSet, the value + will be returned as a sorted list. """ assert option_names, "options.as_dict() was used without any option names." option_results = {} for option_name in option_names: - if option_name in type(self).type_hints: - if casing == "snake": - display_name = option_name - elif casing == "camel": - split_name = [name.title() for name in option_name.split("_")] - split_name[0] = split_name[0].lower() - display_name = "".join(split_name) - elif casing == "pascal": - display_name = "".join([name.title() for name in option_name.split("_")]) - elif casing == "kebab": - display_name = option_name.replace("_", "-") - else: - raise ValueError(f"{casing} is invalid casing for as_dict. " - "Valid names are 'snake', 'camel', 'pascal', 'kebab'.") - value = getattr(self, option_name).value - if isinstance(value, set): - value = sorted(value) - elif toggles_as_bools and issubclass(type(self).type_hints[option_name], Toggle): - value = bool(value) - option_results[display_name] = value - else: + if option_name not in type(self).type_hints: raise ValueError(f"{option_name} not found in {tuple(type(self).type_hints)}") + + if casing == "snake": + display_name = option_name + elif casing == "camel": + split_name = [name.title() for name in option_name.split("_")] + split_name[0] = split_name[0].lower() + display_name = "".join(split_name) + elif casing == "pascal": + display_name = "".join([name.title() for name in option_name.split("_")]) + elif casing == "kebab": + display_name = option_name.replace("_", "-") + else: + raise ValueError(f"{casing} is invalid casing for as_dict. " + "Valid names are 'snake', 'camel', 'pascal', 'kebab'.") + value = getattr(self, option_name).value + if isinstance(value, set): + value = sorted(value) + elif toggles_as_bools and issubclass(type(self).type_hints[option_name], Toggle): + value = bool(value) + option_results[display_name] = value return option_results From da0207f5cb419baa1f7b05c448bead91dbaa0bd4 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 2 May 2025 23:39:14 +0200 Subject: [PATCH 098/199] Factorio: implement custom filler items (#4945) --- worlds/AutoWorld.py | 2 +- worlds/factorio/__init__.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 67455a1a21..f0004a9f1b 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -485,7 +485,7 @@ class World(metaclass=AutoWorldRegister): def get_filler_item_name(self) -> str: """Called when the item pool needs to be filled with additional items to match location count.""" logging.warning(f"World {self} is generating a filler item without custom filler pool.") - return self.multiworld.random.choice(tuple(self.item_name_to_id.keys())) + return self.random.choice(tuple(self.item_name_to_id.keys())) @classmethod def create_group(cls, multiworld: "MultiWorld", new_player_id: int, players: Set[int]) -> World: diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index ddebc7e3fd..0e96e7f89b 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -115,6 +115,7 @@ class Factorio(World): settings: typing.ClassVar[FactorioSettings] trap_names: tuple[str] = ("Evolution", "Attack", "Teleport", "Grenade", "Cluster Grenade", "Artillery", "Atomic Rocket", "Atomic Cliff Remover", "Inventory Spill") + want_progressives: dict[str, bool] = collections.defaultdict(lambda: False) def __init__(self, world, player: int): super(Factorio, self).__init__(world, player) @@ -133,6 +134,8 @@ class Factorio(World): self.options.max_tech_cost.value, self.options.min_tech_cost.value self.tech_mix = self.options.tech_cost_mix.value self.skip_silo = self.options.silo.value == Silo.option_spawn + self.want_progressives = collections.defaultdict( + lambda: self.options.progressive.want_progressives(self.random)) def create_regions(self): player = self.player @@ -201,9 +204,6 @@ class Factorio(World): range(getattr(self.options, f"{trap_name.lower().replace(' ', '_')}_traps"))) - want_progressives = collections.defaultdict(lambda: self.options.progressive. - want_progressives(self.random)) - cost_sorted_locations = sorted(self.science_locations, key=lambda location: location.name) special_index = {"automation": 0, "logistics": 1, @@ -218,7 +218,7 @@ class Factorio(World): for tech_name in base_tech_table: if tech_name not in self.removed_technologies: progressive_item_name = tech_to_progressive_lookup.get(tech_name, tech_name) - want_progressive = want_progressives[progressive_item_name] + want_progressive = self.want_progressives[progressive_item_name] item_name = progressive_item_name if want_progressive else tech_name tech_item = self.create_item(item_name) index = special_index.get(tech_name, None) @@ -233,6 +233,12 @@ class Factorio(World): loc.place_locked_item(tech_item) loc.revealed = True + def get_filler_item_name(self) -> str: + tech_name: str = self.random.choice(tuple(tech_table)) + progressive_item_name: str = tech_to_progressive_lookup.get(tech_name, tech_name) + want_progressive: bool = self.want_progressives[progressive_item_name] + return progressive_item_name if want_progressive else tech_name + def set_rules(self): player = self.player shapes = get_shapes(self) From 68c350b4c060bab81190ffede5f1f1649a949aa1 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 2 May 2025 23:39:52 +0200 Subject: [PATCH 099/199] CommonClient: rip out old global name lookup (#4941) --- CommonClient.py | 15 --------------- test/programs/test_common_client.py | 11 ----------- 2 files changed, 26 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index b622fb939b..5179110061 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -196,25 +196,11 @@ class CommonContext: self.lookup_type: typing.Literal["item", "location"] = lookup_type self._unknown_item: typing.Callable[[int], str] = lambda key: f"Unknown {lookup_type} (ID: {key})" self._archipelago_lookup: typing.Dict[int, str] = {} - self._flat_store: typing.Dict[int, str] = Utils.KeyedDefaultDict(self._unknown_item) self._game_store: typing.Dict[str, typing.ChainMap[int, str]] = collections.defaultdict( lambda: collections.ChainMap(self._archipelago_lookup, Utils.KeyedDefaultDict(self._unknown_item))) - self.warned: bool = False # noinspection PyTypeChecker def __getitem__(self, key: str) -> typing.Mapping[int, str]: - # TODO: In a future version (0.6.0?) this should be simplified by removing implicit id lookups support. - if isinstance(key, int): - if not self.warned: - # Use warnings instead of logger to avoid deprecation message from appearing on user side. - self.warned = True - warnings.warn(f"Implicit name lookup by id only is deprecated and only supported to maintain " - f"backwards compatibility for now. If multiple games share the same id for a " - f"{self.lookup_type}, name could be incorrect. Please use " - f"`{self.lookup_type}_names.lookup_in_game()` or " - f"`{self.lookup_type}_names.lookup_in_slot()` instead.") - return self._flat_store[key] # type: ignore - return self._game_store[key] def __len__(self) -> int: @@ -254,7 +240,6 @@ class CommonContext: id_to_name_lookup_table = Utils.KeyedDefaultDict(self._unknown_item) id_to_name_lookup_table.update({code: name for name, code in name_to_id_lookup_table.items()}) self._game_store[game] = collections.ChainMap(self._archipelago_lookup, id_to_name_lookup_table) - self._flat_store.update(id_to_name_lookup_table) # Only needed for legacy lookup method. if game == "Archipelago": # Keep track of the Archipelago data package separately so if it gets updated in a custom datapackage, # it updates in all chain maps automatically. diff --git a/test/programs/test_common_client.py b/test/programs/test_common_client.py index 9936240d17..eeeba9d44c 100644 --- a/test/programs/test_common_client.py +++ b/test/programs/test_common_client.py @@ -47,17 +47,6 @@ class TestCommonContext(unittest.IsolatedAsyncioTestCase): assert "Archipelago" in self.ctx.item_names, "Archipelago item names entry does not exist" assert "Archipelago" in self.ctx.location_names, "Archipelago location names entry does not exist" - async def test_implicit_name_lookups(self): - # Items - assert self.ctx.item_names[2**54 + 1] == "Test Item 1 - Safe" - assert self.ctx.item_names[2**54 + 3] == f"Unknown item (ID: {2**54+3})" - assert self.ctx.item_names[-1] == "Nothing" - - # Locations - assert self.ctx.location_names[2**54 + 1] == "Test Location 1 - Safe" - assert self.ctx.location_names[2**54 + 3] == f"Unknown location (ID: {2**54+3})" - assert self.ctx.location_names[-1] == "Cheat Console" - async def test_explicit_name_lookups(self): # Items assert self.ctx.item_names["__TestGame1"][2**54+1] == "Test Item 1 - Safe" From f4690e296d4fdc8e817e6e89f99f425b487ac9bb Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 2 May 2025 18:31:40 -0500 Subject: [PATCH 100/199] CommonClient: remove Datapackage Version handling (#4487) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- CommonClient.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index 5179110061..94c558bf8a 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -341,7 +341,6 @@ class CommonContext: self.item_names = self.NameLookupDict(self, "item") self.location_names = self.NameLookupDict(self, "location") - self.versions = {} self.checksums = {} self.jsontotextparser = JSONtoTextParser(self) @@ -556,7 +555,6 @@ class CommonContext: # DataPackage async def prepare_data_package(self, relevant_games: typing.Set[str], - remote_date_package_versions: typing.Dict[str, int], remote_data_package_checksums: typing.Dict[str, str]): """Validate that all data is present for the current multiworld. Download, assimilate and cache missing data from the server.""" @@ -565,33 +563,26 @@ class CommonContext: needed_updates: typing.Set[str] = set() for game in relevant_games: - if game not in remote_date_package_versions and game not in remote_data_package_checksums: + if game not in remote_data_package_checksums: continue - remote_version: int = remote_date_package_versions.get(game, 0) remote_checksum: typing.Optional[str] = remote_data_package_checksums.get(game) - if remote_version == 0 and not remote_checksum: # custom data package and no checksum for this game + if not remote_checksum: # custom data package and no checksum for this game needed_updates.add(game) continue - cached_version: int = self.versions.get(game, 0) cached_checksum: typing.Optional[str] = self.checksums.get(game) # no action required if cached version is new enough - if (not remote_checksum and (remote_version > cached_version or remote_version == 0)) \ - or remote_checksum != cached_checksum: - local_version: int = network_data_package["games"].get(game, {}).get("version", 0) + if remote_checksum != cached_checksum: local_checksum: typing.Optional[str] = network_data_package["games"].get(game, {}).get("checksum") - if ((remote_checksum or remote_version <= local_version and remote_version != 0) - and remote_checksum == local_checksum): + if remote_checksum == local_checksum: self.update_game(network_data_package["games"][game], game) else: cached_game = Utils.load_data_package_for_checksum(game, remote_checksum) - cache_version: int = cached_game.get("version", 0) cache_checksum: typing.Optional[str] = cached_game.get("checksum") # download remote version if cache is not new enough - if (not remote_checksum and (remote_version > cache_version or remote_version == 0)) \ - or remote_checksum != cache_checksum: + if remote_checksum != cache_checksum: needed_updates.add(game) else: self.update_game(cached_game, game) @@ -601,7 +592,6 @@ class CommonContext: def update_game(self, game_package: dict, game: str): self.item_names.update_game(game, game_package["item_name_to_id"]) self.location_names.update_game(game, game_package["location_name_to_id"]) - self.versions[game] = game_package.get("version", 0) self.checksums[game] = game_package.get("checksum") def update_data_package(self, data_package: dict): @@ -872,9 +862,8 @@ async def process_server_cmd(ctx: CommonContext, args: dict): logger.info(' %s (Player %d)' % (network_player.alias, network_player.slot)) # update data package - data_package_versions = args.get("datapackage_versions", {}) data_package_checksums = args.get("datapackage_checksums", {}) - await ctx.prepare_data_package(set(args["games"]), data_package_versions, data_package_checksums) + await ctx.prepare_data_package(set(args["games"]), data_package_checksums) await ctx.server_auth(args['password']) From 83ed3c8b5056590739995cf0bc4ab16d3d266462 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 3 May 2025 11:53:52 +0200 Subject: [PATCH 101/199] Core: always embed Archipelago (#4880) --- Main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Main.py b/Main.py index 6f6a09619d..5d9e1bc211 100644 --- a/Main.py +++ b/Main.py @@ -301,6 +301,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No game_world.game: worlds.network_data_package["games"][game_world.game] for game_world in multiworld.worlds.values() } + data_package["Archipelago"] = worlds.network_data_package["games"]["Archipelago"] checks_in_area: Dict[int, Dict[str, Union[int, List[int]]]] = {} From 9425f5b772126a7d8e4bc61132084596c0de39d1 Mon Sep 17 00:00:00 2001 From: Tim Mahan <60069210+Bicoloursnake@users.noreply.github.com> Date: Sat, 3 May 2025 08:42:52 -0400 Subject: [PATCH 102/199] Docs: Direct Mac users to Launcher.py (#4767) --- worlds/generic/docs/mac_en.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/worlds/generic/docs/mac_en.md b/worlds/generic/docs/mac_en.md index 76b1ee4a38..38fd3cd940 100644 --- a/worlds/generic/docs/mac_en.md +++ b/worlds/generic/docs/mac_en.md @@ -20,9 +20,11 @@ It is generally recommended that you use a virtual environment to run python bas 3. Run the command `source venv/bin/activate` to activate the virtual environment. 4. If you want to exit the virtual environment, run the command `deactivate`. ## Steps to Run the Clients -1. If your game doesn't have a patch file, run the command `python3 SNIClient.py`, changing the filename with the file of the client you want to run. -2. If your game does have a patch file, move the base rom to the Archipelago directory and run the command `python3 SNIClient.py 'patchfile'` with the filename extension for the patch file (apsm, aplttp, apsmz3, etc.) included and changing the filename with the file of the client you want to run. -3. Your client should now be running and rom created (where applicable). +1. Run the command `python3 Launcher.py`. +2. If your game doesn't have a patch file, just click the desired client in the right side column. +3. If your game does have a patch file, click the 'Open Patch' button and navigate to your patch file (the filename extension will look something like apsm, aplttp, apsmz3, etc.). +4. If the patching process needs a rom, but cannot find it, it will ask you to navigate to your legally obtained rom. +5. Your client should now be running and rom created (where applicable). ## Additional Steps for SNES Games 1. If using RetroArch, the instructions to set up your emulator [here in the Link to the Past setup guide](https://archipelago.gg/tutorial/A%20Link%20to%20the%20Past/multiworld/en) also work on the macOS version of RetroArch. 2. Double click on the SNI tar.gz download to extract the files to an SNI directory. If it isn't already, rename this directory to SNI to make some steps easier. From 1885dab06692e08a4d412c2e343811bb26e57f24 Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Sat, 3 May 2025 20:06:16 -0400 Subject: [PATCH 103/199] TWW: Documentation Cleanup (#4942) --- worlds/tww/Options.py | 2 ++ worlds/tww/docs/en_The Wind Waker.md | 27 +++++++++++-------- worlds/tww/docs/setup_en.md | 39 ++++++++++++++++------------ 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/worlds/tww/Options.py b/worlds/tww/Options.py index d37de3acf4..ad9c8b3937 100644 --- a/worlds/tww/Options.py +++ b/worlds/tww/Options.py @@ -19,6 +19,8 @@ from .Locations import DUNGEON_NAMES class Dungeons(DefaultOnToggle): """ This controls whether dungeon locations are randomized. + + This means the items found in dungeons will be randomized, not that the entrances to dungeons will be randomized. """ display_name = "Dungeons" diff --git a/worlds/tww/docs/en_The Wind Waker.md b/worlds/tww/docs/en_The Wind Waker.md index 4d6e999cf9..0158366b3f 100644 --- a/worlds/tww/docs/en_The Wind Waker.md +++ b/worlds/tww/docs/en_The Wind Waker.md @@ -19,17 +19,18 @@ a yellow Rupee, which includes a message that the location is not randomized. ## What is the goal of The Wind Waker? Reach and defeat Ganondorf atop Ganon's Tower. This will require all eight shards of the Triforce of Courage, the -fully-powered Master Sword (unless it's swordless mode), Light Arrows, and any other items necessary to reach Ganondorf. +fully-powered Master Sword (unless it's swords optional or swordless mode), Light Arrows, and any other items necessary +to reach Ganondorf. ## What does another world's item look like in TWW? Items belonging to other non-TWW worlds are represented by Father's Letter (the letter Medli gives you to give to Komali), an unused item in the randomizer. -## When the player receives an item, what happens? +## What happens when the player receives an item? -When the player receives an item, it will automatically be added to Link's inventory. Unlike many other Zelda -randomizers, Link **will not** hold the item above his head. +When the player receives an item, it will automatically be added to Link's inventory. Link **will not** hold the item +above his head like many other Zelda randomizers. ## I need help! What do I do? @@ -37,16 +38,20 @@ Refer to the [FAQ](https://lagolunatic.github.io/wwrando/faq/) first. Then, try [setup guide](/tutorial/The%20Wind%20Waker/setup/en). If you are still stuck, please ask in the Wind Waker channel in the Archipelago server. +## I opened the game in Dolphin, but I don't have any of my starting items! + +You must connect to the multiworld room to receive any items, including your starting inventory. + ## Known issues - Randomized freestanding rupees, spoils, and bait will also be given to the player picking up the item. The item will be sent properly, but the collecting player will receive an extra copy. -- Demo items (items which are held over Link's head) which are **not** randomized, such as rupees from salvages from - random light rings or rewards from minigames, will not work. +- Demo items (items held over Link's head) that are **not** randomized, such as rupees from salvages from random light + rings or rewards from minigames, will not work. - Item get messages for progressive items received on locations that send earlier than intended will be incorrect. This does not affect gameplay. - The Heart Piece count in item get messages will be off by one. This does not affect gameplay. -- It has been reported that item links can be buggy. Nothing game-breaking, but do be aware of it. +- It has been reported that item links can be buggy. It is nothing game-breaking, but do be aware of it. Feel free to report any other issues or suggest improvements in the Wind Waker channel in the Archipelago server! @@ -76,14 +81,14 @@ A few presets are available on the [player options page](../player-options) for The preset features 3 required bosses and hard obscurity difficulty, and while the list of enabled progression options may seem intimidating, the preset also excludes several locations. - **Miniblins 2025**: These are (as close to as possible) the settings used in the WWR Racing Server's - [2025 Season of Minblins](https://docs.google.com/document/d/19vT68eU6PepD2BD2ZjR9ikElfqs8pXfqQucZ-TcscV8). This + [2025 Season of Miniblins](https://docs.google.com/document/d/19vT68eU6PepD2BD2ZjR9ikElfqs8pXfqQucZ-TcscV8). This preset is great if you're new to Wind Waker! There aren't too many locations in the world, and you only need to complete two dungeons. You also start with many convenience items, such as double magic, a capacity upgrade for your bow and bombs, and six hearts. - **Mixed Pools**: These are the settings used in the WWR Racing Server's [Mixed Pools Co-op Tournament](https://docs.google.com/document/d/1YGPTtEgP978TIi0PUAD792OtZbE2jBQpI8XCAy63qpg). This - preset features full entrance rando and includes many locations behind a randomized entrance. There are also a bunch - of overworld locations, as these settings were intended to be played in a two-person co-op team. The preset also has 6 + preset features full entrance rando and includes most locations behind a randomized entrance. There are also many + overworld locations, as these settings were intended to be played in a two-person co-op team. The preset also has 6 required bosses, but since entrance pools are randomized, the bosses could be found anywhere! Check your Sea Chart to find out which island the bosses are on. @@ -106,7 +111,7 @@ This randomizer would not be possible without the help from: - CrainWWR: (multiworld and Dolphin memory assistance, additional programming) - Cyb3R: (reference for `TWWClient`) - DeamonHunter: (additional programming) -- Dev5ter: (initial TWW AP implmentation) +- Dev5ter: (initial TWW AP implementation) - Gamma / SageOfMirrors: (additional programming) - LagoLunatic: (base randomizer, additional assistance) - Lunix: (Linux support, additional programming) diff --git a/worlds/tww/docs/setup_en.md b/worlds/tww/docs/setup_en.md index fa22b48bf8..eea2d98920 100644 --- a/worlds/tww/docs/setup_en.md +++ b/worlds/tww/docs/setup_en.md @@ -5,11 +5,13 @@ If you're playing The Wind Waker, you must follow a few simple steps to get star ## Requirements -You'll need the following components to be able to play with The Wind Waker: +You'll need the following components to be able to play The Wind Waker: * Install [Dolphin Emulator](https://dolphin-emu.org/download/). **We recommend using the latest release.** - * For Linux users, you can use the flatpak package + * Linux users can use the flatpak package [available on Flathub](https://flathub.org/apps/org.DolphinEmu.dolphin-emu). -* The 2.5.0 version of the [TWW AP Randomizer Build](https://github.com/tanjo3/wwrando/releases/tag/ap_2.5.0). +* The latest version of the [TWW AP Randomizer Build](https://github.com/tanjo3/wwrando/releases?q=tag%3Aap_2). + * Please note that this build is **different** from the one the standalone randomizer uses. This build is + specifically for Archipelago. * A The Wind Waker ISO (North American version), probably named "Legend of Zelda, The - The Wind Waker (USA).iso". Optionally, you can also download: @@ -26,17 +28,17 @@ world. Once you're happy with your settings, provide the room host with your YAM ## Connecting to a Room -The multiworld host will provide you a link to download your `aptww` file or a zip file containing everyone's files. The -`aptww` file should be named `P#__XXXXX.aptww`, where `#` is your player ID, `` is your player name, and +The multiworld host will provide you a link to download your APTWW file or a zip file containing everyone's files. The +APTWW file should be named `P#__XXXXX.aptww`, where `#` is your player ID, `` is your player name, and `XXXXX` is the room ID. The host should also provide you with the room's server name and port number. -Once you do, follow these steps to connect to the room: +Once you're ready, follow these steps to connect to the room: 1. Run the TWW AP Randomizer Build. If this is the first time you've opened the randomizer, you'll need to specify the path to your The Wind Waker ISO and the output folder for the randomized ISO. These will be saved for the next time you open the program. 2. Modify any cosmetic convenience tweaks and player customization options as desired. -3. For the APTWW file, browse and locate the path to your `aptww` file. -4. Click `Randomize` at the bottom-right. This randomizes the ISO and puts it in the output folder you specified. The +3. For the APTWW file, browse and locate the path to your APTWW file. +4. Click `Randomize` at the bottom right. This randomizes the ISO and puts it in the output folder you specified. The file will be named `TWW AP_YYYYY_P# ().iso`, where `YYYYY` is the seed name, `#` is your player ID, and `` is your player (slot) name. Verify that the values are correct for the multiworld. 5. Open Dolphin and use it to open the randomized ISO. @@ -47,7 +49,7 @@ text client. If Dolphin is not already open, or you have yet to start a new file on the website, this will be `archipelago.gg:`, where `` is the port number. If a game is hosted from the `ArchipelagoServer.exe` (without `.exe` on Linux), the port number will default to `38281` but may be changed in the `host.yaml`. -8. If you've opened a ROM corresponding to the multiworld to which you are connected, it should authenticate your slot +8. If you've opened an ISO corresponding to the multiworld to which you are connected, it should authenticate your slot name automatically when you start a new save file. ## Troubleshooting @@ -55,13 +57,18 @@ name automatically when you start a new save file. * Ensure you are running the same version of Archipelago on which the multiworld was generated. * Ensure `tww.apworld` is not in your Archipelago installation's `custom_worlds` folder. * Ensure you are using the correct randomizer build for the version of Archipelago you are using. The build should -provide an error message directing you to the correct version. You can also look at the release notes of TWW AP builds -[here](https://github.com/tanjo3/wwrando/releases) to see which versions of Archipelago each build is compatible with. + provide an error message directing you to the correct version. You can also look at the release notes of TWW AP builds + [here](https://github.com/tanjo3/wwrando/releases?q=tag%3Aap_2) to see which versions of Archipelago each build is + compatible with. +* Do not run the Archipelago Launcher or Dolphin as an administrator on Windows. * If you encounter issues with authenticating, ensure that the randomized ROM is open in Dolphin and corresponds to the -multiworld to which you are connecting. + multiworld to which you are connecting. * Ensure that you do not have any Dolphin cheats or codes enabled. Some cheats or codes can unexpectedly interfere with -emulation and make troubleshooting errors difficult. -* If you get an error message, ensure that `Enable Emulated Memory Size Override` in Dolphin (under `Options` > -`Configuration` > `Advanced`) is **disabled**. + emulation and make troubleshooting errors difficult. +* Ensure that `Enable Emulated Memory Size Override` in Dolphin (under `Options` > `Configuration` > `Advanced`) is + **disabled**. +* If the client cannot connect to Dolphin, ensure Dolphin is on the same drive as Archipelago. Having Dolphin on an + external drive has reportedly caused connection issues. +* Ensure the `Fallback Region` in Dolphin (under `Options` > `Configuration` > `General`) is set to `NTSC-U`. * If you run with a custom GC boot menu, you'll need to skip it by going to `Options` > `Configuration` > `GameCube` -and checking `Skip Main Menu`. + and checking `Skip Main Menu`. From fa2d7797f440a5d1a97a16358d25d024785e9355 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 4 May 2025 15:59:41 +0200 Subject: [PATCH 104/199] Core: update certifi (#4954) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ba3c3d84b4..951db610d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ schema>=0.7.7 kivy>=2.3.1 bsdiff4>=1.2.6 platformdirs>=4.3.6 -certifi>=2025.1.31 +certifi>=2025.4.26 cython>=3.0.12 cymem>=2.0.11 orjson>=3.10.15 From 68e37b8f9a9d31767ac7bd141b443e03c57b87cb Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 4 May 2025 16:22:48 +0200 Subject: [PATCH 105/199] Factorio: client cleanup and prevent process bomb (#4882) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- worlds/factorio/Client.py | 42 +++++++++++++++++++------------------ worlds/factorio/__init__.py | 25 +--------------------- worlds/factorio/settings.py | 26 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 worlds/factorio/settings.py diff --git a/worlds/factorio/Client.py b/worlds/factorio/Client.py index 7aeb30cb2d..199cb29b86 100644 --- a/worlds/factorio/Client.py +++ b/worlds/factorio/Client.py @@ -9,7 +9,6 @@ import random import re import string import subprocess - import sys import time import typing @@ -17,15 +16,16 @@ from queue import Queue import factorio_rcon -import Utils from CommonClient import ClientCommandProcessor, CommonContext, logger, server_loop, gui_enabled, get_base_parser from MultiServer import mark_raw from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart -from Utils import async_start, get_file_safe_name +from Utils import async_start, get_file_safe_name, is_windows, Version, format_SI_prefix, get_text_between +from .settings import FactorioSettings +from settings import get_settings def check_stdin() -> None: - if Utils.is_windows and sys.stdin: + if is_windows and sys.stdin: print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") @@ -67,7 +67,7 @@ class FactorioContext(CommonContext): items_handling = 0b111 # full remote # updated by spinup server - mod_version: Utils.Version = Utils.Version(0, 0, 0) + mod_version: Version = Version(0, 0, 0) def __init__(self, server_address, password, filter_item_sends: bool, bridge_chat_out: bool): super(FactorioContext, self).__init__(server_address, password) @@ -133,7 +133,7 @@ class FactorioContext(CommonContext): elif self.current_energy_link_value is None: return "Standby" else: - return f"{Utils.format_SI_prefix(self.current_energy_link_value)}J" + return f"{format_SI_prefix(self.current_energy_link_value)}J" def on_deathlink(self, data: dict): if self.rcon_client: @@ -155,10 +155,10 @@ class FactorioContext(CommonContext): if self.energy_link_increment and args.get("last_deplete", -1) == self.last_deplete: # it's our deplete request gained = int(args["original_value"] - args["value"]) - gained_text = Utils.format_SI_prefix(gained) + "J" + gained_text = format_SI_prefix(gained) + "J" if gained: logger.debug(f"EnergyLink: Received {gained_text}. " - f"{Utils.format_SI_prefix(args['value'])}J remaining.") + f"{format_SI_prefix(args['value'])}J remaining.") self.rcon_client.send_command(f"/ap-energylink {gained}") def on_user_say(self, text: str) -> typing.Optional[str]: @@ -278,7 +278,7 @@ async def game_watcher(ctx: FactorioContext): }])) ctx.rcon_client.send_command( f"/ap-energylink -{value}") - logger.debug(f"EnergyLink: Sent {Utils.format_SI_prefix(value)}J") + logger.debug(f"EnergyLink: Sent {format_SI_prefix(value)}J") await asyncio.sleep(0.1) @@ -439,9 +439,9 @@ async def factorio_spinup_server(ctx: FactorioContext) -> bool: factorio_server_logger.info(msg) if "Loading mod AP-" in msg and msg.endswith("(data.lua)"): parts = msg.split() - ctx.mod_version = Utils.Version(*(int(number) for number in parts[-2].split("."))) + ctx.mod_version = Version(*(int(number) for number in parts[-2].split("."))) elif "Write data path: " in msg: - ctx.write_data_path = Utils.get_text_between(msg, "Write data path: ", " [") + ctx.write_data_path = get_text_between(msg, "Write data path: ", " [") if "AppData" in ctx.write_data_path: logger.warning("It appears your mods are loaded from Appdata, " "this can lead to problems with multiple Factorio instances. " @@ -521,10 +521,16 @@ rcon_port = args.rcon_port rcon_password = args.rcon_password if args.rcon_password else ''.join( random.choice(string.ascii_letters) for x in range(32)) factorio_server_logger = logging.getLogger("FactorioServer") -options = Utils.get_settings() -executable = options["factorio_options"]["executable"] +settings: FactorioSettings = get_settings().factorio_options +if os.path.samefile(settings.executable, sys.executable): + selected_executable = settings.executable + settings.executable = FactorioSettings.executable # reset to default + raise Exception(f"FactorioClient was set to run itself {selected_executable}, aborting process bomb.") + +executable = settings.executable + server_settings = args.server_settings if args.server_settings \ - else options["factorio_options"].get("server_settings", None) + else getattr(settings, "server_settings", None) server_args = ("--rcon-port", rcon_port, "--rcon-password", rcon_password) @@ -535,12 +541,8 @@ def launch(): if server_settings: server_settings = os.path.abspath(server_settings) - if not isinstance(options["factorio_options"]["filter_item_sends"], bool): - logging.warning(f"Warning: Option filter_item_sends should be a bool.") - initial_filter_item_sends = bool(options["factorio_options"]["filter_item_sends"]) - if not isinstance(options["factorio_options"]["bridge_chat_out"], bool): - logging.warning(f"Warning: Option bridge_chat_out should be a bool.") - initial_bridge_chat_out = bool(options["factorio_options"]["bridge_chat_out"]) + initial_filter_item_sends = bool(settings.filter_item_sends) + initial_bridge_chat_out = bool(settings.bridge_chat_out) if not os.path.exists(os.path.dirname(executable)): raise FileNotFoundError(f"Path {os.path.dirname(executable)} does not exist or could not be accessed.") diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index 0e96e7f89b..bfa6ceb894 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -5,7 +5,6 @@ import logging import typing import Utils -import settings from BaseClasses import Region, Location, Item, Tutorial, ItemClassification from worlds.AutoWorld import World, WebWorld from worlds.LauncherComponents import Component, components, Type, launch as launch_component @@ -20,6 +19,7 @@ from .Technologies import base_tech_table, recipe_sources, base_technology_table progressive_technology_table, common_tech_table, tech_to_progressive_lookup, progressive_tech_table, \ get_science_pack_pools, Recipe, recipes, technology_table, tech_table, factorio_base_id, useless_technologies, \ fluids, stacking_items, valid_ingredients, progressive_rows +from .settings import FactorioSettings def launch_client(): @@ -30,29 +30,6 @@ def launch_client(): components.append(Component("Factorio Client", func=launch_client, component_type=Type.CLIENT)) -class FactorioSettings(settings.Group): - class Executable(settings.UserFilePath): - is_exe = True - - class ServerSettings(settings.OptionalUserFilePath): - """ - by default, no settings are loaded if this file does not exist. \ -If this file does exist, then it will be used. - server_settings: "factorio\\\\data\\\\server-settings.json" - """ - - class FilterItemSends(settings.Bool): - """Whether to filter item send messages displayed in-game to only those that involve you.""" - - class BridgeChatOut(settings.Bool): - """Whether to send chat messages from players on the Factorio server to Archipelago.""" - - executable: Executable = Executable("factorio/bin/x64/factorio") - server_settings: typing.Optional[FactorioSettings.ServerSettings] = None - filter_item_sends: typing.Union[FilterItemSends, bool] = False - bridge_chat_out: typing.Union[BridgeChatOut, bool] = True - - class FactorioWeb(WebWorld): tutorials = [Tutorial( "Multiworld Setup Guide", diff --git a/worlds/factorio/settings.py b/worlds/factorio/settings.py new file mode 100644 index 0000000000..a2296e7395 --- /dev/null +++ b/worlds/factorio/settings.py @@ -0,0 +1,26 @@ +import typing + +import settings + + +class FactorioSettings(settings.Group): + class Executable(settings.UserFilePath): + is_exe = True + + class ServerSettings(settings.OptionalUserFilePath): + """ + by default, no settings are loaded if this file does not exist. \ +If this file does exist, then it will be used. + server_settings: "factorio\\\\data\\\\server-settings.json" + """ + + class FilterItemSends(settings.Bool): + """Whether to filter item send messages displayed in-game to only those that involve you.""" + + class BridgeChatOut(settings.Bool): + """Whether to send chat messages from players on the Factorio server to Archipelago.""" + + executable: Executable = Executable("factorio/bin/x64/factorio") + server_settings: typing.Optional[ServerSettings] = None + filter_item_sends: typing.Union[FilterItemSends, bool] = False + bridge_chat_out: typing.Union[BridgeChatOut, bool] = True From b2d2c8e5964ae22e8731bc1b8d3f364bbeb166ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sun, 4 May 2025 10:28:38 -0400 Subject: [PATCH 106/199] Stardew Valley: Add void mayo requirement for Goblin Problem quest (#4933) This adds the requirement of a void mayo for the Goblin Problem quest. There are also some small adjustments to related rules - Fishing a void mayo is only considered an option during the Goblin Problem quest, as the odds of finding one after the quest drops drastically. - Entrance to the witch hut now requires the goblin problem quest, not just a void mayo. - Fishing rules are all moved to `fishing_logic.py`. - `can_fish_at` no longer check that you have any of the fishing regions and the region you actually want to fish in. - created `can_fish_anywhere` and `can_crab_pot_anywhere` to better illustrate when any fish satisfies the rule. --- worlds/stardew_valley/logic/festival_logic.py | 4 +- worlds/stardew_valley/logic/fishing_logic.py | 57 +++++++++++++++++-- worlds/stardew_valley/logic/goal_logic.py | 2 +- worlds/stardew_valley/logic/logic.py | 38 ++++++------- worlds/stardew_valley/logic/quest_logic.py | 6 +- worlds/stardew_valley/logic/skill_logic.py | 43 +------------- .../logic/special_order_logic.py | 2 +- .../stardew_valley/mods/logic/skills_logic.py | 4 +- worlds/stardew_valley/rules.py | 8 +-- 9 files changed, 86 insertions(+), 78 deletions(-) diff --git a/worlds/stardew_valley/logic/festival_logic.py b/worlds/stardew_valley/logic/festival_logic.py index b48668964d..72efffe83a 100644 --- a/worlds/stardew_valley/logic/festival_logic.py +++ b/worlds/stardew_valley/logic/festival_logic.py @@ -154,7 +154,7 @@ class FestivalLogic(BaseLogic): # Salads at the bar are good enough cooking_rule = self.logic.money.can_spend_at(Region.saloon, 220) - fish_rule = self.logic.skill.can_fish(difficulty=50) + fish_rule = self.logic.fishing.can_fish_anywhere(50) # Hazelnut always available since the grange display is in fall forage_rule = self.logic.region.can_reach_any((Region.forest, Region.backwoods)) @@ -179,7 +179,7 @@ class FestivalLogic(BaseLogic): return animal_rule & artisan_rule & cooking_rule & fish_rule & forage_rule & fruit_rule & mineral_rule & vegetable_rule def can_win_fishing_competition(self) -> StardewRule: - return self.logic.skill.can_fish(difficulty=60) + return self.logic.fishing.can_fish(60) def has_all_rarecrows(self) -> StardewRule: rules = [] diff --git a/worlds/stardew_valley/logic/fishing_logic.py b/worlds/stardew_valley/logic/fishing_logic.py index 85a9b12040..c8f9e0a340 100644 --- a/worlds/stardew_valley/logic/fishing_logic.py +++ b/worlds/stardew_valley/logic/fishing_logic.py @@ -1,3 +1,5 @@ +from functools import cached_property + from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic from ..data import fish_data @@ -12,6 +14,8 @@ from ..strings.quality_names import FishQuality from ..strings.region_names import Region from ..strings.skill_names import Skill +fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west) + class FishingLogicMixin(BaseLogicMixin): def __init__(self, *args, **kwargs): @@ -20,17 +24,35 @@ class FishingLogicMixin(BaseLogicMixin): class FishingLogic(BaseLogic): - def can_fish_in_freshwater(self) -> StardewRule: - return self.logic.skill.can_fish() & self.logic.region.can_reach_any((Region.forest, Region.town, Region.mountain)) + @cache_self1 + def can_fish_anywhere(self, difficulty: int = 0) -> StardewRule: + return self.logic.fishing.can_fish(difficulty) & self.logic.region.can_reach_any(fishing_regions) + def can_fish_in_freshwater(self) -> StardewRule: + return self.logic.fishing.can_fish() & self.logic.region.can_reach_any((Region.forest, Region.town, Region.mountain)) + + @cached_property def has_max_fishing(self) -> StardewRule: return self.logic.tool.has_fishing_rod(4) & self.logic.skill.has_level(Skill.fishing, 10) + @cached_property def can_fish_chests(self) -> StardewRule: return self.logic.tool.has_fishing_rod(4) & self.logic.skill.has_level(Skill.fishing, 6) + @cache_self1 def can_fish_at(self, region: str) -> StardewRule: - return self.logic.skill.can_fish() & self.logic.region.can_reach(region) + return self.logic.fishing.can_fish() & self.logic.region.can_reach(region) + + @cache_self1 + def can_fish(self, difficulty: int = 0) -> StardewRule: + skill_required = min(10, max(0, int((difficulty / 10) - 1))) + if difficulty <= 40: + skill_required = 0 + + skill_rule = self.logic.skill.has_level(Skill.fishing, skill_required) + # Training rod only works with fish < 50. Fiberglass does not help you to catch higher difficulty fish, so it's skipped in logic. + number_fishing_rod_required = 1 if difficulty < 50 else (2 if difficulty < 80 else 4) + return self.logic.tool.has_fishing_rod(number_fishing_rod_required) & skill_rule @cache_self1 def can_catch_fish(self, fish: FishItem) -> StardewRule: @@ -39,14 +61,17 @@ class FishingLogic(BaseLogic): quest_rule = self.logic.fishing.can_start_extended_family_quest() region_rule = self.logic.region.can_reach_any(fish.locations) season_rule = self.logic.season.has_any(fish.seasons) + if fish.difficulty == -1: - difficulty_rule = self.logic.skill.can_crab_pot + difficulty_rule = self.logic.fishing.can_crab_pot else: - difficulty_rule = self.logic.skill.can_fish(difficulty=(120 if fish.legendary else fish.difficulty)) + difficulty_rule = self.logic.fishing.can_fish(120 if fish.legendary else fish.difficulty) + if fish.name == SVEFish.kittyfish: item_rule = self.logic.received(SVEQuestItem.kittyfish_spell) else: item_rule = True_() + return quest_rule & region_rule & season_rule & difficulty_rule & item_rule def can_catch_fish_for_fishsanity(self, fish: FishItem) -> StardewRule: @@ -78,7 +103,7 @@ class FishingLogic(BaseLogic): return self.logic.tool.has_fishing_rod(4) & self.logic.has(tackle) def can_catch_every_fish(self) -> StardewRule: - rules = [self.has_max_fishing()] + rules = [self.has_max_fishing] rules.extend( self.logic.fishing.can_catch_fish(fish) @@ -89,3 +114,23 @@ class FishingLogic(BaseLogic): def has_specific_bait(self, fish: FishItem) -> StardewRule: return self.can_catch_fish(fish) & self.logic.has(Machine.bait_maker) + + @cached_property + def can_crab_pot_anywhere(self) -> StardewRule: + return self.logic.fishing.can_fish() & self.logic.region.can_reach_any(fishing_regions) + + @cache_self1 + def can_crab_pot_at(self, region: str) -> StardewRule: + return self.logic.fishing.can_crab_pot & self.logic.region.can_reach(region) + + @cached_property + def can_crab_pot(self) -> StardewRule: + crab_pot_rule = self.logic.has(Fishing.bait) + + # We can't use the same rule if skills are vanilla, because fishing levels are required to crab pot, which is required to get fishing levels... + if self.content.features.skill_progression.is_progressive: + crab_pot_rule = crab_pot_rule & self.logic.has(Machine.crab_pot) + else: + crab_pot_rule = crab_pot_rule & self.logic.skill.can_get_fishing_xp + + return crab_pot_rule diff --git a/worlds/stardew_valley/logic/goal_logic.py b/worlds/stardew_valley/logic/goal_logic.py index 6dbb5f8987..7995ea2e0d 100644 --- a/worlds/stardew_valley/logic/goal_logic.py +++ b/worlds/stardew_valley/logic/goal_logic.py @@ -60,7 +60,7 @@ class GoalLogic(BaseLogic): if not self.content.features.fishsanity.is_enabled: return self.logic.fishing.can_catch_every_fish() - rules = [self.logic.fishing.has_max_fishing()] + rules = [self.logic.fishing.has_max_fishing] rules.extend( self.logic.fishing.can_catch_fish_for_fishsanity(fish) diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index 3848e393d2..716dd06571 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -130,9 +130,9 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin # @formatter:off self.registry.item_rules.update({ "Energy Tonic": self.money.can_spend_at(Region.hospital, 1000), - WaterChest.fishing_chest: self.fishing.can_fish_chests(), - WaterChest.golden_fishing_chest: self.fishing.can_fish_chests() & self.skill.has_mastery(Skill.fishing), - WaterChest.treasure: self.fishing.can_fish_chests(), + WaterChest.fishing_chest: self.fishing.can_fish_chests, + WaterChest.golden_fishing_chest: self.fishing.can_fish_chests & self.skill.has_mastery(Skill.fishing), + WaterChest.treasure: self.fishing.can_fish_chests, Ring.hot_java_ring: self.region.can_reach(Region.volcano_floor_10), "Galaxy Soul": self.money.can_trade_at(Region.qi_walnut_room, Currency.qi_gem, 40), "JotPK Big Buff": self.arcade.has_jotpk_power_level(7), @@ -164,7 +164,7 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin AnimalProduct.large_milk: self.animal.has_happy_animal(Animal.cow), AnimalProduct.milk: self.animal.has_animal(Animal.cow), AnimalProduct.rabbit_foot: self.animal.has_happy_animal(Animal.rabbit), - AnimalProduct.roe: self.skill.can_fish() & self.building.has_building(Building.fish_pond), + AnimalProduct.roe: self.fishing.can_fish_anywhere() & self.building.has_building(Building.fish_pond), AnimalProduct.squid_ink: self.mine.can_mine_in_the_mines_floor_81_120() | (self.building.has_building(Building.fish_pond) & self.has(Fish.squid)), AnimalProduct.sturgeon_roe: self.has(Fish.sturgeon) & self.building.has_building(Building.fish_pond), AnimalProduct.truffle: self.animal.has_animal(Animal.pig) & self.season.has_any_not_winter(), @@ -198,7 +198,7 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin ArtisanGood.targeted_bait: self.artisan.has_targeted_bait(), ArtisanGood.stardrop_tea: self.has(WaterChest.golden_fishing_chest), ArtisanGood.truffle_oil: self.has(AnimalProduct.truffle) & self.has(Machine.oil_maker), - ArtisanGood.void_mayonnaise: (self.skill.can_fish(Region.witch_swamp)) | (self.artisan.can_mayonnaise(AnimalProduct.void_egg)), + ArtisanGood.void_mayonnaise: self.artisan.can_mayonnaise(AnimalProduct.void_egg), Beverage.pina_colada: self.money.can_spend_at(Region.island_resort, 600), Beverage.triple_shot_espresso: self.has("Hot Java Ring"), Consumable.butterfly_powder: self.money.can_spend_at(Region.sewer, 20000), @@ -217,15 +217,15 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin Fertilizer.quality: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), Fertilizer.tree: self.skill.has_level(Skill.foraging, 7) & self.has(Material.fiber) & self.has(Material.stone), Fish.any: self.logic.or_(*(self.fishing.can_catch_fish(fish) for fish in content.fishes.values())), - Fish.crab: self.skill.can_crab_pot_at(Region.beach), - Fish.crayfish: self.skill.can_crab_pot_at(Region.town), - Fish.lobster: self.skill.can_crab_pot_at(Region.beach), + Fish.crab: self.fishing.can_crab_pot_at(Region.beach), + Fish.crayfish: self.fishing.can_crab_pot_at(Region.town), + Fish.lobster: self.fishing.can_crab_pot_at(Region.beach), Fish.mussel: self.tool.can_forage(Generic.any, Region.beach) or self.has(Fish.mussel_node), Fish.mussel_node: self.region.can_reach(Region.island_west), Fish.oyster: self.tool.can_forage(Generic.any, Region.beach), - Fish.periwinkle: self.skill.can_crab_pot_at(Region.town), - Fish.shrimp: self.skill.can_crab_pot_at(Region.beach), - Fish.snail: self.skill.can_crab_pot_at(Region.town), + Fish.periwinkle: self.fishing.can_crab_pot_at(Region.town), + Fish.shrimp: self.fishing.can_crab_pot_at(Region.beach), + Fish.snail: self.fishing.can_crab_pot_at(Region.town), Fishing.curiosity_lure: self.monster.can_kill(self.monster.all_monsters_by_name[Monster.mummy]), Fishing.lead_bobber: self.skill.has_level(Skill.fishing, 6) & self.money.can_spend_at(Region.fish_shop, 200), Forageable.hay: self.building.has_building(Building.silo) & self.tool.has_tool(Tool.scythe), # @@ -235,7 +235,7 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin Fossil.fossilized_leg: self.region.can_reach(Region.dig_site) & self.tool.has_tool(Tool.pickaxe), Fossil.fossilized_ribs: self.region.can_reach(Region.island_south) & self.tool.has_tool(Tool.hoe), Fossil.fossilized_skull: self.action.can_open_geode(Geode.golden_coconut), - Fossil.fossilized_spine: self.skill.can_fish(Region.dig_site), + Fossil.fossilized_spine: self.fishing.can_fish_at(Region.dig_site), Fossil.fossilized_tail: self.action.can_pan_at(Region.dig_site, ToolMaterial.copper), Fossil.mummified_bat: self.region.can_reach(Region.volcano_floor_10), Fossil.mummified_frog: self.region.can_reach(Region.island_east) & self.tool.has_tool(Tool.scythe), @@ -296,12 +296,12 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin RetainingSoil.quality: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), SpeedGro.basic: self.money.can_spend_at(Region.pierre_store, 100), SpeedGro.deluxe: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), - Trash.broken_cd: self.skill.can_crab_pot, - Trash.broken_glasses: self.skill.can_crab_pot, - Trash.driftwood: self.skill.can_crab_pot, + Trash.broken_cd: self.fishing.can_crab_pot_anywhere, + Trash.broken_glasses: self.fishing.can_crab_pot_anywhere, + Trash.driftwood: self.fishing.can_crab_pot_anywhere, Trash.joja_cola: self.money.can_spend_at(Region.saloon, 75), - Trash.soggy_newspaper: self.skill.can_crab_pot, - Trash.trash: self.skill.can_crab_pot, + Trash.soggy_newspaper: self.fishing.can_crab_pot_anywhere, + Trash.trash: self.fishing.can_crab_pot_anywhere, TreeSeed.acorn: self.skill.has_level(Skill.foraging, 1) & self.ability.can_chop_trees(), TreeSeed.mahogany: self.region.can_reach(Region.secret_woods) & self.tool.has_tool(Tool.axe, ToolMaterial.iron) & self.skill.has_level(Skill.foraging, 1), TreeSeed.maple: self.skill.has_level(Skill.foraging, 1) & self.ability.can_chop_trees(), @@ -314,8 +314,8 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin WaterItem.cave_jelly: self.fishing.can_fish_at(Region.mines_floor_100) & self.tool.has_fishing_rod(2), WaterItem.river_jelly: self.fishing.can_fish_at(Region.town) & self.tool.has_fishing_rod(2), WaterItem.sea_jelly: self.fishing.can_fish_at(Region.beach) & self.tool.has_fishing_rod(2), - WaterItem.seaweed: self.skill.can_fish(Region.tide_pools), - WaterItem.white_algae: self.skill.can_fish(Region.mines_floor_20), + WaterItem.seaweed: self.fishing.can_fish_at(Region.tide_pools), + WaterItem.white_algae: self.fishing.can_fish_at(Region.mines_floor_20), WildSeeds.grass_starter: self.money.can_spend_at(Region.pierre_store, 100), }) # @formatter:on diff --git a/worlds/stardew_valley/logic/quest_logic.py b/worlds/stardew_valley/logic/quest_logic.py index e48324680d..5bc3f86eae 100644 --- a/worlds/stardew_valley/logic/quest_logic.py +++ b/worlds/stardew_valley/logic/quest_logic.py @@ -39,7 +39,7 @@ class QuestLogic(BaseLogic): Quest.raising_animals: self.logic.quest.can_complete_quest(Quest.getting_started) & self.logic.building.has_building(Building.coop), Quest.feeding_animals: self.logic.quest.can_complete_quest(Quest.getting_started) & self.logic.building.has_building(Building.silo), Quest.advancement: self.logic.quest.can_complete_quest(Quest.getting_started) & self.logic.has(Craftable.scarecrow), - Quest.archaeology: self.logic.tool.has_tool(Tool.hoe) | self.logic.mine.can_mine_in_the_mines_floor_1_40() | self.logic.skill.can_fish(), + Quest.archaeology: self.logic.tool.has_tool(Tool.hoe) | self.logic.mine.can_mine_in_the_mines_floor_1_40() | self.logic.fishing.can_fish_chests, Quest.rat_problem: self.logic.region.can_reach_all((Region.town, Region.community_center)), Quest.meet_the_wizard: self.logic.quest.can_complete_quest(Quest.rat_problem), Quest.forging_ahead: self.logic.has(Ore.copper) & self.logic.has(Machine.furnace), @@ -86,7 +86,9 @@ class QuestLogic(BaseLogic): Quest.catch_a_lingcod: self.logic.season.has(Season.winter) & self.logic.has(Fish.lingcod) & self.logic.relationship.can_meet(NPC.willy), Quest.dark_talisman: self.logic.region.can_reach(Region.railroad) & self.logic.wallet.has_rusty_key() & self.logic.relationship.can_meet( NPC.krobus), - Quest.goblin_problem: self.logic.region.can_reach(Region.witch_swamp), + Quest.goblin_problem: self.logic.region.can_reach(Region.witch_swamp) + # Void mayo can be fished at 5% chance in the witch swamp while the quest is active. It drops a lot after the quest. + & (self.logic.has(ArtisanGood.void_mayonnaise) | self.logic.fishing.can_fish()), Quest.magic_ink: self.logic.relationship.can_meet(NPC.wizard), Quest.the_pirates_wife: self.logic.relationship.can_meet(NPC.kent) & self.logic.relationship.can_meet(NPC.gus) & self.logic.relationship.can_meet(NPC.sandy) & self.logic.relationship.can_meet(NPC.george) & diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index e02b180f6a..7582e5240f 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -1,13 +1,10 @@ from functools import cached_property -from typing import Union, Tuple from Utils import cache_self1 from .base_logic import BaseLogicMixin, BaseLogic from ..data.harvest import HarvestCropSource from ..mods.logic.mod_skills_levels import get_mod_skill_levels from ..stardew_rule import StardewRule, true_, True_, False_ -from ..strings.craftable_names import Fishing -from ..strings.machine_names import Machine from ..strings.performance_names import Performance from ..strings.quality_names import ForageQuality from ..strings.region_names import Region @@ -15,7 +12,6 @@ from ..strings.skill_names import Skill, all_mod_skills, all_vanilla_skills from ..strings.tool_names import ToolMaterial, Tool from ..strings.wallet_item_names import Wallet -fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west) vanilla_skill_items = ("Farming Level", "Mining Level", "Foraging Level", "Fishing Level", "Combat Level") @@ -138,44 +134,9 @@ class SkillLogic(BaseLogic): @cached_property def can_get_fishing_xp(self) -> StardewRule: if self.content.features.skill_progression.is_progressive: - return self.logic.skill.can_fish() | self.logic.skill.can_crab_pot + return self.logic.fishing.can_fish_anywhere() | self.logic.fishing.can_crab_pot - return self.logic.skill.can_fish() - - # Should be cached - def can_fish(self, regions: Union[str, Tuple[str, ...]] = None, difficulty: int = 0) -> StardewRule: - if isinstance(regions, str): - regions = regions, - - if regions is None or len(regions) == 0: - regions = fishing_regions - - skill_required = min(10, max(0, int((difficulty / 10) - 1))) - if difficulty <= 40: - skill_required = 0 - - skill_rule = self.logic.skill.has_level(Skill.fishing, skill_required) - region_rule = self.logic.region.can_reach_any(regions) - # Training rod only works with fish < 50. Fiberglass does not help you to catch higher difficulty fish, so it's skipped in logic. - number_fishing_rod_required = 1 if difficulty < 50 else (2 if difficulty < 80 else 4) - return self.logic.tool.has_fishing_rod(number_fishing_rod_required) & skill_rule & region_rule - - @cache_self1 - def can_crab_pot_at(self, region: str) -> StardewRule: - return self.logic.skill.can_crab_pot & self.logic.region.can_reach(region) - - @cached_property - def can_crab_pot(self) -> StardewRule: - crab_pot_rule = self.logic.has(Fishing.bait) - - # We can't use the same rule if skills are vanilla, because fishing levels are required to crab pot, which is required to get fishing levels... - if self.content.features.skill_progression.is_progressive: - crab_pot_rule = crab_pot_rule & self.logic.has(Machine.crab_pot) - else: - crab_pot_rule = crab_pot_rule & self.logic.skill.can_get_fishing_xp - - water_region_rules = self.logic.region.can_reach_any(fishing_regions) - return crab_pot_rule & water_region_rules + return self.logic.fishing.can_fish_anywhere() def can_forage_quality(self, quality: str) -> StardewRule: if quality == ForageQuality.basic: diff --git a/worlds/stardew_valley/logic/special_order_logic.py b/worlds/stardew_valley/logic/special_order_logic.py index a81f715c48..73276ce97f 100644 --- a/worlds/stardew_valley/logic/special_order_logic.py +++ b/worlds/stardew_valley/logic/special_order_logic.py @@ -42,7 +42,7 @@ class SpecialOrderLogic(BaseLogic): SpecialOrder.fragments_of_the_past: self.logic.monster.can_kill(Monster.skeleton), SpecialOrder.gus_famous_omelet: self.logic.has(AnimalProduct.any_egg), SpecialOrder.crop_order: self.logic.ability.can_farm_perfectly() & self.logic.shipping.can_use_shipping_bin, - SpecialOrder.community_cleanup: self.logic.skill.can_crab_pot, + SpecialOrder.community_cleanup: self.logic.fishing.can_crab_pot_anywhere, SpecialOrder.the_strong_stuff: self.logic.has(ArtisanGood.specific_juice(Vegetable.potato)), SpecialOrder.pierres_prime_produce: self.logic.ability.can_farm_perfectly(), SpecialOrder.robins_project: self.logic.relationship.can_meet(NPC.robin) & self.logic.ability.can_chop_perfectly() & diff --git a/worlds/stardew_valley/mods/logic/skills_logic.py b/worlds/stardew_valley/mods/logic/skills_logic.py index b1f10d08b9..d57e6c5931 100644 --- a/worlds/stardew_valley/mods/logic/skills_logic.py +++ b/worlds/stardew_valley/mods/logic/skills_logic.py @@ -44,9 +44,9 @@ class ModSkillLogic(BaseLogic): def can_earn_luck_skill_level(self, level: int) -> StardewRule: if level >= 6: - return self.logic.fishing.can_fish_chests() | self.logic.action.can_open_geode(Geode.magma) + return self.logic.fishing.can_fish_chests | self.logic.action.can_open_geode(Geode.magma) if level >= 3: - return self.logic.fishing.can_fish_chests() | self.logic.action.can_open_geode(Geode.geode) + return self.logic.fishing.can_fish_chests | self.logic.action.can_open_geode(Geode.geode) return True_() # You can literally wake up and or get them by opening starting chests. def can_earn_magic_skill_level(self, level: int) -> StardewRule: diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 4257f856c8..51f69a1af8 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -214,7 +214,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_entrance_rule(multiworld, player, Entrance.mountain_to_railroad, logic.received("Railroad Boulder Removed")) set_entrance_rule(multiworld, player, Entrance.enter_witch_warp_cave, logic.quest.has_dark_talisman() | (logic.mod.magic.can_blink())) - set_entrance_rule(multiworld, player, Entrance.enter_witch_hut, (logic.has(ArtisanGood.void_mayonnaise) | logic.mod.magic.can_blink())) + set_entrance_rule(multiworld, player, Entrance.enter_witch_hut, (logic.quest.can_complete_quest(Quest.goblin_problem) | logic.mod.magic.can_blink())) set_entrance_rule(multiworld, player, Entrance.enter_mutant_bug_lair, (logic.wallet.has_rusty_key() & logic.region.can_reach(Region.railroad) & logic.relationship.can_meet( NPC.krobus)) | logic.mod.magic.can_blink()) @@ -923,9 +923,9 @@ def set_magic_spell_rules(logic: StardewLogic, multiworld: MultiWorld, player: i set_rule(multiworld.get_location("Analyze: Fireball", player), logic.has("Fire Quartz")) set_rule(multiworld.get_location("Analyze: Frostbolt", player), - logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) + logic.region.can_reach(Region.mines_floor_60) & logic.fishing.can_fish(85)) set_rule(multiworld.get_location("Analyze All Elemental School Locations", player), - logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85)) + logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.fishing.can_fish(85)) # set_rule(multiworld.get_location("Analyze: Lantern", player),) set_rule(multiworld.get_location("Analyze: Tendrils", player), logic.region.can_reach(Region.farm)) @@ -948,7 +948,7 @@ def set_magic_spell_rules(logic: StardewLogic, multiworld: MultiWorld, player: i & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")) & logic.has("Coffee") & logic.has("Life Elixir") & logic.ability.can_mine_perfectly() & logic.has("Earth Crystal") & - logic.has("Fire Quartz") & logic.skill.can_fish(difficulty=85) & + logic.has("Fire Quartz") & logic.fishing.can_fish(85) & logic.region.can_reach(Region.witch_hut) & logic.region.can_reach(Region.mines_floor_100) & logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))) From b217372fea536d3af83c92ee19be2e694debcc7c Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Mon, 5 May 2025 19:18:20 -0400 Subject: [PATCH 107/199] Core: Make Perfect Fuzzy Match Prioritize Casing (#4956) --- Utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Utils.py b/Utils.py index 46a0d106ef..a3a529d754 100644 --- a/Utils.py +++ b/Utils.py @@ -635,6 +635,8 @@ def get_fuzzy_results(input_word: str, word_list: typing.Collection[str], limit: import jellyfish def get_fuzzy_ratio(word1: str, word2: str) -> float: + if word1 == word2: + return 1.01 return (1 - jellyfish.damerau_levenshtein_distance(word1.lower(), word2.lower()) / max(len(word1), len(word2))) @@ -655,8 +657,10 @@ def get_intended_text(input_text: str, possible_answers) -> typing.Tuple[str, bo picks = get_fuzzy_results(input_text, possible_answers, limit=2) if len(picks) > 1: dif = picks[0][1] - picks[1][1] - if picks[0][1] == 100: + if picks[0][1] == 101: return picks[0][0], True, "Perfect Match" + elif picks[0][1] == 100: + return picks[0][0], True, "Case Insensitive Perfect Match" elif picks[0][1] < 75: return picks[0][0], False, f"Didn't find something that closely matches '{input_text}', " \ f"did you mean '{picks[0][0]}'? ({picks[0][1]}% sure)" From b898b9d9e6e01e87f2a5f83fcc97e29be934ef58 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Tue, 6 May 2025 11:32:30 -0500 Subject: [PATCH 108/199] The Messenger: fix indentation in setup guide (#4959) * The Messenger: fix indentation in setup guide * just delete the save backup section tbh --- worlds/messenger/docs/setup_en.md | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/worlds/messenger/docs/setup_en.md b/worlds/messenger/docs/setup_en.md index 64b706c264..8813e22381 100644 --- a/worlds/messenger/docs/setup_en.md +++ b/worlds/messenger/docs/setup_en.md @@ -23,21 +23,12 @@ These steps can also be followed to launch the game and check for mod updates af ### Manual Installation 1. Download and install Courier Mod Loader using the instructions on the release page - * [Latest release is currently 0.7.1](https://github.com/Brokemia/Courier/releases) + * [Latest release is currently 0.7.1](https://github.com/Brokemia/Courier/releases) 2. Download and install the randomizer mod - 1. Download the latest TheMessengerRandomizerAP.zip from -[The Messenger Randomizer Mod AP releases page](https://github.com/alwaysintreble/TheMessengerRandomizerModAP/releases) - 2. Extract the zip file to `TheMessenger/Mods/` of your game's install location - * You cannot have both the non-AP randomizer and the AP randomizer installed at the same time - 3. Optionally, Backup your save game - * On Windows - 1. Press `Windows Key + R` to open run - 2. Type `%appdata%` to access AppData - 3. Navigate to `AppData/locallow/SabotageStudios/The Messenger` - 4. Rename `SaveGame.txt` to any name of your choice - * On Linux - 1. Navigate to `steamapps/compatdata/764790/pfx/drive_c/users/steamuser/AppData/LocalLow/Sabotage Studio/The Messenger` - 2. Rename `SaveGame.txt` to any name of your choice + 1. Download the latest TheMessengerRandomizerAP.zip from + [The Messenger Randomizer Mod AP releases page](https://github.com/alwaysintreble/TheMessengerRandomizerModAP/releases) + 2. Extract the zip file to `TheMessenger/Mods/` of your game's install location + * You cannot have both the non-AP randomizer and the AP randomizer installed at the same time ## Joining a MultiWorld Game @@ -57,15 +48,15 @@ These steps can also be followed to launch the game and check for mod updates af 1. Launch the game 2. Navigate to `Options > Archipelago Options` 3. Enter connection info using the relevant option buttons - * **The game is limited to alphanumerical characters, `.`, and `-`.** - * This defaults to `archipelago.gg` and does not need to be manually changed if connecting to a game hosted on the - website. - * If using a name that cannot be entered in the in game menus, there is a config file (APConfig.toml) in the game - directory. When using this, all connection information must be entered in the file. + * **The game is limited to alphanumerical characters, `.`, and `-`.** + * This defaults to `archipelago.gg` and does not need to be manually changed if connecting to a game hosted on the + website. + * If using a name that cannot be entered in the in game menus, there is a config file (APConfig.toml) in the game + directory. When using this, all connection information must be entered in the file. 4. Select the `Connect to Archipelago` button 5. Navigate to save file selection 6. Start a new game - * If you're already connected, deleting an existing save will not disconnect you and is completely safe. + * If you're already connected, deleting an existing save will not disconnect you and is completely safe. ## Continuing a MultiWorld Game From 7bbe62019ad4cad1b8623eed051d058f5ae3cf5c Mon Sep 17 00:00:00 2001 From: Seldom <38388947+Seldom-SE@users.noreply.github.com> Date: Tue, 6 May 2025 09:32:55 -0700 Subject: [PATCH 109/199] Terraria: Fix inaccessible Leading Landlord achievement when getfixedboi is enabled #4958 --- worlds/terraria/Rules.dsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/terraria/Rules.dsv b/worlds/terraria/Rules.dsv index 9ae82d7472..6bc1183e59 100644 --- a/worlds/terraria/Rules.dsv +++ b/worlds/terraria/Rules.dsv @@ -151,7 +151,7 @@ Magma Stone; // Evil Smashing, Poppet!; Achievement; Arms Dealer; Npc; -Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything +Leading Landlord; Achievement | Not Getfixedboi; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything Completely Awesome; Achievement; Arms Dealer; Illegal Gun Parts; ; Arms Dealer | Flamethrower; From a3aac3d7370383d0044fa4e21897a585a9f106a2 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Tue, 6 May 2025 12:33:21 -0400 Subject: [PATCH 110/199] TUNIC: Entrance rando Direction Pairs + Decoupled (#3761) * Fix merge conflict * Fix formatting, fix rule for heir access after merge * Writing combat logic helpers * More helpers! * More logic! * Rename has_stick to has_melee, some fixes per Medic's review * Clamp max power from sword upgrades * Wrote the rest of the helpers * Remove unused import * Apply item classifications * Create the combat logic option * Item classification varies based on option * Add the shop sword logic stuff in * Add the rules for the boss-only option * Fix tiny issues * Some early Overworld combat logic * Fill out swamp combat logic * Add note * Bump up Boss Scav and Heir * More revisions to combat logic * Some changes, currently broken * New system for power, kinda jank probably * Revisions to new system, needs more balancing * Cap attack upgrades * Uncap mp power since it's directly related to damage output * Voidlings * Put together a table showing the vanilla-expected stats for each area * Added some info on potion counts * Made new helper functions * Make has_required_stats * Make has_combat_reqs * Update er_rules for new combat reqs * Fix all the broken things ever * Remove outdated todo * Make temp option for testing logic * More flexible choices for combat items * Hard require sword for bosses * Temporarily default combat logic to on * Finish writing overworld combat logic * East Forest combat logic done * Remove a few easy ones * Finish beneath the well * Dark Tomb combat logic * West Garden combat logic * make unit tests checkmark again * Weird west garden dagger house edge case * Try block for that weird west garden edge case * Add quarry combat logic * Update to filter out unreachable regions outside of ER * Fortress Grave Path logic, and a couple fixes to the west garden logic * Fortress east shortcut logic, and rewriting the try except blocks to use finally * Refactor to use a new function cause wow there was a lot of repeated code * Add combat logic to the other two sets of fortress fuses * Add combat rules to beneath the vault * Fix missing cathedral -> elevator connection * Combat logic for cathedral to elevator * Add cathedral main region, rename cathedral -> cathedral entry * Setup cathedral combat logic * Adjust locations' regions for ER * Add laurels zip logic to the chest in the spike room in cathedral * Add combat logic to frog's domain * Move frog's domain locations to regions for combat logic * Add new frog's domain regions for combat logic * Update region name for frog's domain * Fix typo * Add more regions for lower zig * Move around lower zig regions for combat logic * Lower Zig combat logic * Upper zig combat logic * Fix typo * Fix typos * Fix missing world. * Update combat logic description * Add todo * Add todo * Don't make zig skip if er or fixed shop is off * Make it so zig skip is only made with fewer shops and er * Temporarily default combat logic on * Update test to explicitly disable combat logic * Update test_access.py * Slight wording changes * Fix bugs, refactor quarry regions so you can access chests in lower quarry with ice grapples * Run through checks you can do with magic dagger * Run through checks you can do with magic dagger * Add rule for entering town portal of having equipment to deal with enemies * Add rule for atoll near the 6 crabs surrounding a poor defenseless baby slorm * Update the rule for the chest near the 6 crabs surrounding a slorm to also possibly require laurels * Revamp combat logic function to work properly without melee * Add laurels rules to combat logic chests * Modify beneath the vault bridge rule to need a lantern if combat logic is on * Put in money logic * Dagger or combat for swamp big skeleton chest * Remove the 100 moneys from logic * Modify lower zig ls drop region destinations * Remove completed todo * Reword combat logic option description, remove test option * Add combat logic to slot data * Merge Silent's missing slot data bugfix PR #3628 * Remove test combat option * Update combat logic description * Fix secret gathering place issue * Fix secret gathering place issue * Fix lower zig ls rule * Fix accidentally removed librarian rule * Remove redundant rule * Update gauntlet rule to hard-require a sword * Add test for a problematic connection * Adjust combat logic to deal with weird edge cases so it doesn't take stuff out of logic that was previously in logic * Fix create_item classification * Update some comments * Update per exempt's suggestion * Add combat logic to the well boss fight, reorder the combat logic stuff a little to better section them off * Add EntranceLayout option * Add back LogicRules as an invisible option, to not break old yamls * Fix a bug with seed group, continue changing fixed shop to entrance layout * Fix missed fixed shop -> entrance layout spot * Fix bug in seed groups with fixed shop on and off * Add entrance layout to the UT regen stuff * Put direction. in, will add them later * Remove unused elevation from portal class * Got like half of them in * Finish adding all of the directions * Add combat rule for zig front to back * Update per Medic's suggestion * Update ladder storage without items option description * Mess with state with collect and remove to save like 2 seconds (never again) * Save even more time, still never going to do this again on anything else * Add option check for collect and remove * Add directions to shop portals * Update direction in Portal with default * Move Direction above Portal * Add decoupled option, mess with plando connection stuff * Merge, implement verify plando directions * Condense the stuff in change and remove to less lines (thanks medic) * Remove unused thing * Swap to using logicmixin instead of prog_items (thanks Vi) * Fix consistency in stat counters * Add back something that was needed * Fix mistake when adding back * Making the fix better (thanks medic) * Make it actually return false if it gets to the backup lists and fails them * Fix stuff after merge * Add outlet regions, create new regions as needed for them * Put together part of decoupled and direction pairs * make direction pairs work * Make decoupled work * Make fixed shop work again * Fix a few minor bugs * Fix a few minor bugs * Fix plando * god i love programming * Reorder portal list * Update portal sorter for variable shops * Add missing parameter * Some cleanup of prints and functions * Fix typo * it's aliiiiiive * Make seed groups not sync decoupled * Add test with full-shop plando * Fix bug with vanilla portals * Handle plando connections and direction pair errors * Update plando checking for decoupled * Fix typo * Fix exception text to be shorter * Add some more comments * Add todo note * Remove unused safety thing * Remove extra plando connections definition in options * Make seed groups in decoupled with overlapping but not fully overlapped plando connections interact nicely without messing with what the entrances look like in the spoiler log * Fix weird edge case that is technically user error * Add note to fixed shop * Fix parsing shop names in UT * Remove debug print * Actually make UT work * multiworld. to world. * Fix typo from merge * Make it so the shops show up in the entrance hints * Fix bug in ladder storage rules * Remove blank line * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py # worlds/tunic/rules.py # worlds/tunic/test/test_access.py * Fix issues after merge * Update plando connections stuff in docs * Fix library mistake * has_stick -> has_melee * has_stick -> has_melee * Add a failsafe for direction pairing * Fix playthrough crash bug * Remove init from logicmixin * Updates per code review (thanks hesto) * has_stick to has_melee in newer update * has_stick to has_melee in newer update * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/combat_logic.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py * Cleanup more stuff after merge * Revert "Cleanup more stuff after merge" This reverts commit a6ee9a93da8f2fcc4413de6df6927b246017889d. * Revert "# Conflicts:" This reverts commit c74ccd74a45b6ad6b9abe6e339d115a0c98baf30. * Cleanup more stuff after merge * Swap to .get for decoupled so it works with older games probably maybe * Fix after merge * Fix typo * Fix UT support with fixed shop option * Backport plando connections fix * Fix issue with fixed shop + decoupled * Make the error not duplicate the while loop condition * Fix rule for quarry back to monastery * Fix more stuff after merge * Make it not output anything if you set plando connections but not ER * Add obvious note to plando connections description * Fix after merge * add comment to commented out connection --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/tunic/__init__.py | 135 ++++--- worlds/tunic/combat_logic.py | 1 + worlds/tunic/docs/en_TUNIC.md | 2 +- worlds/tunic/er_data.py | 533 +++++++++++++------------- worlds/tunic/er_rules.py | 21 +- worlds/tunic/er_scripts.py | 634 +++++++++++++++++++++++-------- worlds/tunic/options.py | 73 +++- worlds/tunic/rules.py | 5 +- worlds/tunic/test/test_access.py | 262 ++++++++++++- 9 files changed, 1150 insertions(+), 516 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index aa6c8cdfb9..7027ab1a64 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -7,12 +7,12 @@ from .locations import location_table, location_name_groups, standard_location_n from .rules import set_location_rules, set_region_rules, randomize_ability_unlocks, gold_hexagon from .er_rules import set_er_location_rules from .regions import tunic_regions -from .er_scripts import create_er_regions +from .er_scripts import create_er_regions, verify_plando_directions from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations from .er_data import portal_mapping, RegionInfo, tunic_er_regions from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_option_presets, TunicPlandoConnections, LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage, check_options, - get_hexagons_in_pool, HexagonQuestAbilityUnlockType) + get_hexagons_in_pool, HexagonQuestAbilityUnlockType, EntranceLayout) from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table from .combat_logic import area_data, CombatState from worlds.AutoWorld import WebWorld, World @@ -61,8 +61,9 @@ class SeedGroup(TypedDict): ice_grappling: int # ice_grappling value ladder_storage: int # ls value laurels_at_10_fairies: bool # laurels location value - fixed_shop: bool # fixed shop value - plando: TunicPlandoConnections # consolidated plando connections for the seed group + entrance_layout: int # entrance layout value + has_decoupled_enabled: bool # for checking that players don't have conflicting options + plando: List[PlandoConnection] # consolidated plando connections for the seed group class TunicWorld(World): @@ -95,7 +96,7 @@ class TunicWorld(World): tunic_portal_pairs: Dict[str, str] er_portal_hints: Dict[int, str] seed_groups: Dict[str, SeedGroup] = {} - shop_num: int = 1 # need to make it so that you can walk out of shops, but also that they aren't all connected + used_shop_numbers: Set[int] er_regions: Dict[str, RegionInfo] # absolutely needed so outlet regions work # for the local_fill option @@ -122,24 +123,35 @@ class TunicWorld(World): check_options(self) - if self.options.logic_rules >= LogicRules.option_no_major_glitches: - self.options.laurels_zips.value = LaurelsZips.option_true - self.options.ice_grappling.value = IceGrappling.option_medium - if self.options.logic_rules.value == LogicRules.option_unrestricted: - self.options.ladder_storage.value = LadderStorage.option_medium - self.er_regions = tunic_er_regions.copy() + if self.options.plando_connections and not self.options.entrance_rando: + self.options.plando_connections.value = () if self.options.plando_connections: + def replace_connection(old_cxn: PlandoConnection, new_cxn: PlandoConnection, index: int) -> None: + self.options.plando_connections.value.remove(old_cxn) + self.options.plando_connections.value.insert(index, new_cxn) + for index, cxn in enumerate(self.options.plando_connections): - # making shops second to simplify other things later - if cxn.entrance.startswith("Shop"): - replacement = PlandoConnection(cxn.exit, "Shop Portal", "both") - self.options.plando_connections.value.remove(cxn) - self.options.plando_connections.value.insert(index, replacement) - elif cxn.exit.startswith("Shop"): - replacement = PlandoConnection(cxn.entrance, "Shop Portal", "both") - self.options.plando_connections.value.remove(cxn) - self.options.plando_connections.value.insert(index, replacement) + replacement = None + if self.options.decoupled: + # flip any that are pointing to exit to point to entrance so that I don't have to deal with it + if cxn.direction == "exit": + replacement = PlandoConnection(cxn.exit, cxn.entrance, "entrance", cxn.percentage) + # if decoupled is on and you plando'd an entrance to itself but left the direction as both + if cxn.direction == "both" and cxn.entrance == cxn.exit: + replacement = PlandoConnection(cxn.entrance, cxn.exit, "entrance") + # if decoupled is off, just convert these to both + elif cxn.direction != "both": + replacement = PlandoConnection(cxn.entrance, cxn.exit, "both", cxn.percentage) + + if replacement: + replace_connection(cxn, replacement, index) + + if (self.options.entrance_layout == EntranceLayout.option_direction_pairs + and not verify_plando_directions(cxn)): + raise OptionError(f"TUNIC: Player {self.player_name} has invalid plando connections. " + f"They have Direction Pairs enabled and the connection " + f"{cxn.entrance} --> {cxn.exit} does not abide by this option.") # Universal tracker stuff, shouldn't do anything in standard gen if hasattr(self.multiworld, "re_gen_passthrough"): @@ -160,16 +172,16 @@ class TunicWorld(World): self.options.hexagon_quest_ability_type.value = self.passthrough.get("hexagon_quest_ability_type", 0) self.options.entrance_rando.value = self.passthrough["entrance_rando"] self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] + self.options.entrance_layout.value = EntranceLayout.option_standard + if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].keys() + or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].values()): + self.options.entrance_layout.value = EntranceLayout.option_fixed_shop + self.options.decoupled = self.passthrough.get("decoupled", 0) + self.options.laurels_location.value = LaurelsLocation.option_anywhere self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) self.options.breakable_shuffle.value = self.passthrough.get("breakable_shuffle", 0) self.options.laurels_location.value = self.options.laurels_location.option_anywhere - self.options.combat_logic.value = self.passthrough["combat_logic"] - - self.options.fixed_shop.value = self.options.fixed_shop.option_false - if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].keys() - or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].values()): - self.options.fixed_shop.value = self.options.fixed_shop.option_true - + self.options.combat_logic.value = self.passthrough.get("combat_logic", 0) else: self.using_ut = False else: @@ -227,10 +239,14 @@ class TunicWorld(World): ice_grappling=tunic.options.ice_grappling.value, ladder_storage=tunic.options.ladder_storage.value, laurels_at_10_fairies=tunic.options.laurels_location == LaurelsLocation.option_10_fairies, - fixed_shop=bool(tunic.options.fixed_shop), - plando=tunic.options.plando_connections) + entrance_layout=tunic.options.entrance_layout.value, + has_decoupled_enabled=bool(tunic.options.decoupled), + plando=tunic.options.plando_connections.value.copy()) continue - + # I feel that syncing this one is worse than erroring out + if bool(tunic.options.decoupled) != cls.seed_groups[group]["has_decoupled_enabled"]: + raise OptionError(f"TUNIC: All players in the seed group {group} must " + f"have Decoupled either enabled or disabled.") # off is more restrictive if not tunic.options.laurels_zips: cls.seed_groups[group]["laurels_zips"] = False @@ -243,34 +259,52 @@ class TunicWorld(World): # laurels at 10 fairies changes logic for secret gathering place placement if tunic.options.laurels_location == 3: cls.seed_groups[group]["laurels_at_10_fairies"] = True - # more restrictive, overrides the option for others in the same group, which is better than failing imo - if tunic.options.fixed_shop: - cls.seed_groups[group]["fixed_shop"] = True - + # fixed shop and direction pairs override standard, but conflict with each other + if tunic.options.entrance_layout: + if cls.seed_groups[group]["entrance_layout"] == EntranceLayout.option_standard: + cls.seed_groups[group]["entrance_layout"] = tunic.options.entrance_layout.value + elif cls.seed_groups[group]["entrance_layout"] != tunic.options.entrance_layout.value: + raise OptionError(f"TUNIC: Conflict between seed group {group}'s Entrance Layout options. " + f"Seed group cannot have both Fixed Shop and Direction Pairs enabled.") if tunic.options.plando_connections: # loop through the connections in the player's yaml - for cxn in tunic.options.plando_connections: + for index, player_cxn in enumerate(tunic.options.plando_connections): new_cxn = True for group_cxn in cls.seed_groups[group]["plando"]: - # if neither entrance nor exit match anything in the group, add to group - if ((cxn.entrance == group_cxn.entrance and cxn.exit == group_cxn.exit) - or (cxn.exit == group_cxn.entrance and cxn.entrance == group_cxn.exit)): - new_cxn = False - break - + # verify that it abides by direction pairs if enabled + if (cls.seed_groups[group]["entrance_layout"] == EntranceLayout.option_direction_pairs + and not verify_plando_directions(player_cxn)): + player_dir = "<->" if player_cxn.direction == "both" else "-->" + raise Exception(f"TUNIC: Conflict between Entrance Layout option and Plando Connection: " + f"{player_cxn.entrance} {player_dir} {player_cxn.exit}") # check if this pair is the same as a pair in the group already + if ((player_cxn.entrance == group_cxn.entrance and player_cxn.exit == group_cxn.exit) + or (player_cxn.entrance == group_cxn.exit and player_cxn.exit == group_cxn.entrance + and "both" in [player_cxn.direction, group_cxn.direction])): + new_cxn = False + # if the group's was one-way and the player's was two-way, we replace the group's now + if player_cxn.direction == "both" and group_cxn.direction == "entrance": + cls.seed_groups[group]["plando"].remove(group_cxn) + cls.seed_groups[group]["plando"].insert(index, player_cxn) + break is_mismatched = ( - cxn.entrance == group_cxn.entrance and cxn.exit != group_cxn.exit - or cxn.entrance == group_cxn.exit and cxn.exit != group_cxn.entrance - or cxn.exit == group_cxn.entrance and cxn.entrance != group_cxn.exit - or cxn.exit == group_cxn.exit and cxn.entrance != group_cxn.entrance + player_cxn.entrance == group_cxn.entrance and player_cxn.exit != group_cxn.exit + or player_cxn.exit == group_cxn.exit and player_cxn.entrance != group_cxn.entrance ) + if not tunic.options.decoupled: + is_mismatched = is_mismatched or ( + player_cxn.entrance == group_cxn.exit and player_cxn.exit != group_cxn.entrance + or player_cxn.exit == group_cxn.entrance and player_cxn.entrance != group_cxn.exit + ) if is_mismatched: - raise Exception(f"TUNIC: Conflict between seed group {group}'s plando " - f"connection {group_cxn.entrance} <-> {group_cxn.exit} and " - f"{tunic.player_name}'s plando connection {cxn.entrance} <-> {cxn.exit}") + group_dir = "<->" if group_cxn.direction == "both" else "-->" + player_dir = "<->" if player_cxn.direction == "both" else "-->" + raise OptionError(f"TUNIC: Conflict between seed group {group}'s plando " + f"connection {group_cxn.entrance} {group_dir} {group_cxn.exit} and " + f"{tunic.player_name}'s plando connection " + f"{player_cxn.entrance} {player_dir} {player_cxn.exit}") if new_cxn: - cls.seed_groups[group]["plando"].value.append(cxn) + cls.seed_groups[group]["plando"].append(player_cxn) def create_item(self, name: str, classification: ItemClassification = None) -> TunicItem: item_data = item_table[name] @@ -571,7 +605,7 @@ class TunicWorld(World): all_state = self.multiworld.get_all_state(True) all_state.update_reachable_regions(self.player) paths = all_state.path - portal_names = [portal.name for portal in portal_mapping] + portal_names = {portal.name for portal in portal_mapping}.union({f"Shop Portal {i + 1}" for i in range(500)}) for location in self.multiworld.get_locations(self.player): # skipping event locations if not location.address: @@ -630,6 +664,7 @@ class TunicWorld(World): "lanternless": self.options.lanternless.value, "maskless": self.options.maskless.value, "entrance_rando": int(bool(self.options.entrance_rando.value)), + "decoupled": self.options.decoupled.value if self.options.entrance_rando else 0, "shuffle_ladders": self.options.shuffle_ladders.value, "grass_randomizer": self.options.grass_randomizer.value, "combat_logic": self.options.combat_logic.value, diff --git a/worlds/tunic/combat_logic.py b/worlds/tunic/combat_logic.py index 2e9f19dbc2..dbf1e8640f 100644 --- a/worlds/tunic/combat_logic.py +++ b/worlds/tunic/combat_logic.py @@ -22,6 +22,7 @@ class AreaStats(NamedTuple): # the vanilla upgrades/equipment you would have area_data: Dict[str, AreaStats] = { + # The upgrade page is right by the Well entrance. Upper Overworld by the chest in the top right might need something "Overworld": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Stick"]), "East Forest": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Sword"]), "Before Well": AreaStats(1, 1, 1, 1, 1, 1, 3, ["Sword", "Shield"]), diff --git a/worlds/tunic/docs/en_TUNIC.md b/worlds/tunic/docs/en_TUNIC.md index 610c7edf48..0b85772636 100644 --- a/worlds/tunic/docs/en_TUNIC.md +++ b/worlds/tunic/docs/en_TUNIC.md @@ -83,7 +83,7 @@ Notes: - The Entrance Randomizer option must be enabled for it to work. - The `direction` field is not supported. Connections are always coupled. - For a list of entrance names, check `er_data.py` in the TUNIC world folder or generate a game with the Entrance Randomizer option enabled and check the spoiler log. -- There is no limit to the number of Shops you can plando. +- You can plando up to 500 additional shops in Decoupled. You should not do this. See the [Archipelago Plando Guide](../../../tutorial/Archipelago/plando/en) for more information on Plando and Connection Plando. diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index 0b3a16167a..744326aa20 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -1,15 +1,28 @@ -from typing import Dict, NamedTuple, List, TYPE_CHECKING, Optional +from typing import Dict, NamedTuple, List, Optional, TYPE_CHECKING from enum import IntEnum if TYPE_CHECKING: from . import TunicWorld +# the direction you go to enter a portal +class Direction(IntEnum): + none = 0 # for when the direction isn't relevant + north = 1 + south = 2 + east = 3 + west = 4 + floor = 5 + ladder_up = 6 + ladder_down = 7 + + class Portal(NamedTuple): name: str # human-readable name region: str # AP region destination: str # vanilla destination scene tag: str # vanilla tag + direction: int # the direction you go to enter a portal def scene(self) -> str: # the actual scene name in Tunic if self.region.startswith("Shop"): @@ -25,497 +38,497 @@ class Portal(NamedTuple): portal_mapping: List[Portal] = [ Portal(name="Stick House Entrance", region="Overworld", - destination="Sword Cave", tag="_"), + destination="Sword Cave", tag="_", direction=Direction.north), Portal(name="Windmill Entrance", region="Overworld", - destination="Windmill", tag="_"), + destination="Windmill", tag="_", direction=Direction.north), Portal(name="Well Ladder Entrance", region="Overworld Well Ladder", - destination="Sewer", tag="_entrance"), + destination="Sewer", tag="_entrance", direction=Direction.ladder_down), Portal(name="Entrance to Well from Well Rail", region="Overworld Well to Furnace Rail", - destination="Sewer", tag="_west_aqueduct"), + destination="Sewer", tag="_west_aqueduct", direction=Direction.north), Portal(name="Old House Door Entrance", region="Overworld Old House Door", - destination="Overworld Interiors", tag="_house"), + destination="Overworld Interiors", tag="_house", direction=Direction.east), Portal(name="Old House Waterfall Entrance", region="Overworld", - destination="Overworld Interiors", tag="_under_checkpoint"), + destination="Overworld Interiors", tag="_under_checkpoint", direction=Direction.east), Portal(name="Entrance to Furnace from Well Rail", region="Overworld Well to Furnace Rail", - destination="Furnace", tag="_gyro_upper_north"), + destination="Furnace", tag="_gyro_upper_north", direction=Direction.south), Portal(name="Entrance to Furnace under Windmill", region="Overworld", - destination="Furnace", tag="_gyro_upper_east"), + destination="Furnace", tag="_gyro_upper_east", direction=Direction.west), Portal(name="Entrance to Furnace near West Garden", region="Overworld to West Garden from Furnace", - destination="Furnace", tag="_gyro_west"), + destination="Furnace", tag="_gyro_west", direction=Direction.east), Portal(name="Entrance to Furnace from Beach", region="Overworld Tunnel Turret", - destination="Furnace", tag="_gyro_lower"), + destination="Furnace", tag="_gyro_lower", direction=Direction.north), Portal(name="Caustic Light Cave Entrance", region="Overworld Swamp Lower Entry", - destination="Overworld Cave", tag="_"), + destination="Overworld Cave", tag="_", direction=Direction.north), Portal(name="Swamp Upper Entrance", region="Overworld Swamp Upper Entry", - destination="Swamp Redux 2", tag="_wall"), + destination="Swamp Redux 2", tag="_wall", direction=Direction.south), Portal(name="Swamp Lower Entrance", region="Overworld Swamp Lower Entry", - destination="Swamp Redux 2", tag="_conduit"), + destination="Swamp Redux 2", tag="_conduit", direction=Direction.south), Portal(name="Ruined Passage Not-Door Entrance", region="After Ruined Passage", - destination="Ruins Passage", tag="_east"), + destination="Ruins Passage", tag="_east", direction=Direction.north), Portal(name="Ruined Passage Door Entrance", region="Overworld Ruined Passage Door", - destination="Ruins Passage", tag="_west"), + destination="Ruins Passage", tag="_west", direction=Direction.east), Portal(name="Atoll Upper Entrance", region="Overworld to Atoll Upper", - destination="Atoll Redux", tag="_upper"), + destination="Atoll Redux", tag="_upper", direction=Direction.south), Portal(name="Atoll Lower Entrance", region="Overworld Beach", - destination="Atoll Redux", tag="_lower"), + destination="Atoll Redux", tag="_lower", direction=Direction.south), Portal(name="Special Shop Entrance", region="Overworld Special Shop Entry", - destination="ShopSpecial", tag="_"), + destination="ShopSpecial", tag="_", direction=Direction.east), Portal(name="Maze Cave Entrance", region="Overworld Beach", - destination="Maze Room", tag="_"), + destination="Maze Room", tag="_", direction=Direction.north), Portal(name="West Garden Entrance near Belltower", region="Overworld to West Garden Upper", - destination="Archipelagos Redux", tag="_upper"), + destination="Archipelagos Redux", tag="_upper", direction=Direction.west), Portal(name="West Garden Entrance from Furnace", region="Overworld to West Garden from Furnace", - destination="Archipelagos Redux", tag="_lower"), + destination="Archipelagos Redux", tag="_lower", direction=Direction.west), Portal(name="West Garden Laurels Entrance", region="Overworld West Garden Laurels Entry", - destination="Archipelagos Redux", tag="_lowest"), + destination="Archipelagos Redux", tag="_lowest", direction=Direction.west), Portal(name="Temple Door Entrance", region="Overworld Temple Door", - destination="Temple", tag="_main"), + destination="Temple", tag="_main", direction=Direction.north), Portal(name="Temple Rafters Entrance", region="Overworld after Temple Rafters", - destination="Temple", tag="_rafters"), + destination="Temple", tag="_rafters", direction=Direction.east), Portal(name="Ruined Shop Entrance", region="Overworld", - destination="Ruined Shop", tag="_"), + destination="Ruined Shop", tag="_", direction=Direction.east), Portal(name="Patrol Cave Entrance", region="Overworld at Patrol Cave", - destination="PatrolCave", tag="_"), + destination="PatrolCave", tag="_", direction=Direction.north), Portal(name="Hourglass Cave Entrance", region="Overworld Beach", - destination="Town Basement", tag="_beach"), + destination="Town Basement", tag="_beach", direction=Direction.north), Portal(name="Changing Room Entrance", region="Overworld", - destination="Changing Room", tag="_"), + destination="Changing Room", tag="_", direction=Direction.south), Portal(name="Cube Cave Entrance", region="Cube Cave Entrance Region", - destination="CubeRoom", tag="_"), + destination="CubeRoom", tag="_", direction=Direction.north), Portal(name="Stairs from Overworld to Mountain", region="Upper Overworld", - destination="Mountain", tag="_"), + destination="Mountain", tag="_", direction=Direction.north), Portal(name="Overworld to Fortress", region="East Overworld", - destination="Fortress Courtyard", tag="_"), + destination="Fortress Courtyard", tag="_", direction=Direction.east), Portal(name="Fountain HC Door Entrance", region="Overworld Fountain Cross Door", - destination="Town_FiligreeRoom", tag="_"), + destination="Town_FiligreeRoom", tag="_", direction=Direction.north), Portal(name="Southeast HC Door Entrance", region="Overworld Southeast Cross Door", - destination="EastFiligreeCache", tag="_"), + destination="EastFiligreeCache", tag="_", direction=Direction.north), Portal(name="Overworld to Quarry Connector", region="Overworld Quarry Entry", - destination="Darkwoods Tunnel", tag="_"), + destination="Darkwoods Tunnel", tag="_", direction=Direction.north), Portal(name="Dark Tomb Main Entrance", region="Overworld", - destination="Crypt Redux", tag="_"), + destination="Crypt Redux", tag="_", direction=Direction.north), Portal(name="Overworld to Forest Belltower", region="East Overworld", - destination="Forest Belltower", tag="_"), + destination="Forest Belltower", tag="_", direction=Direction.east), Portal(name="Town to Far Shore", region="Overworld Town Portal", - destination="Transit", tag="_teleporter_town"), + destination="Transit", tag="_teleporter_town", direction=Direction.floor), Portal(name="Spawn to Far Shore", region="Overworld Spawn Portal", - destination="Transit", tag="_teleporter_starting island"), + destination="Transit", tag="_teleporter_starting island", direction=Direction.floor), Portal(name="Secret Gathering Place Entrance", region="Overworld", - destination="Waterfall", tag="_"), - + destination="Waterfall", tag="_", direction=Direction.north), + Portal(name="Secret Gathering Place Exit", region="Secret Gathering Place", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Windmill Exit", region="Windmill", - destination="Overworld Redux", tag="_"), + destination="Overworld Redux", tag="_", direction=Direction.south), Portal(name="Windmill Shop", region="Windmill", - destination="Shop", tag="_"), - + destination="Shop", tag="_", direction=Direction.north), + Portal(name="Old House Door Exit", region="Old House Front", - destination="Overworld Redux", tag="_house"), + destination="Overworld Redux", tag="_house", direction=Direction.west), Portal(name="Old House to Glyph Tower", region="Old House Front", - destination="g_elements", tag="_"), + destination="g_elements", tag="_", direction=Direction.south), # portal drops you on north side Portal(name="Old House Waterfall Exit", region="Old House Back", - destination="Overworld Redux", tag="_under_checkpoint"), - + destination="Overworld Redux", tag="_under_checkpoint", direction=Direction.west), + Portal(name="Glyph Tower Exit", region="Relic Tower", - destination="Overworld Interiors", tag="_"), - + destination="Overworld Interiors", tag="_", direction=Direction.north), + Portal(name="Changing Room Exit", region="Changing Room", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.north), + Portal(name="Fountain HC Room Exit", region="Fountain Cross Room", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Cube Cave Exit", region="Cube Cave", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Guard Patrol Cave Exit", region="Patrol Cave", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Ruined Shop Exit", region="Ruined Shop", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.west), + Portal(name="Furnace Exit towards Well", region="Furnace Fuse", - destination="Overworld Redux", tag="_gyro_upper_north"), + destination="Overworld Redux", tag="_gyro_upper_north", direction=Direction.north), Portal(name="Furnace Exit to Dark Tomb", region="Furnace Walking Path", - destination="Crypt Redux", tag="_"), + destination="Crypt Redux", tag="_", direction=Direction.east), Portal(name="Furnace Exit towards West Garden", region="Furnace Walking Path", - destination="Overworld Redux", tag="_gyro_west"), + destination="Overworld Redux", tag="_gyro_west", direction=Direction.west), Portal(name="Furnace Exit to Beach", region="Furnace Ladder Area", - destination="Overworld Redux", tag="_gyro_lower"), + destination="Overworld Redux", tag="_gyro_lower", direction=Direction.south), Portal(name="Furnace Exit under Windmill", region="Furnace Ladder Area", - destination="Overworld Redux", tag="_gyro_upper_east"), - + destination="Overworld Redux", tag="_gyro_upper_east", direction=Direction.east), + Portal(name="Stick House Exit", region="Stick House", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Ruined Passage Not-Door Exit", region="Ruined Passage", - destination="Overworld Redux", tag="_east"), + destination="Overworld Redux", tag="_east", direction=Direction.south), Portal(name="Ruined Passage Door Exit", region="Ruined Passage", - destination="Overworld Redux", tag="_west"), - + destination="Overworld Redux", tag="_west", direction=Direction.west), + Portal(name="Southeast HC Room Exit", region="Southeast Cross Room", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Caustic Light Cave Exit", region="Caustic Light Cave", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Maze Cave Exit", region="Maze Cave", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Hourglass Cave Exit", region="Hourglass Cave", - destination="Overworld Redux", tag="_beach"), - + destination="Overworld Redux", tag="_beach", direction=Direction.south), + Portal(name="Special Shop Exit", region="Special Shop", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.west), + Portal(name="Temple Rafters Exit", region="Sealed Temple Rafters", - destination="Overworld Redux", tag="_rafters"), + destination="Overworld Redux", tag="_rafters", direction=Direction.west), Portal(name="Temple Door Exit", region="Sealed Temple", - destination="Overworld Redux", tag="_main"), + destination="Overworld Redux", tag="_main", direction=Direction.south), Portal(name="Forest Belltower to Fortress", region="Forest Belltower Main behind bushes", - destination="Fortress Courtyard", tag="_"), + destination="Fortress Courtyard", tag="_", direction=Direction.north), Portal(name="Forest Belltower to Forest", region="Forest Belltower Lower", - destination="East Forest Redux", tag="_"), + destination="East Forest Redux", tag="_", direction=Direction.south), Portal(name="Forest Belltower to Overworld", region="Forest Belltower Main", - destination="Overworld Redux", tag="_"), + destination="Overworld Redux", tag="_", direction=Direction.west), Portal(name="Forest Belltower to Guard Captain Room", region="Forest Belltower Upper", - destination="Forest Boss Room", tag="_"), + destination="Forest Boss Room", tag="_", direction=Direction.south), Portal(name="Forest to Belltower", region="East Forest", - destination="Forest Belltower", tag="_"), + destination="Forest Belltower", tag="_", direction=Direction.north), Portal(name="Forest Guard House 1 Lower Entrance", region="East Forest", - destination="East Forest Redux Laddercave", tag="_lower"), + destination="East Forest Redux Laddercave", tag="_lower", direction=Direction.north), Portal(name="Forest Guard House 1 Gate Entrance", region="East Forest", - destination="East Forest Redux Laddercave", tag="_gate"), + destination="East Forest Redux Laddercave", tag="_gate", direction=Direction.north), Portal(name="Forest Dance Fox Outside Doorway", region="East Forest Dance Fox Spot", - destination="East Forest Redux Laddercave", tag="_upper"), + destination="East Forest Redux Laddercave", tag="_upper", direction=Direction.east), Portal(name="Forest to Far Shore", region="East Forest Portal", - destination="Transit", tag="_teleporter_forest teleporter"), + destination="Transit", tag="_teleporter_forest teleporter", direction=Direction.floor), Portal(name="Forest Guard House 2 Lower Entrance", region="Lower Forest", - destination="East Forest Redux Interior", tag="_lower"), + destination="East Forest Redux Interior", tag="_lower", direction=Direction.north), Portal(name="Forest Guard House 2 Upper Entrance", region="East Forest", - destination="East Forest Redux Interior", tag="_upper"), + destination="East Forest Redux Interior", tag="_upper", direction=Direction.east), Portal(name="Forest Grave Path Lower Entrance", region="East Forest", - destination="Sword Access", tag="_lower"), + destination="Sword Access", tag="_lower", direction=Direction.east), Portal(name="Forest Grave Path Upper Entrance", region="East Forest", - destination="Sword Access", tag="_upper"), + destination="Sword Access", tag="_upper", direction=Direction.east), Portal(name="Forest Grave Path Upper Exit", region="Forest Grave Path Upper", - destination="East Forest Redux", tag="_upper"), + destination="East Forest Redux", tag="_upper", direction=Direction.west), Portal(name="Forest Grave Path Lower Exit", region="Forest Grave Path Main", - destination="East Forest Redux", tag="_lower"), + destination="East Forest Redux", tag="_lower", direction=Direction.west), Portal(name="East Forest Hero's Grave", region="Forest Hero's Grave", - destination="RelicVoid", tag="_teleporter_relic plinth"), + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Guard House 1 Dance Fox Exit", region="Guard House 1 West", - destination="East Forest Redux", tag="_upper"), + destination="East Forest Redux", tag="_upper", direction=Direction.west), Portal(name="Guard House 1 Lower Exit", region="Guard House 1 West", - destination="East Forest Redux", tag="_lower"), + destination="East Forest Redux", tag="_lower", direction=Direction.south), Portal(name="Guard House 1 Upper Forest Exit", region="Guard House 1 East", - destination="East Forest Redux", tag="_gate"), + destination="East Forest Redux", tag="_gate", direction=Direction.south), Portal(name="Guard House 1 to Guard Captain Room", region="Guard House 1 East", - destination="Forest Boss Room", tag="_"), + destination="Forest Boss Room", tag="_", direction=Direction.north), Portal(name="Guard House 2 Lower Exit", region="Guard House 2 Lower", - destination="East Forest Redux", tag="_lower"), + destination="East Forest Redux", tag="_lower", direction=Direction.south), Portal(name="Guard House 2 Upper Exit", region="Guard House 2 Upper before bushes", - destination="East Forest Redux", tag="_upper"), + destination="East Forest Redux", tag="_upper", direction=Direction.west), Portal(name="Guard Captain Room Non-Gate Exit", region="Forest Boss Room", - destination="East Forest Redux Laddercave", tag="_"), + destination="East Forest Redux Laddercave", tag="_", direction=Direction.south), Portal(name="Guard Captain Room Gate Exit", region="Forest Boss Room", - destination="Forest Belltower", tag="_"), + destination="Forest Belltower", tag="_", direction=Direction.north), Portal(name="Well Ladder Exit", region="Beneath the Well Ladder Exit", - destination="Overworld Redux", tag="_entrance"), + destination="Overworld Redux", tag="_entrance", direction=Direction.ladder_up), Portal(name="Well to Well Boss", region="Beneath the Well Back", - destination="Sewer_Boss", tag="_"), + destination="Sewer_Boss", tag="_", direction=Direction.east), Portal(name="Well Exit towards Furnace", region="Beneath the Well Back", - destination="Overworld Redux", tag="_west_aqueduct"), + destination="Overworld Redux", tag="_west_aqueduct", direction=Direction.south), Portal(name="Well Boss to Well", region="Well Boss", - destination="Sewer", tag="_"), + destination="Sewer", tag="_", direction=Direction.west), Portal(name="Checkpoint to Dark Tomb", region="Dark Tomb Checkpoint", - destination="Crypt Redux", tag="_"), + destination="Crypt Redux", tag="_", direction=Direction.ladder_up), Portal(name="Dark Tomb to Overworld", region="Dark Tomb Entry Point", - destination="Overworld Redux", tag="_"), + destination="Overworld Redux", tag="_", direction=Direction.south), Portal(name="Dark Tomb to Furnace", region="Dark Tomb Dark Exit", - destination="Furnace", tag="_"), + destination="Furnace", tag="_", direction=Direction.west), Portal(name="Dark Tomb to Checkpoint", region="Dark Tomb Entry Point", - destination="Sewer_Boss", tag="_"), - + destination="Sewer_Boss", tag="_", direction=Direction.ladder_down), + Portal(name="West Garden Exit near Hero's Grave", region="West Garden before Terry", - destination="Overworld Redux", tag="_lower"), + destination="Overworld Redux", tag="_lower", direction=Direction.east), Portal(name="West Garden to Magic Dagger House", region="West Garden at Dagger House", - destination="archipelagos_house", tag="_"), + destination="archipelagos_house", tag="_", direction=Direction.east), Portal(name="West Garden Exit after Boss", region="West Garden after Boss", - destination="Overworld Redux", tag="_upper"), + destination="Overworld Redux", tag="_upper", direction=Direction.east), Portal(name="West Garden Shop", region="West Garden before Terry", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.east), Portal(name="West Garden Laurels Exit", region="West Garden Laurels Exit Region", - destination="Overworld Redux", tag="_lowest"), + destination="Overworld Redux", tag="_lowest", direction=Direction.east), Portal(name="West Garden Hero's Grave", region="West Garden Hero's Grave Region", - destination="RelicVoid", tag="_teleporter_relic plinth"), + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="West Garden to Far Shore", region="West Garden Portal", - destination="Transit", tag="_teleporter_archipelagos_teleporter"), + destination="Transit", tag="_teleporter_archipelagos_teleporter", direction=Direction.floor), Portal(name="Magic Dagger House Exit", region="Magic Dagger House", - destination="Archipelagos Redux", tag="_"), + destination="Archipelagos Redux", tag="_", direction=Direction.west), Portal(name="Fortress Courtyard to Fortress Grave Path Lower", region="Fortress Courtyard", - destination="Fortress Reliquary", tag="_Lower"), + destination="Fortress Reliquary", tag="_Lower", direction=Direction.east), Portal(name="Fortress Courtyard to Fortress Grave Path Upper", region="Fortress Courtyard Upper", - destination="Fortress Reliquary", tag="_Upper"), + destination="Fortress Reliquary", tag="_Upper", direction=Direction.east), Portal(name="Fortress Courtyard to Fortress Interior", region="Fortress Courtyard", - destination="Fortress Main", tag="_Big Door"), + destination="Fortress Main", tag="_Big Door", direction=Direction.north), Portal(name="Fortress Courtyard to East Fortress", region="Fortress Courtyard Upper", - destination="Fortress East", tag="_"), + destination="Fortress East", tag="_", direction=Direction.north), Portal(name="Fortress Courtyard to Beneath the Vault", region="Beneath the Vault Entry", - destination="Fortress Basement", tag="_"), + destination="Fortress Basement", tag="_", direction=Direction.ladder_down), Portal(name="Fortress Courtyard to Forest Belltower", region="Fortress Exterior from East Forest", - destination="Forest Belltower", tag="_"), + destination="Forest Belltower", tag="_", direction=Direction.south), Portal(name="Fortress Courtyard to Overworld", region="Fortress Exterior from Overworld", - destination="Overworld Redux", tag="_"), + destination="Overworld Redux", tag="_", direction=Direction.west), Portal(name="Fortress Courtyard Shop", region="Fortress Exterior near cave", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.north), Portal(name="Beneath the Vault to Fortress Interior", region="Beneath the Vault Back", - destination="Fortress Main", tag="_"), + destination="Fortress Main", tag="_", direction=Direction.east), Portal(name="Beneath the Vault to Fortress Courtyard", region="Beneath the Vault Ladder Exit", - destination="Fortress Courtyard", tag="_"), + destination="Fortress Courtyard", tag="_", direction=Direction.ladder_up), Portal(name="Fortress Interior Main Exit", region="Eastern Vault Fortress", - destination="Fortress Courtyard", tag="_Big Door"), + destination="Fortress Courtyard", tag="_Big Door", direction=Direction.south), Portal(name="Fortress Interior to Beneath the Earth", region="Eastern Vault Fortress", - destination="Fortress Basement", tag="_"), + destination="Fortress Basement", tag="_", direction=Direction.west), Portal(name="Fortress Interior to Siege Engine Arena", region="Eastern Vault Fortress Gold Door", - destination="Fortress Arena", tag="_"), + destination="Fortress Arena", tag="_", direction=Direction.north), Portal(name="Fortress Interior Shop", region="Eastern Vault Fortress", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.north), Portal(name="Fortress Interior to East Fortress Upper", region="Eastern Vault Fortress", - destination="Fortress East", tag="_upper"), + destination="Fortress East", tag="_upper", direction=Direction.east), Portal(name="Fortress Interior to East Fortress Lower", region="Eastern Vault Fortress", - destination="Fortress East", tag="_lower"), + destination="Fortress East", tag="_lower", direction=Direction.east), Portal(name="East Fortress to Interior Lower", region="Fortress East Shortcut Lower", - destination="Fortress Main", tag="_lower"), + destination="Fortress Main", tag="_lower", direction=Direction.west), Portal(name="East Fortress to Courtyard", region="Fortress East Shortcut Upper", - destination="Fortress Courtyard", tag="_"), + destination="Fortress Courtyard", tag="_", direction=Direction.south), Portal(name="East Fortress to Interior Upper", region="Fortress East Shortcut Upper", - destination="Fortress Main", tag="_upper"), + destination="Fortress Main", tag="_upper", direction=Direction.west), Portal(name="Fortress Grave Path Lower Exit", region="Fortress Grave Path Entry", - destination="Fortress Courtyard", tag="_Lower"), + destination="Fortress Courtyard", tag="_Lower", direction=Direction.west), Portal(name="Fortress Hero's Grave", region="Fortress Hero's Grave Region", - destination="RelicVoid", tag="_teleporter_relic plinth"), + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Fortress Grave Path Upper Exit", region="Fortress Grave Path Upper", - destination="Fortress Courtyard", tag="_Upper"), + destination="Fortress Courtyard", tag="_Upper", direction=Direction.west), Portal(name="Fortress Grave Path Dusty Entrance", region="Fortress Grave Path Dusty Entrance Region", - destination="Dusty", tag="_"), + destination="Dusty", tag="_", direction=Direction.north), Portal(name="Dusty Exit", region="Fortress Leaf Piles", - destination="Fortress Reliquary", tag="_"), + destination="Fortress Reliquary", tag="_", direction=Direction.south), Portal(name="Siege Engine Arena to Fortress", region="Fortress Arena", - destination="Fortress Main", tag="_"), + destination="Fortress Main", tag="_", direction=Direction.south), Portal(name="Fortress to Far Shore", region="Fortress Arena Portal", - destination="Transit", tag="_teleporter_spidertank"), + destination="Transit", tag="_teleporter_spidertank", direction=Direction.floor), Portal(name="Atoll Upper Exit", region="Ruined Atoll", - destination="Overworld Redux", tag="_upper"), + destination="Overworld Redux", tag="_upper", direction=Direction.north), Portal(name="Atoll Lower Exit", region="Ruined Atoll Lower Entry Area", - destination="Overworld Redux", tag="_lower"), + destination="Overworld Redux", tag="_lower", direction=Direction.north), Portal(name="Atoll Shop", region="Ruined Atoll", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.north), Portal(name="Atoll to Far Shore", region="Ruined Atoll Portal", - destination="Transit", tag="_teleporter_atoll"), + destination="Transit", tag="_teleporter_atoll", direction=Direction.floor), Portal(name="Atoll Statue Teleporter", region="Ruined Atoll Statue", - destination="Library Exterior", tag="_"), + destination="Library Exterior", tag="_", direction=Direction.floor), Portal(name="Frog Stairs Eye Entrance", region="Ruined Atoll Frog Eye", - destination="Frog Stairs", tag="_eye"), + destination="Frog Stairs", tag="_eye", direction=Direction.south), # camera rotates, it's fine Portal(name="Frog Stairs Mouth Entrance", region="Ruined Atoll Frog Mouth", - destination="Frog Stairs", tag="_mouth"), + destination="Frog Stairs", tag="_mouth", direction=Direction.east), Portal(name="Frog Stairs Eye Exit", region="Frog Stairs Eye Exit", - destination="Atoll Redux", tag="_eye"), + destination="Atoll Redux", tag="_eye", direction=Direction.north), Portal(name="Frog Stairs Mouth Exit", region="Frog Stairs Upper", - destination="Atoll Redux", tag="_mouth"), + destination="Atoll Redux", tag="_mouth", direction=Direction.west), Portal(name="Frog Stairs to Frog's Domain's Entrance", region="Frog Stairs to Frog's Domain", - destination="frog cave main", tag="_Entrance"), + destination="frog cave main", tag="_Entrance", direction=Direction.ladder_down), Portal(name="Frog Stairs to Frog's Domain's Exit", region="Frog Stairs Lower", - destination="frog cave main", tag="_Exit"), + destination="frog cave main", tag="_Exit", direction=Direction.east), Portal(name="Frog's Domain Ladder Exit", region="Frog's Domain Entry", - destination="Frog Stairs", tag="_Entrance"), + destination="Frog Stairs", tag="_Entrance", direction=Direction.ladder_up), Portal(name="Frog's Domain Orb Exit", region="Frog's Domain Back", - destination="Frog Stairs", tag="_Exit"), + destination="Frog Stairs", tag="_Exit", direction=Direction.west), Portal(name="Library Exterior Tree", region="Library Exterior Tree Region", - destination="Atoll Redux", tag="_"), + destination="Atoll Redux", tag="_", direction=Direction.floor), Portal(name="Library Exterior Ladder", region="Library Exterior Ladder Region", - destination="Library Hall", tag="_"), + destination="Library Hall", tag="_", direction=Direction.west), # camera rotates Portal(name="Library Hall Bookshelf Exit", region="Library Hall Bookshelf", - destination="Library Exterior", tag="_"), + destination="Library Exterior", tag="_", direction=Direction.east), Portal(name="Library Hero's Grave", region="Library Hero's Grave Region", - destination="RelicVoid", tag="_teleporter_relic plinth"), + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Library Hall to Rotunda", region="Library Hall to Rotunda", - destination="Library Rotunda", tag="_"), + destination="Library Rotunda", tag="_", direction=Direction.ladder_up), Portal(name="Library Rotunda Lower Exit", region="Library Rotunda to Hall", - destination="Library Hall", tag="_"), + destination="Library Hall", tag="_", direction=Direction.ladder_down), Portal(name="Library Rotunda Upper Exit", region="Library Rotunda to Lab", - destination="Library Lab", tag="_"), + destination="Library Lab", tag="_", direction=Direction.ladder_up), Portal(name="Library Lab to Rotunda", region="Library Lab Lower", - destination="Library Rotunda", tag="_"), + destination="Library Rotunda", tag="_", direction=Direction.ladder_down), Portal(name="Library to Far Shore", region="Library Portal", - destination="Transit", tag="_teleporter_library teleporter"), + destination="Transit", tag="_teleporter_library teleporter", direction=Direction.floor), Portal(name="Library Lab to Librarian Arena", region="Library Lab to Librarian", - destination="Library Arena", tag="_"), + destination="Library Arena", tag="_", direction=Direction.ladder_up), Portal(name="Librarian Arena Exit", region="Library Arena", - destination="Library Lab", tag="_"), + destination="Library Lab", tag="_", direction=Direction.ladder_down), Portal(name="Stairs to Top of the Mountain", region="Lower Mountain Stairs", - destination="Mountaintop", tag="_"), + destination="Mountaintop", tag="_", direction=Direction.north), Portal(name="Mountain to Quarry", region="Lower Mountain", - destination="Quarry Redux", tag="_"), + destination="Quarry Redux", tag="_", direction=Direction.south), # connecting is north Portal(name="Mountain to Overworld", region="Lower Mountain", - destination="Overworld Redux", tag="_"), - + destination="Overworld Redux", tag="_", direction=Direction.south), + Portal(name="Top of the Mountain Exit", region="Top of the Mountain", - destination="Mountain", tag="_"), - + destination="Mountain", tag="_", direction=Direction.south), + Portal(name="Quarry Connector to Overworld", region="Quarry Connector", - destination="Overworld Redux", tag="_"), + destination="Overworld Redux", tag="_", direction=Direction.south), Portal(name="Quarry Connector to Quarry", region="Quarry Connector", - destination="Quarry Redux", tag="_"), - + destination="Quarry Redux", tag="_", direction=Direction.north), # rotates, it's fine + Portal(name="Quarry to Overworld Exit", region="Quarry Entry", - destination="Darkwoods Tunnel", tag="_"), + destination="Darkwoods Tunnel", tag="_", direction=Direction.south), # rotates, it's fine Portal(name="Quarry Shop", region="Quarry Entry", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.north), Portal(name="Quarry to Monastery Front", region="Quarry Monastery Entry", - destination="Monastery", tag="_front"), + destination="Monastery", tag="_front", direction=Direction.north), Portal(name="Quarry to Monastery Back", region="Monastery Rope", - destination="Monastery", tag="_back"), + destination="Monastery", tag="_back", direction=Direction.east), Portal(name="Quarry to Mountain", region="Quarry Back", - destination="Mountain", tag="_"), + destination="Mountain", tag="_", direction=Direction.north), Portal(name="Quarry to Ziggurat", region="Lower Quarry Zig Door", - destination="ziggurat2020_0", tag="_"), + destination="ziggurat2020_0", tag="_", direction=Direction.north), Portal(name="Quarry to Far Shore", region="Quarry Portal", - destination="Transit", tag="_teleporter_quarry teleporter"), - + destination="Transit", tag="_teleporter_quarry teleporter", direction=Direction.floor), + Portal(name="Monastery Rear Exit", region="Monastery Back", - destination="Quarry Redux", tag="_back"), + destination="Quarry Redux", tag="_back", direction=Direction.west), Portal(name="Monastery Front Exit", region="Monastery Front", - destination="Quarry Redux", tag="_front"), + destination="Quarry Redux", tag="_front", direction=Direction.south), Portal(name="Monastery Hero's Grave", region="Monastery Hero's Grave Region", - destination="RelicVoid", tag="_teleporter_relic plinth"), - + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), + Portal(name="Ziggurat Entry Hallway to Ziggurat Upper", region="Rooted Ziggurat Entry", - destination="ziggurat2020_1", tag="_"), + destination="ziggurat2020_1", tag="_", direction=Direction.north), Portal(name="Ziggurat Entry Hallway to Quarry", region="Rooted Ziggurat Entry", - destination="Quarry Redux", tag="_"), - + destination="Quarry Redux", tag="_", direction=Direction.south), + Portal(name="Ziggurat Upper to Ziggurat Entry Hallway", region="Rooted Ziggurat Upper Entry", - destination="ziggurat2020_0", tag="_"), + destination="ziggurat2020_0", tag="_", direction=Direction.south), Portal(name="Ziggurat Upper to Ziggurat Tower", region="Rooted Ziggurat Upper Back", - destination="ziggurat2020_2", tag="_"), - + destination="ziggurat2020_2", tag="_", direction=Direction.north), # connecting is south + Portal(name="Ziggurat Tower to Ziggurat Upper", region="Rooted Ziggurat Middle Top", - destination="ziggurat2020_1", tag="_"), + destination="ziggurat2020_1", tag="_", direction=Direction.south), Portal(name="Ziggurat Tower to Ziggurat Lower", region="Rooted Ziggurat Middle Bottom", - destination="ziggurat2020_3", tag="_"), - + destination="ziggurat2020_3", tag="_", direction=Direction.south), + Portal(name="Ziggurat Lower to Ziggurat Tower", region="Rooted Ziggurat Lower Entry", - destination="ziggurat2020_2", tag="_"), + destination="ziggurat2020_2", tag="_", direction=Direction.north), Portal(name="Ziggurat Portal Room Entrance", region="Rooted Ziggurat Portal Room Entrance", - destination="ziggurat2020_FTRoom", tag="_"), + destination="ziggurat2020_FTRoom", tag="_", direction=Direction.north), # only if fixed shop is on, removed otherwise - Portal(name="Ziggurat Lower Falling Entrance", region="Zig Skip Exit", - destination="ziggurat2020_1", tag="_zig2_skip"), - + Portal(name="Ziggurat Lower Falling Entrance", region="Zig Skip Exit", # not a real region + destination="ziggurat2020_1", tag="_zig2_skip", direction=Direction.none), + Portal(name="Ziggurat Portal Room Exit", region="Rooted Ziggurat Portal Room Exit", - destination="ziggurat2020_3", tag="_"), + destination="ziggurat2020_3", tag="_", direction=Direction.south), Portal(name="Ziggurat to Far Shore", region="Rooted Ziggurat Portal", - destination="Transit", tag="_teleporter_ziggurat teleporter"), - + destination="Transit", tag="_teleporter_ziggurat teleporter", direction=Direction.floor), + Portal(name="Swamp Lower Exit", region="Swamp Front", - destination="Overworld Redux", tag="_conduit"), + destination="Overworld Redux", tag="_conduit", direction=Direction.north), Portal(name="Swamp to Cathedral Main Entrance", region="Swamp to Cathedral Main Entrance Region", - destination="Cathedral Redux", tag="_main"), + destination="Cathedral Redux", tag="_main", direction=Direction.north), Portal(name="Swamp to Cathedral Secret Legend Room Entrance", region="Swamp to Cathedral Treasure Room", - destination="Cathedral Redux", tag="_secret"), + destination="Cathedral Redux", tag="_secret", direction=Direction.south), # feels a little weird Portal(name="Swamp to Gauntlet", region="Back of Swamp", - destination="Cathedral Arena", tag="_"), + destination="Cathedral Arena", tag="_", direction=Direction.north), Portal(name="Swamp Shop", region="Swamp Front", - destination="Shop", tag="_"), + destination="Shop", tag="_", direction=Direction.north), Portal(name="Swamp Upper Exit", region="Back of Swamp Laurels Area", - destination="Overworld Redux", tag="_wall"), + destination="Overworld Redux", tag="_wall", direction=Direction.north), Portal(name="Swamp Hero's Grave", region="Swamp Hero's Grave Region", - destination="RelicVoid", tag="_teleporter_relic plinth"), - + destination="RelicVoid", tag="_teleporter_relic plinth", direction=Direction.floor), + Portal(name="Cathedral Main Exit", region="Cathedral Entry", - destination="Swamp Redux 2", tag="_main"), + destination="Swamp Redux 2", tag="_main", direction=Direction.south), Portal(name="Cathedral Elevator", region="Cathedral to Gauntlet", - destination="Cathedral Arena", tag="_"), + destination="Cathedral Arena", tag="_", direction=Direction.ladder_down), # elevators are ladders, right? Portal(name="Cathedral Secret Legend Room Exit", region="Cathedral Secret Legend Room", - destination="Swamp Redux 2", tag="_secret"), - + destination="Swamp Redux 2", tag="_secret", direction=Direction.north), + Portal(name="Gauntlet to Swamp", region="Cathedral Gauntlet Exit", - destination="Swamp Redux 2", tag="_"), + destination="Swamp Redux 2", tag="_", direction=Direction.south), Portal(name="Gauntlet Elevator", region="Cathedral Gauntlet Checkpoint", - destination="Cathedral Redux", tag="_"), + destination="Cathedral Redux", tag="_", direction=Direction.ladder_up), Portal(name="Gauntlet Shop", region="Cathedral Gauntlet Checkpoint", - destination="Shop", tag="_"), - + destination="Shop", tag="_", direction=Direction.east), + Portal(name="Hero's Grave to Fortress", region="Hero Relic - Fortress", - destination="Fortress Reliquary", tag="_teleporter_relic plinth"), + destination="Fortress Reliquary", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Hero's Grave to Monastery", region="Hero Relic - Quarry", - destination="Monastery", tag="_teleporter_relic plinth"), + destination="Monastery", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Hero's Grave to West Garden", region="Hero Relic - West Garden", - destination="Archipelagos Redux", tag="_teleporter_relic plinth"), + destination="Archipelagos Redux", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Hero's Grave to East Forest", region="Hero Relic - East Forest", - destination="Sword Access", tag="_teleporter_relic plinth"), + destination="Sword Access", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Hero's Grave to Library", region="Hero Relic - Library", - destination="Library Hall", tag="_teleporter_relic plinth"), + destination="Library Hall", tag="_teleporter_relic plinth", direction=Direction.floor), Portal(name="Hero's Grave to Swamp", region="Hero Relic - Swamp", - destination="Swamp Redux 2", tag="_teleporter_relic plinth"), - + destination="Swamp Redux 2", tag="_teleporter_relic plinth", direction=Direction.floor), + Portal(name="Far Shore to West Garden", region="Far Shore to West Garden Region", - destination="Archipelagos Redux", tag="_teleporter_archipelagos_teleporter"), + destination="Archipelagos Redux", tag="_teleporter_archipelagos_teleporter", direction=Direction.floor), Portal(name="Far Shore to Library", region="Far Shore to Library Region", - destination="Library Lab", tag="_teleporter_library teleporter"), + destination="Library Lab", tag="_teleporter_library teleporter", direction=Direction.floor), Portal(name="Far Shore to Quarry", region="Far Shore to Quarry Region", - destination="Quarry Redux", tag="_teleporter_quarry teleporter"), + destination="Quarry Redux", tag="_teleporter_quarry teleporter", direction=Direction.floor), Portal(name="Far Shore to East Forest", region="Far Shore to East Forest Region", - destination="East Forest Redux", tag="_teleporter_forest teleporter"), + destination="East Forest Redux", tag="_teleporter_forest teleporter", direction=Direction.floor), Portal(name="Far Shore to Fortress", region="Far Shore to Fortress Region", - destination="Fortress Arena", tag="_teleporter_spidertank"), + destination="Fortress Arena", tag="_teleporter_spidertank", direction=Direction.floor), Portal(name="Far Shore to Atoll", region="Far Shore", - destination="Atoll Redux", tag="_teleporter_atoll"), + destination="Atoll Redux", tag="_teleporter_atoll", direction=Direction.floor), Portal(name="Far Shore to Ziggurat", region="Far Shore", - destination="ziggurat2020_FTRoom", tag="_teleporter_ziggurat teleporter"), + destination="ziggurat2020_FTRoom", tag="_teleporter_ziggurat teleporter", direction=Direction.floor), Portal(name="Far Shore to Heir", region="Far Shore", - destination="Spirit Arena", tag="_teleporter_spirit arena"), + destination="Spirit Arena", tag="_teleporter_spirit arena", direction=Direction.floor), Portal(name="Far Shore to Town", region="Far Shore", - destination="Overworld Redux", tag="_teleporter_town"), + destination="Overworld Redux", tag="_teleporter_town", direction=Direction.floor), Portal(name="Far Shore to Spawn", region="Far Shore to Spawn Region", - destination="Overworld Redux", tag="_teleporter_starting island"), - + destination="Overworld Redux", tag="_teleporter_starting island", direction=Direction.floor), + Portal(name="Heir Arena Exit", region="Spirit Arena", - destination="Transit", tag="_teleporter_spirit arena"), - + destination="Transit", tag="_teleporter_spirit arena", direction=Direction.floor), + Portal(name="Purgatory Bottom Exit", region="Purgatory", - destination="Purgatory", tag="_bottom"), + destination="Purgatory", tag="_bottom", direction=Direction.south), Portal(name="Purgatory Top Exit", region="Purgatory", - destination="Purgatory", tag="_top"), + destination="Purgatory", tag="_top", direction=Direction.north), ] @@ -523,6 +536,7 @@ class RegionInfo(NamedTuple): game_scene: str # the name of the scene in the actual game dead_end: int = 0 # if a region has only one exit outlet_region: Optional[str] = None + is_fake_region: bool = False # gets the outlet region name if it exists, the region if it doesn't @@ -540,9 +554,9 @@ class DeadEnd(IntEnum): # key is the AP region name. "Fake" in region info just means the mod won't receive that info at all tunic_er_regions: Dict[str, RegionInfo] = { - "Menu": RegionInfo("Fake", dead_end=DeadEnd.all_cats), + "Menu": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), "Overworld": RegionInfo("Overworld Redux"), # main overworld, the central area - "Overworld Holy Cross": RegionInfo("Fake", dead_end=DeadEnd.all_cats), # main overworld holy cross checks + "Overworld Holy Cross": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), # main overworld holy cross checks "Overworld Belltower": RegionInfo("Overworld Redux"), # the area with the belltower and chest "Overworld Belltower at Bell": RegionInfo("Overworld Redux"), # being able to ring the belltower, basically "Overworld Swamp Upper Entry": RegionInfo("Overworld Redux"), # upper swamp entry spot @@ -722,7 +736,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Rooted Ziggurat Lower Front": RegionInfo("ziggurat2020_3"), # the front for combat logic "Rooted Ziggurat Lower Mid Checkpoint": RegionInfo("ziggurat2020_3"), # the mid-checkpoint before double admin "Rooted Ziggurat Lower Back": RegionInfo("ziggurat2020_3"), # the boss side - "Zig Skip Exit": RegionInfo("ziggurat2020_3", dead_end=DeadEnd.special, outlet_region="Rooted Ziggurat Lower Entry"), # for use with fixed shop on + "Zig Skip Exit": RegionInfo("ziggurat2020_3", dead_end=DeadEnd.special, outlet_region="Rooted Ziggurat Lower Entry", is_fake_region=True), # for use with fixed shop on "Rooted Ziggurat Portal Room Entrance": RegionInfo("ziggurat2020_3", outlet_region="Rooted Ziggurat Lower Back"), # the door itself on the zig 3 side "Rooted Ziggurat Portal": RegionInfo("ziggurat2020_FTRoom", outlet_region="Rooted Ziggurat Portal Room"), "Rooted Ziggurat Portal Room": RegionInfo("ziggurat2020_FTRoom"), @@ -758,7 +772,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Purgatory": RegionInfo("Purgatory"), "Shop": RegionInfo("Shop", dead_end=DeadEnd.all_cats), "Spirit Arena": RegionInfo("Spirit Arena", dead_end=DeadEnd.all_cats), - "Spirit Arena Victory": RegionInfo("Spirit Arena", dead_end=DeadEnd.all_cats), + "Spirit Arena Victory": RegionInfo("Spirit Arena", dead_end=DeadEnd.all_cats, is_fake_region=True), } @@ -813,7 +827,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Overworld Southeast Cross Door": [], "Overworld Fountain Cross Door": - [], + [], "Overworld Town Portal": [], "Overworld Spawn Portal": @@ -1301,7 +1315,6 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { [], }, - # cannot get from frogs back to front "Library Exterior Ladder Region": { "Library Exterior by Tree": [], @@ -1634,10 +1647,6 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Rooted Ziggurat Portal Room Entrance": [], }, - "Zig Skip Exit": { - "Rooted Ziggurat Lower Front": - [], - }, "Rooted Ziggurat Portal Room Entrance": { "Rooted Ziggurat Lower Back": [], diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 84ebb48304..8c0979e3e4 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -381,9 +381,11 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld Tunnel Turret"], rule=lambda state: state.has(laurels, player)) - regions["Overworld Tunnel Turret"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: state.has_any({grapple, laurels}, player)) + + # always have access to Overworld, so connecting back isn't needed + # regions["Overworld Tunnel Turret"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: state.has_any({grapple, laurels}, player)) cube_entrance = regions["Overworld"].connect( connecting_region=regions["Cube Cave Entrance Region"], @@ -1053,11 +1055,6 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Rooted Ziggurat Portal Room Entrance"].connect( connecting_region=regions["Rooted Ziggurat Lower Back"]) - # zig skip region only gets made if entrance rando and fewer shops are on - if options.entrance_rando and options.fixed_shop: - regions["Zig Skip Exit"].connect( - connecting_region=regions["Rooted Ziggurat Lower Front"]) - regions["Rooted Ziggurat Portal"].connect( connecting_region=regions["Rooted Ziggurat Portal Room"]) regions["Rooted Ziggurat Portal Room"].connect( @@ -1226,14 +1223,6 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ and has_sword(state, player)))) if options.ladder_storage: - def get_portal_info(portal_sd: str) -> Tuple[str, str]: - for portal1, portal2 in portal_pairs.items(): - if portal1.scene_destination() == portal_sd: - return portal1.name, get_portal_outlet_region(portal2, world) - if portal2.scene_destination() == portal_sd: - return portal2.name, get_portal_outlet_region(portal1, world) - raise Exception("no matches found in get_paired_region") - # connect ls elevation regions to their destinations def ls_connect(origin_name: str, portal_sdt: str) -> None: p_name, paired_region_name = get_portal_info(portal_sdt) diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index 597c65b920..ae1b5fcb45 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -1,11 +1,12 @@ from typing import Dict, List, Set, Tuple, TYPE_CHECKING from BaseClasses import Region, ItemClassification, Item, Location from .locations import all_locations -from .er_data import Portal, portal_mapping, traversal_requirements, DeadEnd, RegionInfo +from .er_data import (Portal, portal_mapping, traversal_requirements, DeadEnd, Direction, RegionInfo, + get_portal_outlet_region) from .er_rules import set_er_region_rules from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules from Options import PlandoConnection -from .options import EntranceRando +from .options import EntranceRando, EntranceLayout from random import Random from copy import deepcopy @@ -23,17 +24,18 @@ class TunicERLocation(Location): def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: regions: Dict[str, Region] = {} + world.used_shop_numbers = set() + for region_name, region_data in world.er_regions.items(): if world.options.entrance_rando and region_name == "Zig Skip Exit": # need to check if there's a seed group for this first if world.options.entrance_rando.value not in EntranceRando.options.values(): - if not world.seed_groups[world.options.entrance_rando.value]["fixed_shop"]: + if world.seed_groups[world.options.entrance_rando.value]["entrance_layout"] != EntranceLayout.option_fixed_shop: continue - elif not world.options.fixed_shop: + elif world.options.entrance_layout != EntranceLayout.option_fixed_shop: continue if not world.options.entrance_rando and region_name in ("Zig Skip Exit", "Purgatory"): continue - region = Region(region_name, world.player, world.multiworld) regions[region_name] = region world.multiworld.regions.append(region) @@ -46,13 +48,18 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: portal_pairs = pair_portals(world, regions) # output the entrances to the spoiler log here for convenience - sorted_portal_pairs = sort_portals(portal_pairs) - for portal1, portal2 in sorted_portal_pairs.items(): - world.multiworld.spoiler.set_entrance(portal1, portal2, "both", world.player) + sorted_portal_pairs = sort_portals(portal_pairs, world) + if not world.options.decoupled: + for portal1, portal2 in sorted_portal_pairs.items(): + world.multiworld.spoiler.set_entrance(portal1, portal2, "both", world.player) + else: + for portal1, portal2 in sorted_portal_pairs.items(): + world.multiworld.spoiler.set_entrance(portal1, portal2, "entrance", world.player) + else: portal_pairs = vanilla_portals(world, regions) - create_randomized_entrances(portal_pairs, regions) + create_randomized_entrances(world, portal_pairs, regions) set_er_region_rules(world, regions, portal_pairs) @@ -75,6 +82,7 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: return portal_pairs +# keys are event names, values are event regions tunic_events: Dict[str, str] = { "Eastern Bell": "Forest Belltower Upper", "Western Bell": "Overworld Belltower at Bell", @@ -111,17 +119,31 @@ def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: region.locations.append(location) +# keeping track of which shop numbers have been used already to avoid duplicates +# due to plando, shops can be added out of order, so a set is the best way to make this work smoothly +def get_shop_num(world: "TunicWorld") -> int: + portal_num = -1 + for i in range(500): + if i + 1 not in world.used_shop_numbers: + portal_num = i + 1 + world.used_shop_numbers.add(portal_num) + break + if portal_num == -1: + raise Exception(f"TUNIC: {world.player_name} has plando'd too many shops.") + return portal_num + + # all shops are the same shop. however, you cannot get to all shops from the same shop entrance. # so, we need a bunch of shop regions that connect to the actual shop, but the actual shop cannot connect back -def create_shop_region(world: "TunicWorld", regions: Dict[str, Region]) -> None: - new_shop_name = f"Shop {world.shop_num}" +def create_shop_region(world: "TunicWorld", regions: Dict[str, Region], portal_num) -> None: + new_shop_name = f"Shop {portal_num}" world.er_regions[new_shop_name] = RegionInfo("Shop", dead_end=DeadEnd.all_cats) new_shop_region = Region(new_shop_name, world.player, world.multiworld) new_shop_region.connect(regions["Shop"]) regions[new_shop_name] = new_shop_region - world.shop_num += 1 +# for non-ER that uses the ER rules, we create a vanilla set of portal pairs def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: portal_pairs: Dict[Portal, Portal] = {} # we don't want the zig skip exit for vanilla portals, since it shouldn't be considered for logic here @@ -135,9 +157,10 @@ def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Por portal2_sdt = portal1.destination_scene() if portal2_sdt.startswith("Shop,"): - portal2 = Portal(name=f"Shop Portal {world.shop_num}", region=f"Shop {world.shop_num}", - destination="Previous Region", tag="_") - create_shop_region(world, regions) + portal_num = get_shop_num(world) + portal2 = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=Direction.none) + create_shop_region(world, regions, portal_num) for portal in portal_map: if portal.scene_destination() == portal2_sdt: @@ -152,7 +175,13 @@ def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Por return portal_pairs -# pairing off portals, starting with dead ends +# the really long function that gives us our portal pairs +# before we start pairing, we separate the portals into dead ends and non-dead ends (two_plus) +# then, we do a few other important tasks to accommodate options and seed gropus +# first phase: pick a two_plus in a reachable region and non-reachable region and pair them +# repeat this phase until all regions are reachable +# second phase: randomly pair dead ends to random two_plus +# third phase: randomly pair the remaining two_plus to each other def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: portal_pairs: Dict[Portal, Portal] = {} dead_ends: List[Portal] = [] @@ -162,8 +191,9 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal laurels_zips = world.options.laurels_zips.value ice_grappling = world.options.ice_grappling.value ladder_storage = world.options.ladder_storage.value - fixed_shop = world.options.fixed_shop + entrance_layout = world.options.entrance_layout laurels_location = world.options.laurels_location + decoupled = world.options.decoupled traversal_reqs = deepcopy(traversal_requirements) has_laurels = True waterfall_plando = False @@ -174,7 +204,7 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal laurels_zips = seed_group["laurels_zips"] ice_grappling = seed_group["ice_grappling"] ladder_storage = seed_group["ladder_storage"] - fixed_shop = seed_group["fixed_shop"] + entrance_layout = seed_group["entrance_layout"] laurels_location = "10_fairies" if seed_group["laurels_at_10_fairies"] is True else False logic_tricks: Tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) @@ -183,15 +213,18 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal if laurels_location == "10_fairies" and not world.using_ut: has_laurels = False - shop_count = 6 - if fixed_shop: - shop_count = 0 - else: - # if fixed shop is off, remove this portal - for portal in portal_map: - if portal.region == "Zig Skip Exit": - portal_map.remove(portal) - break + # for the direction pairs option with decoupled off + # tracks how many portals are in each direction in each list + two_plus_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} + dead_end_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} + + # for ensuring we have enough entrances in directions left that we don't leave dead ends without any + def too_few_portals_for_direction_pairs(direction: int, offset: int) -> bool: + if two_plus_direction_tracker[direction] <= (dead_end_direction_tracker[direction_pairs[direction]] + offset): + return False + if two_plus_direction_tracker[direction_pairs[direction]] <= dead_end_direction_tracker[direction] + offset: + return False + return True # If using Universal Tracker, restore portal_map. Could be cleaner, but it does not matter for UT even a little bit if world.using_ut: @@ -202,25 +235,59 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal dead_end_status = world.er_regions[portal.region].dead_end if dead_end_status == DeadEnd.free: two_plus.append(portal) + two_plus_direction_tracker[portal.direction] += 1 elif dead_end_status == DeadEnd.all_cats: dead_ends.append(portal) + dead_end_direction_tracker[portal.direction] += 1 elif dead_end_status == DeadEnd.restricted: if ice_grappling: two_plus.append(portal) + two_plus_direction_tracker[portal.direction] += 1 else: dead_ends.append(portal) + dead_end_direction_tracker[portal.direction] += 1 # these two get special handling elif dead_end_status == DeadEnd.special: if portal.region == "Secret Gathering Place": if laurels_location == "10_fairies": two_plus.append(portal) + two_plus_direction_tracker[portal.direction] += 1 else: dead_ends.append(portal) + dead_end_direction_tracker[portal.direction] += 1 + if portal.region == "Zig Skip Exit" and entrance_layout == EntranceLayout.option_fixed_shop: + # direction isn't meaningful here since zig skip cannot be in direction pairs mode + two_plus.append(portal) + + # now we generate the shops and add them to the dead ends list + shop_count = 6 + if entrance_layout == EntranceLayout.option_fixed_shop: + shop_count = 0 + else: + # if fixed shop is off, remove this portal + for portal in portal_map: if portal.region == "Zig Skip Exit": - if fixed_shop: - two_plus.append(portal) - else: - dead_ends.append(portal) + portal_map.remove(portal) + break + # need 8 shops with direction pairs or there won't be a valid set of pairs + if entrance_layout == EntranceLayout.option_direction_pairs: + shop_count = 8 + + # for universal tracker, we want to skip shop gen since it's essentially full plando + if world.using_ut: + shop_count = 0 + + for _ in range(shop_count): + # 6 of the shops have south exits, 2 of them have west exits + portal_num = get_shop_num(world) + shop_dir = Direction.south + if portal_num > 6: + shop_dir = Direction.west + shop_portal = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=shop_dir) + create_shop_region(world, regions, portal_num) + dead_ends.append(shop_portal) + dead_end_direction_tracker[shop_portal.direction] += 1 connected_regions: Set[str] = set() # make better start region stuff when/if implementing random start @@ -249,29 +316,68 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal portal_name2 = portal.name # connected_regions.update(add_dependent_regions(portal.region, logic_rules)) # shops have special handling - if not portal_name2 and portal2 == "Shop, Previous Region_": - portal_name2 = "Shop Portal" - plando_connections.append(PlandoConnection(portal_name1, portal_name2, "both")) + if not portal_name1 and portal1.startswith("Shop"): + # it should show up as "Shop, 1_" for shop 1 + portal_name1 = "Shop Portal " + str(portal1).split(", ")[1].split("_")[0] + if not portal_name2 and portal2.startswith("Shop"): + portal_name2 = "Shop Portal " + str(portal2).split(", ")[1].split("_")[0] + if world.options.decoupled: + plando_connections.append(PlandoConnection(portal_name1, portal_name2, "entrance")) + else: + plando_connections.append(PlandoConnection(portal_name1, portal_name2, "both")) + # put together the list of non-deadend regions non_dead_end_regions = set() for region_name, region_info in world.er_regions.items(): - if not region_info.dead_end: + # these are not real regions, they are just here to be descriptive + if region_info.is_fake_region or region_name == "Shop": + continue + # dead ends aren't real in decoupled + if decoupled: + non_dead_end_regions.add(region_name) + elif not region_info.dead_end: non_dead_end_regions.add(region_name) # if ice grappling to places is in logic, both places stop being dead ends elif region_info.dead_end == DeadEnd.restricted and ice_grappling: non_dead_end_regions.add(region_name) - # secret gathering place and zig skip get weird, special handling + # secret gathering place is treated as a non-dead end if 10 fairies is on to assure non-laurels access to it elif region_info.dead_end == DeadEnd.special: - if (region_name == "Secret Gathering Place" and laurels_location == "10_fairies") \ - or (region_name == "Zig Skip Exit" and fixed_shop): + if region_name == "Secret Gathering Place" and laurels_location == "10_fairies": non_dead_end_regions.add(region_name) + if decoupled: + # add the dead ends to the two plus list, since dead ends aren't real in decoupled + two_plus.extend(dead_ends) + dead_ends.clear() + # if decoupled is on, we make a second two_plus list, where the first is entrances and the second is exits + two_plus2 = two_plus.copy() + else: + # if decoupled is off, the two lists are the same list, since entrances and exits are intertwined + two_plus2 = two_plus + if plando_connections: - for connection in plando_connections: + if decoupled: + modified_plando_connections = plando_connections.copy() + for index, cxn in enumerate(modified_plando_connections): + # it's much easier if we split both-direction portals into two one-ways in decoupled + if cxn.direction == "both": + replacement1 = PlandoConnection(cxn.entrance, cxn.exit, "entrance") + replacement2 = PlandoConnection(cxn.exit, cxn.entrance, "entrance") + modified_plando_connections.remove(cxn) + modified_plando_connections.insert(index, replacement1) + modified_plando_connections.append(replacement2) + else: + modified_plando_connections = plando_connections + + connected_shop_portal1s: Set[int] = set() + connected_shop_portal2s: Set[int] = set() + for connection in modified_plando_connections: p_entrance = connection.entrance p_exit = connection.exit # if you plando secret gathering place, need to know that during portal pairing - if "Secret Gathering Place Exit" in [p_entrance, p_exit]: + if p_exit == "Secret Gathering Place Exit": + waterfall_plando = True + if p_entrance == "Secret Gathering Place Exit" and not decoupled: waterfall_plando = True portal1_dead_end = True portal2_dead_end = True @@ -279,118 +385,186 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal portal1 = None portal2 = None - # search two_plus for both at once + # search the two_plus lists (or list) for the portals for portal in two_plus: if p_entrance == portal.name: portal1 = portal portal1_dead_end = False + break + for portal in two_plus2: if p_exit == portal.name: portal2 = portal portal2_dead_end = False + break # search dead_ends individually since we can't really remove items from two_plus during the loop if portal1: two_plus.remove(portal1) else: # if not both, they're both dead ends - if not portal2: + if not portal2 and not decoupled: if world.options.entrance_rando.value not in EntranceRando.options.values(): raise Exception(f"Tunic ER seed group {world.options.entrance_rando.value} paired a dead " "end to a dead end in their plando connections.") else: raise Exception(f"{player_name} paired a dead end to a dead end in their " - "plando connections.") + f"plando connections -- {connection.entrance} to {connection.exit}") for portal in dead_ends: if p_entrance == portal.name: portal1 = portal + dead_ends.remove(portal1) break - if not portal1: - raise Exception(f"Could not find entrance named {p_entrance} for " - f"plando connections in {player_name}'s YAML.") - dead_ends.remove(portal1) + else: + if p_entrance.startswith("Shop Portal "): + portal_num = int(p_entrance.split("Shop Portal ")[-1]) + # shops 1-6 are south, 7 and 8 are east, and after that it just breaks direction pairs + if portal_num <= 6: + pdir = Direction.south + elif portal_num in [7, 8]: + pdir = Direction.east + else: + pdir = Direction.none + portal1 = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=pdir) + connected_shop_portal1s.add(portal_num) + if portal_num not in world.used_shop_numbers: + create_shop_region(world, regions, portal_num) + world.used_shop_numbers.add(portal_num) + if decoupled and portal_num not in connected_shop_portal2s: + two_plus2.append(portal1) + non_dead_end_regions.add(portal1.region) + else: + raise Exception(f"Could not find entrance named {p_entrance} for " + f"plando connections in {player_name}'s YAML.") if portal2: - two_plus.remove(portal2) + two_plus2.remove(portal2) else: for portal in dead_ends: if p_exit == portal.name: portal2 = portal + dead_ends.remove(portal2) break - # if it's not a dead end, it might be a shop - if p_exit == "Shop Portal": - portal2 = Portal(name=f"Shop Portal {world.shop_num}", region=f"Shop {world.shop_num}", - destination="Previous Region", tag="_") - create_shop_region(world, regions) - shop_count -= 1 - # need to maintain an even number of portals total - if shop_count < 0: - shop_count += 2 - # and if it's neither shop nor dead end, it just isn't correct + # if it's not a dead end, maybe it's a plando'd shop portal that doesn't normally exist else: if not portal2: - raise Exception(f"Could not find entrance named {p_exit} for " - f"plando connections in {player_name}'s YAML.\n" - f"If you are using Universal Tracker, the most likely reason for this error " - f"is that the host generated with a newer version of the APWorld.\n" - f"Please check the TUNIC Randomizer Github and place the newest APWorld in your " - f"custom_worlds folder, and remove the one in lib/worlds if there is one there.") - dead_ends.remove(portal2) + if p_exit.startswith("Shop Portal "): + portal_num = int(p_exit.split("Shop Portal ")[-1]) + if portal_num <= 6: + pdir = Direction.south + elif portal_num in [7, 8]: + pdir = Direction.east + else: + pdir = Direction.none + portal2 = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=pdir) + connected_shop_portal2s.add(portal_num) + if portal_num not in world.used_shop_numbers: + create_shop_region(world, regions, portal_num) + world.used_shop_numbers.add(portal_num) + if decoupled and portal_num not in connected_shop_portal1s: + two_plus.append(portal2) + non_dead_end_regions.add(portal2.region) + else: + raise Exception(f"Could not find entrance named {p_exit} for " + f"plando connections in {player_name}'s YAML.") - # update the traversal chart to say you can get from portal1's region to portal2's and vice versa - if not portal1_dead_end and not portal2_dead_end: - traversal_reqs.setdefault(portal1.region, dict())[portal2.region] = [] - traversal_reqs.setdefault(portal2.region, dict())[portal1.region] = [] + # if we're doing decoupled, we don't need to do complex checks + if decoupled: + # we turn any plando that uses "exit" to use "entrance" instead + traversal_reqs.setdefault(portal1.region, dict())[get_portal_outlet_region(portal2, world)] = [] + # outside decoupled, we want to use what we were doing before decoupled got added + else: + # update the traversal chart to say you can get from portal1's region to portal2's and vice versa + if not portal1_dead_end and not portal2_dead_end: + traversal_reqs.setdefault(portal1.region, dict())[get_portal_outlet_region(portal2, world)] = [] + traversal_reqs.setdefault(portal2.region, dict())[get_portal_outlet_region(portal1, world)] = [] - if (portal1.region == "Zig Skip Exit" and (portal2_dead_end or portal2.region == "Secret Gathering Place") - or portal2.region == "Zig Skip Exit" and (portal1_dead_end or portal1.region == "Secret Gathering Place")): - if world.options.entrance_rando.value not in EntranceRando.options.values(): - raise Exception(f"Tunic ER seed group {world.options.entrance_rando.value} paired a dead " - "end to a dead end in their plando connections.") - else: - raise Exception(f"{player_name} paired a dead end to a dead end in their " - "plando connections.") - - if (portal1.region == "Secret Gathering Place" and (portal2_dead_end or portal2.region == "Zig Skip Exit") - or portal2.region == "Secret Gathering Place" and (portal1_dead_end or portal1.region == "Zig Skip Exit")): - # need to make sure you didn't pair this to a dead end or zig skip - if portal1_dead_end or portal2_dead_end or \ - portal1.region == "Zig Skip Exit" or portal2.region == "Zig Skip Exit": + if (portal1.region == "Zig Skip Exit" and (portal2_dead_end or portal2.region == "Secret Gathering Place") + or portal2.region == "Zig Skip Exit" and (portal1_dead_end or portal1.region == "Secret Gathering Place")): if world.options.entrance_rando.value not in EntranceRando.options.values(): raise Exception(f"Tunic ER seed group {world.options.entrance_rando.value} paired a dead " "end to a dead end in their plando connections.") else: raise Exception(f"{player_name} paired a dead end to a dead end in their " "plando connections.") + + if (portal1.region == "Secret Gathering Place" and (portal2_dead_end or portal2.region == "Zig Skip Exit") + or portal2.region == "Secret Gathering Place" and (portal1_dead_end or portal1.region == "Zig Skip Exit")): + # need to make sure you didn't pair this to a dead end or zig skip + if portal1_dead_end or portal2_dead_end or \ + portal1.region == "Zig Skip Exit" or portal2.region == "Zig Skip Exit": + if world.options.entrance_rando.value not in EntranceRando.options.values(): + raise Exception(f"Tunic ER seed group {world.options.entrance_rando.value} paired a dead " + "end to a dead end in their plando connections.") + else: + raise Exception(f"{player_name} paired a dead end to a dead end in their " + "plando connections.") + # okay now that we're done with all of that nonsense, we can finally make the portal pair portal_pairs[portal1] = portal2 + if portal1_dead_end: + dead_end_direction_tracker[portal1.direction] -= 1 + else: + two_plus_direction_tracker[portal1.direction] -= 1 + if portal2_dead_end: + dead_end_direction_tracker[portal2.direction] -= 1 + else: + two_plus_direction_tracker[portal2.direction] -= 1 + # if we have plando connections, our connected regions may change somewhat connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) - if fixed_shop and not world.using_ut: - portal1 = None + # if there are an odd number of shops after plando, add another one, except in decoupled where it doesn't matter + if not decoupled and len(world.used_shop_numbers) % 2 == 1: + if entrance_layout == EntranceLayout.option_direction_pairs: + raise Exception(f"TUNIC: {world.player_name} plando'd too many shops for the Direction Pairs option.") + portal_num = get_shop_num(world) + shop_portal = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=Direction.none) + create_shop_region(world, regions, portal_num) + dead_ends.append(shop_portal) + + if entrance_layout == EntranceLayout.option_fixed_shop and not world.using_ut: + windmill = None for portal in two_plus: if portal.scene_destination() == "Overworld Redux, Windmill_": - portal1 = portal + windmill = portal break - if not portal1: - raise Exception(f"Failed to do Fixed Shop option. " - f"Did {player_name} plando connection the Windmill Shop entrance?") + if not windmill: + raise Exception(f"Failed to do Fixed Shop option for Entrance Layout. " + f"Did {player_name} plando the Windmill Shop entrance?") - portal2 = Portal(name=f"Shop Portal {world.shop_num}", region=f"Shop {world.shop_num}", - destination="Previous Region", tag="_") - create_shop_region(world, regions) + portal_num = get_shop_num(world) + shop = Portal(name=f"Shop Portal {portal_num}", region=f"Shop {portal_num}", + destination=str(portal_num), tag="_", direction=Direction.south) + create_shop_region(world, regions, portal_num) - portal_pairs[portal1] = portal2 - two_plus.remove(portal1) + portal_pairs[windmill] = shop + two_plus.remove(windmill) + if decoupled: + two_plus.append(shop) + non_dead_end_regions.add(shop.region) + connected_regions.add(shop.region) - random_object: Random = world.random # use the seed given in the options to shuffle the portals if isinstance(world.options.entrance_rando.value, str): random_object = Random(world.options.entrance_rando.value) + else: + random_object: Random = world.random + # we want to start by making sure every region is accessible random_object.shuffle(two_plus) - check_success = 0 + + # this is a backup in case we run into that rare direction pairing failure + # so that we don't have to redo the plando bit basically + backup_connected_regions = connected_regions.copy() + backup_portal_pairs = portal_pairs.copy() + backup_two_plus = two_plus.copy() + backup_two_plus_direction_tracker = two_plus_direction_tracker.copy() + rare_failure_count = 0 + portal1 = None portal2 = None previous_conn_num = 0 @@ -403,96 +577,182 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # should, hopefully, only ever occur if someone plandos connections poorly if previous_conn_num == len(connected_regions): fail_count += 1 - if fail_count >= 500: + if fail_count > 500: raise Exception(f"Failed to pair regions. Check plando connections for {player_name} for errors. " - "Unconnected regions:", non_dead_end_regions - connected_regions) + f"Unconnected regions: {non_dead_end_regions - connected_regions}.\n" + f"Unconnected portals: {[portal.name for portal in two_plus]}") + if (fail_count > 100 and not decoupled + and (world.options.entrance_layout == EntranceLayout.option_direction_pairs or waterfall_plando)): + # in direction pairs, we may run into a case where we run out of pairable directions + # since we need to ensure the dead ends will have something to connect to + # or if fairy cave is plando'd, it may run into an issue where it is trying to get access to 2 separate + # areas at once to give access to laurels + # so, this is basically just resetting entrance pairing + # this should be very rare, so this fail-safe shouldn't be covering up for an actual solution + # this should never happen in decoupled, since it's entirely too flexible for that + portal_pairs = backup_portal_pairs.copy() + two_plus = two_plus2 = backup_two_plus.copy() + two_plus_direction_tracker = backup_two_plus_direction_tracker.copy() + random_object.shuffle(two_plus) + connected_regions = backup_connected_regions.copy() + rare_failure_count += 1 + fail_count = 0 + + if rare_failure_count > 100: + raise Exception(f"Failed to pair regions due to rare pairing issues for {player_name}. " + f"Unconnected regions: {non_dead_end_regions - connected_regions}.\n" + f"Unconnected portals: {[portal.name for portal in two_plus]}") else: fail_count = 0 previous_conn_num = len(connected_regions) # find a portal in a connected region - if check_success == 0: - for portal in two_plus: - if portal.region in connected_regions: - portal1 = portal - two_plus.remove(portal) - check_success = 1 - break + for portal in two_plus: + if portal.region in connected_regions: + # if there's more dead ends of a direction than two plus of the opposite direction, + # then we'll run out of viable connections for those dead ends later + # decoupled does not have this issue since dead ends aren't real in decoupled + if not decoupled and entrance_layout == EntranceLayout.option_direction_pairs: + if not too_few_portals_for_direction_pairs(portal.direction, 0): + continue - # then we find a portal in an inaccessible region - if check_success == 1: - for portal in two_plus: - if portal.region not in connected_regions: - # if secret gathering place happens to get paired really late, you can end up running out - if not has_laurels and len(two_plus) < 80: - # if you plando'd secret gathering place with laurels at 10 fairies, you're the reason for this - if waterfall_plando: - cr = connected_regions.copy() - cr.add(portal.region) - if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, logic_tricks): - continue - # if not waterfall_plando, then we just want to pair secret gathering place now - elif portal.region != "Secret Gathering Place": + portal1 = portal + two_plus.remove(portal) + break + if not portal1: + raise Exception("TUNIC: Failed to pair portals at first part of first phase.") + + # then we find a portal in an unconnected region + for portal in two_plus2: + if portal.region not in connected_regions: + # if secret gathering place happens to get paired really late, you can end up running out + if not has_laurels and len(two_plus2) < 80: + # if you plando'd secret gathering place with laurels at 10 fairies, you're the reason for this + if waterfall_plando: + cr = connected_regions.copy() + cr.add(portal.region) + if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, logic_tricks): continue - portal2 = portal - connected_regions.add(portal.region) - two_plus.remove(portal) - check_success = 2 - break + # if not waterfall_plando, then we just want to pair secret gathering place now + elif portal.region != "Secret Gathering Place": + continue + + # if they're not facing opposite directions, just continue + if entrance_layout == EntranceLayout.option_direction_pairs and not verify_direction_pair(portal, portal1): + continue + + # if you have direction pairs, we need to make sure we don't run out of spots for problem portals + # this cuts down on using the failsafe significantly + if not decoupled and entrance_layout == EntranceLayout.option_direction_pairs: + should_continue = False + # these portals are weird since they're one-ways essentially + # we need to make sure they are connected in this first phase + south_problems = ["Ziggurat Upper to Ziggurat Entry Hallway", + "Ziggurat Tower to Ziggurat Upper", "Forest Belltower to Guard Captain Room"] + if (portal.direction == Direction.south and portal.name not in south_problems + and not too_few_portals_for_direction_pairs(portal.direction, 3)): + for test_portal in two_plus: + if test_portal.name in south_problems: + should_continue = True + # at risk of connecting frog's domain entry ladder to librarian exit + if (portal.direction == Direction.ladder_down + or portal.direction == Direction.ladder_up and portal.name != "Frog's Domain Ladder Exit" + and not too_few_portals_for_direction_pairs(portal.direction, 1)): + for test_portal in two_plus: + if test_portal.name == "Frog's Domain Ladder Exit": + should_continue = True + if should_continue: + continue + + portal2 = portal + connected_regions.add(get_portal_outlet_region(portal, world)) + two_plus2.remove(portal) + break + + if not portal2: + if entrance_layout == EntranceLayout.option_direction_pairs or waterfall_plando: + # portal1 doesn't have a valid direction pair yet, throw it back and start over + two_plus.append(portal1) + continue + else: + raise Exception(f"TUNIC: Failed to pair portals at second part of first phase for {world.player_name}.") # once we have both portals, connect them and add the new region(s) to connected_regions - if check_success == 2: - if "Secret Gathering Place" in connected_regions: - has_laurels = True - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) - portal_pairs[portal1] = portal2 - check_success = 0 - random_object.shuffle(two_plus) + if not has_laurels and "Secret Gathering Place" in connected_regions: + has_laurels = True + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) - # for universal tracker, we want to skip shop gen - if world.using_ut: - shop_count = 0 - - for i in range(shop_count): - portal1 = two_plus.pop() - if portal1 is None: - raise Exception("TUNIC: Too many shops in the pool, or something else went wrong.") - portal2 = Portal(name=f"Shop Portal {world.shop_num}", region=f"Shop {world.shop_num}", - destination="Previous Region", tag="_") - create_shop_region(world, regions) - portal_pairs[portal1] = portal2 + two_plus_direction_tracker[portal1.direction] -= 1 + two_plus_direction_tracker[portal2.direction] -= 1 + portal1 = None + portal2 = None + random_object.shuffle(two_plus) + if two_plus != two_plus2: + random_object.shuffle(two_plus2) # connect dead ends to random non-dead ends - # none of the key events are in dead ends, so we don't need to do gate_before_switch + # there are no dead ends in decoupled while len(dead_ends) > 0: if world.using_ut: break - portal1 = two_plus.pop() - portal2 = dead_ends.pop() - portal_pairs[portal1] = portal2 + portal2 = dead_ends[0] + for portal in two_plus: + if entrance_layout == EntranceLayout.option_direction_pairs and not verify_direction_pair(portal, portal2): + continue + if entrance_layout == EntranceLayout.option_fixed_shop and portal.region == "Zig Skip Exit": + continue + portal1 = portal + portal_pairs[portal1] = portal2 + two_plus.remove(portal1) + dead_ends.remove(portal2) + break + else: + raise Exception(f"Failed to pair {portal2.name} with anything in two_plus for player {world.player_name}.") + # then randomly connect the remaining portals to each other - # every region is accessible, so gate_before_switch is not necessary - while len(two_plus) > 1: + final_pair_number = 0 + while len(two_plus) > 0: if world.using_ut: break - portal1 = two_plus.pop() - portal2 = two_plus.pop() + final_pair_number += 1 + if final_pair_number > 10000: + raise Exception(f"Failed to pair portals while pairing the final entrances off to each other. " + f"Remaining portals in two_plus: {[portal.name for portal in two_plus]}. " + f"Remaining portals in two_plus2: {[portal.name for portal in two_plus2]}.") + portal1 = two_plus[0] + two_plus.remove(portal1) + portal2 = None + if entrance_layout != EntranceLayout.option_direction_pairs: + portal2 = two_plus2.pop() + else: + for portal in two_plus2: + if verify_direction_pair(portal1, portal): + portal2 = portal + two_plus2.remove(portal2) + break + if portal2 is None: + raise Exception("Something went wrong with the remaining two plus portals. Contact the TUNIC rando devs.") portal_pairs[portal1] = portal2 - if len(two_plus) == 1: - raise Exception("two plus had an odd number of portals, investigate this. last portal is " + two_plus[0].name) + if len(two_plus2) > 0: + raise Exception(f"TUNIC: Something went horribly wrong in ER for {world.player_name}. " + f"Please contact the TUNIC rando devs.") return portal_pairs # loop through our list of paired portals and make two-way connections -def create_randomized_entrances(portal_pairs: Dict[Portal, Portal], regions: Dict[str, Region]) -> None: +def create_randomized_entrances(world: "TunicWorld", portal_pairs: Dict[Portal, Portal], regions: Dict[str, Region]) -> None: for portal1, portal2 in portal_pairs.items(): - region1 = regions[portal1.region] - region2 = regions[portal2.region] - region1.connect(connecting_region=region2, name=portal1.name) - region2.connect(connecting_region=region1, name=portal2.name) + # connect to the outlet region if there is one, if not connect to the actual region + regions[portal1.region].connect( + connecting_region=regions[get_portal_outlet_region(portal2, world)], + name=portal1.name) + if not world.options.decoupled or not world.options.entrance_rando: + regions[portal2.region].connect( + connecting_region=regions[get_portal_outlet_region(portal1, world)], + name=portal2.name) def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[str, Dict[str, List[List[str]]]], @@ -541,22 +801,58 @@ def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[s return connected_regions +# which directions are opposites +direction_pairs: Dict[int, int] = { + Direction.north: Direction.south, + Direction.south: Direction.north, + Direction.east: Direction.west, + Direction.west: Direction.east, + Direction.ladder_up: Direction.ladder_down, + Direction.ladder_down: Direction.ladder_up, + Direction.floor: Direction.floor, +} + + +# verify that two portals are in compatible directions +def verify_direction_pair(portal1: Portal, portal2: Portal) -> bool: + return portal1.direction == direction_pairs[portal2.direction] + + +# verify that two plando'd portals are in compatible directions +def verify_plando_directions(connection: PlandoConnection) -> bool: + entrance_portal = None + exit_portal = None + for portal in portal_mapping: + if connection.entrance == portal.name: + entrance_portal = portal + if connection.exit == portal.name: + exit_portal = portal + if entrance_portal and exit_portal: + break + # neither of these are shops, so verify the pair + if entrance_portal and exit_portal: + return verify_direction_pair(entrance_portal, exit_portal) + # this is two shop portals, they can never pair directions + elif not entrance_portal and not exit_portal: + return False + # if one of them is none, it's a shop, which has two possible directions + elif not entrance_portal: + return exit_portal.direction in [Direction.north, Direction.east] + elif not exit_portal: + return entrance_portal.direction in [Direction.north, Direction.east] + else: + # shouldn't be reachable, more of a just in case + raise Exception("Something went very wrong with verify_plando_directions") + + # sort the portal dict by the name of the first portal, referring to the portal order in the master portal list -def sort_portals(portal_pairs: Dict[Portal, Portal]) -> Dict[str, str]: +def sort_portals(portal_pairs: Dict[Portal, Portal], world: "TunicWorld") -> Dict[str, str]: sorted_pairs: Dict[str, str] = {} reference_list: List[str] = [portal.name for portal in portal_mapping] - reference_list.append("Shop Portal") - # note: this is not necessary yet since the shop portals aren't numbered yet -- they will be when decoupled happens # due to plando, there can be a variable number of shops - # I could either do it like this, or just go up to like 200, this seemed better - # shop_count = 0 - # for portal1, portal2 in portal_pairs.items(): - # if portal1.name.startswith("Shop"): - # shop_count += 1 - # if portal2.name.startswith("Shop"): - # shop_count += 1 - # reference_list.extend([f"Shop Portal {i + 1}" for i in range(shop_count)]) + largest_shop_number = max(world.used_shop_numbers) + reference_list.extend([f"Shop Portal {i + 1}" for i in range(largest_shop_number)]) for name in reference_list: for portal1, portal2 in portal_pairs.items(): diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index c17b085b11..e3fed5b52d 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -5,7 +5,7 @@ from typing import Dict, Any, TYPE_CHECKING from decimal import Decimal, ROUND_HALF_UP from Options import (DefaultOnToggle, Toggle, StartInventoryPool, Choice, Range, TextChoice, PlandoConnections, - PerGameCommonOptions, OptionGroup, Visibility, NamedRange) + PerGameCommonOptions, OptionGroup, Removed, Visibility, NamedRange) from .er_data import portal_mapping if TYPE_CHECKING: from . import TunicWorld @@ -147,14 +147,42 @@ class EntranceRando(TextChoice): class FixedShop(Toggle): """ - Forces the Windmill entrance to lead to a shop, and removes the remaining shops from the pool. - Adds another entrance in Rooted Ziggurat Lower to keep an even number of entrances. - Has no effect if Entrance Rando is not enabled. + This option has been superseded by the Entrance Layout option. + If enabled, it will override the Entrance Layout option. + This is kept to keep older yamls working, and will be removed at a later date. """ + visibility = Visibility.none internal_name = "fixed_shop" display_name = "Fewer Shops in Entrance Rando" +class EntranceLayout(Choice): + """ + Decide how the Entrance Randomizer chooses how to pair the entrances. + Standard: Entrances are randomly connected. There are 6 shops in the pool with this option. + Fixed Shop: Forces the Windmill entrance to lead to a shop, and removes the other shops from the pool. + Adds another entrance in Rooted Ziggurat Lower to keep an even number of entrances. + Direction Pairs: Entrances facing opposite directions are paired together. There are 8 shops in the pool with this option. + Note: For seed groups, if one player in a group chooses Fixed Shop and another chooses Direction Pairs, it will error out. + Either of these options will override Standard within a seed group. + """ + internal_name = "entrance_layout" + display_name = "Entrance Layout" + option_standard = 0 + option_fixed_shop = 1 + option_direction_pairs = 2 + default = 0 + + +class Decoupled(Toggle): + """ + Decouple the entrances, so that when you go from one entrance to another, the return trip won't necessarily bring you back to the same place. + Note: For seed groups, all players in the group must have this option enabled or disabled. + """ + internal_name = "decoupled" + display_name = "Decoupled Entrances" + + class LaurelsLocation(Choice): """ Force the Hero's Laurels to be placed at a location in your world. @@ -210,13 +238,22 @@ class LocalFill(NamedRange): class TunicPlandoConnections(PlandoConnections): """ Generic connection plando. Format is: - - entrance: "Entrance Name" - exit: "Exit Name" + - entrance: Entrance Name + exit: Exit Name + direction: Direction percentage: 100 + Direction must be one of entrance, exit, or both, and defaults to both if omitted. + Direction entrance means the entrance leads to the exit. Direction exit means the exit leads to the entrance. + If you do not have Decoupled enabled, you do not need the direction line, as it will only use both. Percentage is an integer from 0 to 100 which determines whether that connection will be made. Defaults to 100 if omitted. + If the Entrance Layout option is set to Standard or Fixed Shop, you can plando multiple shops. + If the Entrance Layout option is set to Direction Pairs, your plando connections must be facing opposite directions. + Shop Portal 1-6 are South portals, and Shop Portal 7-8 are West portals. + This option does nothing if Entrance Rando is disabled. """ - entrances = {*(portal.name for portal in portal_mapping), "Shop", "Shop Portal"} - exits = {*(portal.name for portal in portal_mapping), "Shop", "Shop Portal"} + shops = {f"Shop Portal {i + 1}" for i in range(500)} + entrances = {portal.name for portal in portal_mapping}.union(shops) + exits = {portal.name for portal in portal_mapping}.union(shops) duplicate_exits = True @@ -329,6 +366,7 @@ class TunicOptions(PerGameCommonOptions): start_with_sword: StartWithSword keys_behind_bosses: KeysBehindBosses ability_shuffling: AbilityShuffling + fool_traps: FoolTraps laurels_location: LaurelsLocation @@ -343,7 +381,9 @@ class TunicOptions(PerGameCommonOptions): local_fill: LocalFill entrance_rando: EntranceRando - fixed_shop: FixedShop + entrance_layout: EntranceLayout + decoupled: Decoupled + plando_connections: TunicPlandoConnections combat_logic: CombatLogic lanternless: Lanternless @@ -353,9 +393,8 @@ class TunicOptions(PerGameCommonOptions): ladder_storage: LadderStorage ladder_storage_without_items: LadderStorageWithoutItems - plando_connections: TunicPlandoConnections - - logic_rules: LogicRules + fixed_shop: FixedShop # will be removed at a later date + logic_rules: Removed # fully removed in the direction pairs update tunic_option_groups = [ @@ -372,8 +411,14 @@ tunic_option_groups = [ LaurelsZips, IceGrappling, LadderStorage, - LadderStorageWithoutItems - ]) + LadderStorageWithoutItems, + ]), + OptionGroup("Entrance Randomizer", [ + EntranceRando, + EntranceLayout, + Decoupled, + TunicPlandoConnections, + ]), ] tunic_option_presets: Dict[str, Dict[str, Any]] = { diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py index 2c5abb424d..52d5c42e51 100644 --- a/worlds/tunic/rules.py +++ b/worlds/tunic/rules.py @@ -1,5 +1,4 @@ from typing import Dict, TYPE_CHECKING -from decimal import Decimal, ROUND_HALF_UP from worlds.generic.Rules import set_rule, forbid_item, add_rule from BaseClasses import CollectionState @@ -157,8 +156,8 @@ def set_region_rules(world: "TunicWorld") -> None: if options.ladder_storage >= LadderStorage.option_medium: # ls at any ladder in a safe spot in quarry to get to the monastery rope entrance - world.get_region("Quarry Back").connect(world.get_region("Monastery"), - rule=lambda state: can_ladder_storage(state, world)) + add_rule(world.get_entrance(entrance_name="Quarry Back -> Monastery"), + rule=lambda state: can_ladder_storage(state, world)) def set_location_rules(world: "TunicWorld") -> None: diff --git a/worlds/tunic/test/test_access.py b/worlds/tunic/test/test_access.py index 24551a13d5..6a26180cf0 100644 --- a/worlds/tunic/test/test_access.py +++ b/worlds/tunic/test/test_access.py @@ -78,7 +78,8 @@ class TestERSpecial(TunicTestBase): options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true, options.HexagonQuest.internal_name: options.HexagonQuest.option_false, - options.FixedShop.internal_name: options.FixedShop.option_false, + options.CombatLogic.internal_name: options.CombatLogic.option_off, + options.EntranceLayout.internal_name: options.EntranceLayout.option_fixed_shop, options.IceGrappling.internal_name: options.IceGrappling.option_easy, "plando_connections": [ { @@ -126,3 +127,262 @@ class TestLadderStorage(TunicTestBase): self.assertFalse(self.can_reach_location("Fortress Courtyard - Page Near Cave")) self.collect_by_name(["Pages 24-25 (Prayer)"]) self.assertTrue(self.can_reach_location("Fortress Courtyard - Page Near Cave")) + + +# check that it still functions if in decoupled and every single normal entrance leads to a shop +class TestERDecoupledPlando(TunicTestBase): + options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, + options.Decoupled.internal_name: options.Decoupled.option_true, + "plando_connections": [ + {"entrance": "Stick House Entrance", "exit": "Shop Portal 1", "direction": "entrance"}, + {"entrance": "Windmill Entrance", "exit": "Shop Portal 2", "direction": "entrance"}, + {"entrance": "Well Ladder Entrance", "exit": "Shop Portal 3", "direction": "entrance"}, + {"entrance": "Entrance to Well from Well Rail", "exit": "Shop Portal 4", "direction": "entrance"}, + {"entrance": "Old House Door Entrance", "exit": "Shop Portal 5", "direction": "entrance"}, + {"entrance": "Old House Waterfall Entrance", "exit": "Shop Portal 6", "direction": "entrance"}, + {"entrance": "Entrance to Furnace from Well Rail", "exit": "Shop Portal 7", "direction": "entrance"}, + {"entrance": "Entrance to Furnace under Windmill", "exit": "Shop Portal 8", "direction": "entrance"}, + {"entrance": "Entrance to Furnace near West Garden", "exit": "Shop Portal 9", + "direction": "entrance"}, + {"entrance": "Entrance to Furnace from Beach", "exit": "Shop Portal 10", "direction": "entrance"}, + {"entrance": "Caustic Light Cave Entrance", "exit": "Shop Portal 11", "direction": "entrance"}, + {"entrance": "Swamp Upper Entrance", "exit": "Shop Portal 12", "direction": "entrance"}, + {"entrance": "Swamp Lower Entrance", "exit": "Shop Portal 13", "direction": "entrance"}, + {"entrance": "Ruined Passage Not-Door Entrance", "exit": "Shop Portal 14", "direction": "entrance"}, + {"entrance": "Ruined Passage Door Entrance", "exit": "Shop Portal 15", "direction": "entrance"}, + {"entrance": "Atoll Upper Entrance", "exit": "Shop Portal 16", "direction": "entrance"}, + {"entrance": "Atoll Lower Entrance", "exit": "Shop Portal 17", "direction": "entrance"}, + {"entrance": "Special Shop Entrance", "exit": "Shop Portal 18", "direction": "entrance"}, + {"entrance": "Maze Cave Entrance", "exit": "Shop Portal 19", "direction": "entrance"}, + {"entrance": "West Garden Entrance near Belltower", "exit": "Shop Portal 20", + "direction": "entrance"}, + {"entrance": "West Garden Entrance from Furnace", "exit": "Shop Portal 21", "direction": "entrance"}, + {"entrance": "West Garden Laurels Entrance", "exit": "Shop Portal 22", "direction": "entrance"}, + {"entrance": "Temple Door Entrance", "exit": "Shop Portal 23", "direction": "entrance"}, + {"entrance": "Temple Rafters Entrance", "exit": "Shop Portal 24", "direction": "entrance"}, + {"entrance": "Ruined Shop Entrance", "exit": "Shop Portal 25", "direction": "entrance"}, + {"entrance": "Patrol Cave Entrance", "exit": "Shop Portal 26", "direction": "entrance"}, + {"entrance": "Hourglass Cave Entrance", "exit": "Shop Portal 27", "direction": "entrance"}, + {"entrance": "Changing Room Entrance", "exit": "Shop Portal 28", "direction": "entrance"}, + {"entrance": "Cube Cave Entrance", "exit": "Shop Portal 29", "direction": "entrance"}, + {"entrance": "Stairs from Overworld to Mountain", "exit": "Shop Portal 30", "direction": "entrance"}, + {"entrance": "Overworld to Fortress", "exit": "Shop Portal 31", "direction": "entrance"}, + {"entrance": "Fountain HC Door Entrance", "exit": "Shop Portal 32", "direction": "entrance"}, + {"entrance": "Southeast HC Door Entrance", "exit": "Shop Portal 33", "direction": "entrance"}, + {"entrance": "Overworld to Quarry Connector", "exit": "Shop Portal 34", "direction": "entrance"}, + {"entrance": "Dark Tomb Main Entrance", "exit": "Shop Portal 35", "direction": "entrance"}, + {"entrance": "Overworld to Forest Belltower", "exit": "Shop Portal 36", "direction": "entrance"}, + {"entrance": "Town to Far Shore", "exit": "Shop Portal 37", "direction": "entrance"}, + {"entrance": "Spawn to Far Shore", "exit": "Shop Portal 38", "direction": "entrance"}, + {"entrance": "Secret Gathering Place Entrance", "exit": "Shop Portal 39", "direction": "entrance"}, + {"entrance": "Secret Gathering Place Exit", "exit": "Shop Portal 40", "direction": "entrance"}, + {"entrance": "Windmill Exit", "exit": "Shop Portal 41", "direction": "entrance"}, + {"entrance": "Windmill Shop", "exit": "Shop Portal 42", "direction": "entrance"}, + {"entrance": "Old House Door Exit", "exit": "Shop Portal 43", "direction": "entrance"}, + {"entrance": "Old House to Glyph Tower", "exit": "Shop Portal 44", "direction": "entrance"}, + {"entrance": "Old House Waterfall Exit", "exit": "Shop Portal 45", "direction": "entrance"}, + {"entrance": "Glyph Tower Exit", "exit": "Shop Portal 46", "direction": "entrance"}, + {"entrance": "Changing Room Exit", "exit": "Shop Portal 47", "direction": "entrance"}, + {"entrance": "Fountain HC Room Exit", "exit": "Shop Portal 48", "direction": "entrance"}, + {"entrance": "Cube Cave Exit", "exit": "Shop Portal 49", "direction": "entrance"}, + {"entrance": "Guard Patrol Cave Exit", "exit": "Shop Portal 50", "direction": "entrance"}, + {"entrance": "Ruined Shop Exit", "exit": "Shop Portal 51", "direction": "entrance"}, + {"entrance": "Furnace Exit towards Well", "exit": "Shop Portal 52", "direction": "entrance"}, + {"entrance": "Furnace Exit to Dark Tomb", "exit": "Shop Portal 53", "direction": "entrance"}, + {"entrance": "Furnace Exit towards West Garden", "exit": "Shop Portal 54", "direction": "entrance"}, + {"entrance": "Furnace Exit to Beach", "exit": "Shop Portal 55", "direction": "entrance"}, + {"entrance": "Furnace Exit under Windmill", "exit": "Shop Portal 56", "direction": "entrance"}, + {"entrance": "Stick House Exit", "exit": "Shop Portal 57", "direction": "entrance"}, + {"entrance": "Ruined Passage Not-Door Exit", "exit": "Shop Portal 58", "direction": "entrance"}, + {"entrance": "Ruined Passage Door Exit", "exit": "Shop Portal 59", "direction": "entrance"}, + {"entrance": "Southeast HC Room Exit", "exit": "Shop Portal 60", "direction": "entrance"}, + {"entrance": "Caustic Light Cave Exit", "exit": "Shop Portal 61", "direction": "entrance"}, + {"entrance": "Maze Cave Exit", "exit": "Shop Portal 62", "direction": "entrance"}, + {"entrance": "Hourglass Cave Exit", "exit": "Shop Portal 63", "direction": "entrance"}, + {"entrance": "Special Shop Exit", "exit": "Shop Portal 64", "direction": "entrance"}, + {"entrance": "Temple Rafters Exit", "exit": "Shop Portal 65", "direction": "entrance"}, + {"entrance": "Temple Door Exit", "exit": "Shop Portal 66", "direction": "entrance"}, + {"entrance": "Forest Belltower to Fortress", "exit": "Shop Portal 67", "direction": "entrance"}, + {"entrance": "Forest Belltower to Forest", "exit": "Shop Portal 68", "direction": "entrance"}, + {"entrance": "Forest Belltower to Overworld", "exit": "Shop Portal 69", "direction": "entrance"}, + {"entrance": "Forest Belltower to Guard Captain Room", "exit": "Shop Portal 70", + "direction": "entrance"}, + {"entrance": "Forest to Belltower", "exit": "Shop Portal 71", "direction": "entrance"}, + {"entrance": "Forest Guard House 1 Lower Entrance", "exit": "Shop Portal 72", + "direction": "entrance"}, + {"entrance": "Forest Guard House 1 Gate Entrance", "exit": "Shop Portal 73", + "direction": "entrance"}, + {"entrance": "Forest Dance Fox Outside Doorway", "exit": "Shop Portal 74", "direction": "entrance"}, + {"entrance": "Forest to Far Shore", "exit": "Shop Portal 75", "direction": "entrance"}, + {"entrance": "Forest Guard House 2 Lower Entrance", "exit": "Shop Portal 76", + "direction": "entrance"}, + {"entrance": "Forest Guard House 2 Upper Entrance", "exit": "Shop Portal 77", + "direction": "entrance"}, + {"entrance": "Forest Grave Path Lower Entrance", "exit": "Shop Portal 78", "direction": "entrance"}, + {"entrance": "Forest Grave Path Upper Entrance", "exit": "Shop Portal 79", "direction": "entrance"}, + {"entrance": "Forest Grave Path Upper Exit", "exit": "Shop Portal 80", "direction": "entrance"}, + {"entrance": "Forest Grave Path Lower Exit", "exit": "Shop Portal 81", "direction": "entrance"}, + {"entrance": "East Forest Hero's Grave", "exit": "Shop Portal 82", "direction": "entrance"}, + {"entrance": "Guard House 1 Dance Fox Exit", "exit": "Shop Portal 83", "direction": "entrance"}, + {"entrance": "Guard House 1 Lower Exit", "exit": "Shop Portal 84", "direction": "entrance"}, + {"entrance": "Guard House 1 Upper Forest Exit", "exit": "Shop Portal 85", "direction": "entrance"}, + {"entrance": "Guard House 1 to Guard Captain Room", "exit": "Shop Portal 86", + "direction": "entrance"}, + {"entrance": "Guard House 2 Lower Exit", "exit": "Shop Portal 87", "direction": "entrance"}, + {"entrance": "Guard House 2 Upper Exit", "exit": "Shop Portal 88", "direction": "entrance"}, + {"entrance": "Guard Captain Room Non-Gate Exit", "exit": "Shop Portal 89", "direction": "entrance"}, + {"entrance": "Guard Captain Room Gate Exit", "exit": "Shop Portal 90", "direction": "entrance"}, + {"entrance": "Well Ladder Exit", "exit": "Shop Portal 91", "direction": "entrance"}, + {"entrance": "Well to Well Boss", "exit": "Shop Portal 92", "direction": "entrance"}, + {"entrance": "Well Exit towards Furnace", "exit": "Shop Portal 93", "direction": "entrance"}, + {"entrance": "Well Boss to Well", "exit": "Shop Portal 94", "direction": "entrance"}, + {"entrance": "Checkpoint to Dark Tomb", "exit": "Shop Portal 95", "direction": "entrance"}, + {"entrance": "Dark Tomb to Overworld", "exit": "Shop Portal 96", "direction": "entrance"}, + {"entrance": "Dark Tomb to Furnace", "exit": "Shop Portal 97", "direction": "entrance"}, + {"entrance": "Dark Tomb to Checkpoint", "exit": "Shop Portal 98", "direction": "entrance"}, + {"entrance": "West Garden Exit near Hero's Grave", "exit": "Shop Portal 99", + "direction": "entrance"}, + {"entrance": "West Garden to Magic Dagger House", "exit": "Shop Portal 100", + "direction": "entrance"}, + {"entrance": "West Garden Exit after Boss", "exit": "Shop Portal 101", "direction": "entrance"}, + {"entrance": "West Garden Shop", "exit": "Shop Portal 102", "direction": "entrance"}, + {"entrance": "West Garden Laurels Exit", "exit": "Shop Portal 103", "direction": "entrance"}, + {"entrance": "West Garden Hero's Grave", "exit": "Shop Portal 104", "direction": "entrance"}, + {"entrance": "West Garden to Far Shore", "exit": "Shop Portal 105", "direction": "entrance"}, + {"entrance": "Magic Dagger House Exit", "exit": "Shop Portal 106", "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Fortress Grave Path Lower", "exit": "Shop Portal 107", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Fortress Grave Path Upper", "exit": "Shop Portal 108", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Fortress Interior", "exit": "Shop Portal 109", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to East Fortress", "exit": "Shop Portal 110", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Beneath the Vault", "exit": "Shop Portal 111", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Forest Belltower", "exit": "Shop Portal 112", + "direction": "entrance"}, + {"entrance": "Fortress Courtyard to Overworld", "exit": "Shop Portal 113", "direction": "entrance"}, + {"entrance": "Fortress Courtyard Shop", "exit": "Shop Portal 114", "direction": "entrance"}, + {"entrance": "Beneath the Vault to Fortress Interior", "exit": "Shop Portal 115", + "direction": "entrance"}, + {"entrance": "Beneath the Vault to Fortress Courtyard", "exit": "Shop Portal 116", + "direction": "entrance"}, + {"entrance": "Fortress Interior Main Exit", "exit": "Shop Portal 117", "direction": "entrance"}, + {"entrance": "Fortress Interior to Beneath the Earth", "exit": "Shop Portal 118", + "direction": "entrance"}, + {"entrance": "Fortress Interior to Siege Engine Arena", "exit": "Shop Portal 119", + "direction": "entrance"}, + {"entrance": "Fortress Interior Shop", "exit": "Shop Portal 120", "direction": "entrance"}, + {"entrance": "Fortress Interior to East Fortress Upper", "exit": "Shop Portal 121", + "direction": "entrance"}, + {"entrance": "Fortress Interior to East Fortress Lower", "exit": "Shop Portal 122", + "direction": "entrance"}, + {"entrance": "East Fortress to Interior Lower", "exit": "Shop Portal 123", "direction": "entrance"}, + {"entrance": "East Fortress to Courtyard", "exit": "Shop Portal 124", "direction": "entrance"}, + {"entrance": "East Fortress to Interior Upper", "exit": "Shop Portal 125", "direction": "entrance"}, + {"entrance": "Fortress Grave Path Lower Exit", "exit": "Shop Portal 126", "direction": "entrance"}, + {"entrance": "Fortress Hero's Grave", "exit": "Shop Portal 127", "direction": "entrance"}, + {"entrance": "Fortress Grave Path Upper Exit", "exit": "Shop Portal 128", "direction": "entrance"}, + {"entrance": "Fortress Grave Path Dusty Entrance", "exit": "Shop Portal 129", + "direction": "entrance"}, + {"entrance": "Dusty Exit", "exit": "Shop Portal 130", "direction": "entrance"}, + {"entrance": "Siege Engine Arena to Fortress", "exit": "Shop Portal 131", "direction": "entrance"}, + {"entrance": "Fortress to Far Shore", "exit": "Shop Portal 132", "direction": "entrance"}, + {"entrance": "Atoll Upper Exit", "exit": "Shop Portal 133", "direction": "entrance"}, + {"entrance": "Atoll Lower Exit", "exit": "Shop Portal 134", "direction": "entrance"}, + {"entrance": "Atoll Shop", "exit": "Shop Portal 135", "direction": "entrance"}, + {"entrance": "Atoll to Far Shore", "exit": "Shop Portal 136", "direction": "entrance"}, + {"entrance": "Atoll Statue Teleporter", "exit": "Shop Portal 137", "direction": "entrance"}, + {"entrance": "Frog Stairs Eye Entrance", "exit": "Shop Portal 138", "direction": "entrance"}, + {"entrance": "Frog Stairs Mouth Entrance", "exit": "Shop Portal 139", "direction": "entrance"}, + {"entrance": "Frog Stairs Eye Exit", "exit": "Shop Portal 140", "direction": "entrance"}, + {"entrance": "Frog Stairs Mouth Exit", "exit": "Shop Portal 141", "direction": "entrance"}, + {"entrance": "Frog Stairs to Frog's Domain's Entrance", "exit": "Shop Portal 142", + "direction": "entrance"}, + {"entrance": "Frog Stairs to Frog's Domain's Exit", "exit": "Shop Portal 143", + "direction": "entrance"}, + {"entrance": "Frog's Domain Ladder Exit", "exit": "Shop Portal 144", "direction": "entrance"}, + {"entrance": "Frog's Domain Orb Exit", "exit": "Shop Portal 145", "direction": "entrance"}, + {"entrance": "Library Exterior Tree", "exit": "Shop Portal 146", "direction": "entrance"}, + {"entrance": "Library Exterior Ladder", "exit": "Shop Portal 147", "direction": "entrance"}, + {"entrance": "Library Hall Bookshelf Exit", "exit": "Shop Portal 148", "direction": "entrance"}, + {"entrance": "Library Hero's Grave", "exit": "Shop Portal 149", "direction": "entrance"}, + {"entrance": "Library Hall to Rotunda", "exit": "Shop Portal 150", "direction": "entrance"}, + {"entrance": "Library Rotunda Lower Exit", "exit": "Shop Portal 151", "direction": "entrance"}, + {"entrance": "Library Rotunda Upper Exit", "exit": "Shop Portal 152", "direction": "entrance"}, + {"entrance": "Library Lab to Rotunda", "exit": "Shop Portal 153", "direction": "entrance"}, + {"entrance": "Library to Far Shore", "exit": "Shop Portal 154", "direction": "entrance"}, + {"entrance": "Library Lab to Librarian Arena", "exit": "Shop Portal 155", "direction": "entrance"}, + {"entrance": "Librarian Arena Exit", "exit": "Shop Portal 156", "direction": "entrance"}, + {"entrance": "Stairs to Top of the Mountain", "exit": "Shop Portal 157", "direction": "entrance"}, + {"entrance": "Mountain to Quarry", "exit": "Shop Portal 158", "direction": "entrance"}, + {"entrance": "Mountain to Overworld", "exit": "Shop Portal 159", "direction": "entrance"}, + {"entrance": "Top of the Mountain Exit", "exit": "Shop Portal 160", "direction": "entrance"}, + {"entrance": "Quarry Connector to Overworld", "exit": "Shop Portal 161", "direction": "entrance"}, + {"entrance": "Quarry Connector to Quarry", "exit": "Shop Portal 162", "direction": "entrance"}, + {"entrance": "Quarry to Overworld Exit", "exit": "Shop Portal 163", "direction": "entrance"}, + {"entrance": "Quarry Shop", "exit": "Shop Portal 164", "direction": "entrance"}, + {"entrance": "Quarry to Monastery Front", "exit": "Shop Portal 165", "direction": "entrance"}, + {"entrance": "Quarry to Monastery Back", "exit": "Shop Portal 166", "direction": "entrance"}, + {"entrance": "Quarry to Mountain", "exit": "Shop Portal 167", "direction": "entrance"}, + {"entrance": "Quarry to Ziggurat", "exit": "Shop Portal 168", "direction": "entrance"}, + {"entrance": "Quarry to Far Shore", "exit": "Shop Portal 169", "direction": "entrance"}, + {"entrance": "Monastery Rear Exit", "exit": "Shop Portal 170", "direction": "entrance"}, + {"entrance": "Monastery Front Exit", "exit": "Shop Portal 171", "direction": "entrance"}, + {"entrance": "Monastery Hero's Grave", "exit": "Shop Portal 172", "direction": "entrance"}, + {"entrance": "Ziggurat Entry Hallway to Ziggurat Upper", "exit": "Shop Portal 173", + "direction": "entrance"}, + {"entrance": "Ziggurat Entry Hallway to Quarry", "exit": "Shop Portal 174", "direction": "entrance"}, + {"entrance": "Ziggurat Upper to Ziggurat Entry Hallway", "exit": "Shop Portal 175", + "direction": "entrance"}, + {"entrance": "Ziggurat Upper to Ziggurat Tower", "exit": "Shop Portal 176", "direction": "entrance"}, + {"entrance": "Ziggurat Tower to Ziggurat Upper", "exit": "Shop Portal 177", "direction": "entrance"}, + {"entrance": "Ziggurat Tower to Ziggurat Lower", "exit": "Shop Portal 178", "direction": "entrance"}, + {"entrance": "Ziggurat Lower to Ziggurat Tower", "exit": "Shop Portal 179", "direction": "entrance"}, + {"entrance": "Ziggurat Portal Room Entrance", "exit": "Shop Portal 180", "direction": "entrance"}, + {"entrance": "Ziggurat Portal Room Exit", "exit": "Shop Portal 181", "direction": "entrance"}, + {"entrance": "Ziggurat to Far Shore", "exit": "Shop Portal 182", "direction": "entrance"}, + {"entrance": "Swamp Lower Exit", "exit": "Shop Portal 183", "direction": "entrance"}, + {"entrance": "Swamp to Cathedral Main Entrance", "exit": "Shop Portal 184", "direction": "entrance"}, + {"entrance": "Swamp to Cathedral Secret Legend Room Entrance", "exit": "Shop Portal 185", + "direction": "entrance"}, + {"entrance": "Swamp to Gauntlet", "exit": "Shop Portal 186", "direction": "entrance"}, + {"entrance": "Swamp Shop", "exit": "Shop Portal 187", "direction": "entrance"}, + {"entrance": "Swamp Upper Exit", "exit": "Shop Portal 188", "direction": "entrance"}, + {"entrance": "Swamp Hero's Grave", "exit": "Shop Portal 189", "direction": "entrance"}, + {"entrance": "Cathedral Main Exit", "exit": "Shop Portal 190", "direction": "entrance"}, + {"entrance": "Cathedral Elevator", "exit": "Shop Portal 191", "direction": "entrance"}, + {"entrance": "Cathedral Secret Legend Room Exit", "exit": "Shop Portal 192", + "direction": "entrance"}, + {"entrance": "Gauntlet to Swamp", "exit": "Shop Portal 193", "direction": "entrance"}, + {"entrance": "Gauntlet Elevator", "exit": "Shop Portal 194", "direction": "entrance"}, + {"entrance": "Gauntlet Shop", "exit": "Shop Portal 195", "direction": "entrance"}, + {"entrance": "Hero's Grave to Fortress", "exit": "Shop Portal 196", "direction": "entrance"}, + {"entrance": "Hero's Grave to Monastery", "exit": "Shop Portal 197", "direction": "entrance"}, + {"entrance": "Hero's Grave to West Garden", "exit": "Shop Portal 198", "direction": "entrance"}, + {"entrance": "Hero's Grave to East Forest", "exit": "Shop Portal 199", "direction": "entrance"}, + {"entrance": "Hero's Grave to Library", "exit": "Shop Portal 200", "direction": "entrance"}, + {"entrance": "Hero's Grave to Swamp", "exit": "Shop Portal 201", "direction": "entrance"}, + {"entrance": "Far Shore to West Garden", "exit": "Shop Portal 202", "direction": "entrance"}, + {"entrance": "Far Shore to Library", "exit": "Shop Portal 203", "direction": "entrance"}, + {"entrance": "Far Shore to Quarry", "exit": "Shop Portal 204", "direction": "entrance"}, + {"entrance": "Far Shore to East Forest", "exit": "Shop Portal 205", "direction": "entrance"}, + {"entrance": "Far Shore to Fortress", "exit": "Shop Portal 206", "direction": "entrance"}, + {"entrance": "Far Shore to Atoll", "exit": "Shop Portal 207", "direction": "entrance"}, + {"entrance": "Far Shore to Ziggurat", "exit": "Shop Portal 208", "direction": "entrance"}, + {"entrance": "Far Shore to Heir", "exit": "Shop Portal 209", "direction": "entrance"}, + {"entrance": "Far Shore to Town", "exit": "Shop Portal 210", "direction": "entrance"}, + {"entrance": "Far Shore to Spawn", "exit": "Shop Portal 211", "direction": "entrance"}, + {"entrance": "Heir Arena Exit", "exit": "Shop Portal 212", "direction": "entrance"}, + {"entrance": "Purgatory Bottom Exit", "exit": "Shop Portal 213", "direction": "entrance"}, + {"entrance": "Purgatory Top Exit", "exit": "Shop Portal 214", "direction": "entrance"}, + {"entrance": "Shop Portal 215", "exit": "Shop Portal 216", "direction": "entrance"}, + {"entrance": "Shop Portal 217", "exit": "Shop Portal 218", "direction": "entrance"}, + {"entrance": "Shop Portal 219", "exit": "Shop Portal 220", "direction": "entrance"}, + {"entrance": "Shop Portal 221", "exit": "Shop Portal 222", "direction": "entrance"}, + {"entrance": "Shop Portal 223", "exit": "Shop Portal 224", "direction": "entrance"}, + {"entrance": "Shop Portal 225", "exit": "Shop Portal 226", "direction": "entrance"}, + {"entrance": "Shop Portal 227", "exit": "Shop Portal 228", "direction": "entrance"}, + {"entrance": "Shop Portal 229", "exit": "Shop Portal 230", "direction": "entrance"}, + ]} From c40214e20f6c0946506c1367270a8b07e09a11f9 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Wed, 7 May 2025 10:41:37 -0400 Subject: [PATCH 111/199] Docs: Minor Changes to apworld_dev_faq.md (#4947) Co-authored-by: qwint --- docs/apworld_dev_faq.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 6d7d23b488..6c331b849f 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -8,7 +8,11 @@ including [Contributing](contributing.md), [Adding Games](), an ### My game has a restrictive start that leads to fill errors -Hint to the Generator that an item needs to be in sphere one with local_early_items. Here, `1` represents the number of "Sword" items to attempt to place in sphere one. +A "restrictive start" here means having a combination of very few sphere 1 locations and potentially requiring more +than one item to get a player to sphere 2. + +One way to fix this is to hint to the Generator that an item needs to be in sphere one with local_early_items. +Here, `1` represents the number of "Sword" items the Generator will attempt to place in sphere one. ```py early_item_name = "Sword" self.multiworld.local_early_items[self.player][early_item_name] = 1 @@ -22,7 +26,7 @@ Some alternative ways to try to fix this problem are: --- -### I have multiple settings that change the item/location pool counts and need to balance them out +### I have multiple options that change the item/location pool counts and need to make sure I am not submitting more/fewer items than locations In an ideal situation your system for producing locations and items wouldn't leave any opportunity for them to be unbalanced. But in real, complex situations, that might be unfeasible. From 0ba9ee0695ebd809ef9e127361223cd39dbc0588 Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 7 May 2025 09:47:14 -0500 Subject: [PATCH 112/199] Docs: update line length in apworld faq doc (#4960) --- docs/apworld_dev_faq.md | 50 ++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 6c331b849f..e3e571d949 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -22,15 +22,19 @@ Some alternative ways to try to fix this problem are: * Add more locations to sphere one of your world, potentially only when there would be a restrictive start * Pre-place items yourself, such as during `create_items` * Put items into the player's starting inventory using `push_precollected` -* Raise an exception, such as an `OptionError` during `generate_early`, to disallow options that would lead to a restrictive start +* Raise an exception, such as an `OptionError` during `generate_early`, to disallow options that would lead to a + restrictive start --- ### I have multiple options that change the item/location pool counts and need to make sure I am not submitting more/fewer items than locations -In an ideal situation your system for producing locations and items wouldn't leave any opportunity for them to be unbalanced. But in real, complex situations, that might be unfeasible. +In an ideal situation your system for producing locations and items wouldn't leave any opportunity for them to be +unbalanced. But in real, complex situations, that might be unfeasible. -If that's the case, you can create extra filler based on the difference between your unfilled locations and your itempool by comparing [get_unfilled_locations](https://github.com/ArchipelagoMW/Archipelago/blob/main/BaseClasses.py#:~:text=get_unfilled_locations) to your list of items to submit +If that's the case, you can create extra filler based on the difference between your unfilled locations and your +itempool by comparing [get_unfilled_locations](https://github.com/ArchipelagoMW/Archipelago/blob/main/BaseClasses.py#:~:text=get_unfilled_locations) +to your list of items to submit Note: to use self.create_filler(), self.get_filler_item_name() should be defined to only return valid filler item names ```py @@ -43,7 +47,8 @@ for _ in range(total_locations - len(item_pool)): self.multiworld.itempool += item_pool ``` -A faster alternative to the `for` loop would be to use a [list comprehension](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions): +A faster alternative to the `for` loop would be to use a +[list comprehension](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions): ```py item_pool += [self.create_filler() for _ in range(total_locations - len(item_pool))] ``` @@ -52,24 +57,39 @@ item_pool += [self.create_filler() for _ in range(total_locations - len(item_poo ### I learned about indirect conditions in the world API document, but I want to know more. What are they and why are they necessary? -The world API document mentions how to use `multiworld.register_indirect_condition` to register indirect conditions and **when** you should use them, but not *how* they work and *why* they are necessary. This is because the explanation is quite complicated. +The world API document mentions how to use `multiworld.register_indirect_condition` to register indirect conditions and +**when** you should use them, but not *how* they work and *why* they are necessary. This is because the explanation is +quite complicated. -Region sweep (the algorithm that determines which regions are reachable) is a Breadth-First Search of the region graph. It starts from the origin region, checks entrances one by one, and adds newly reached regions and their entrances to the queue until there is nothing more to check. +Region sweep (the algorithm that determines which regions are reachable) is a Breadth-First Search of the region graph. +It starts from the origin region, checks entrances one by one, and adds newly reached regions and their entrances to +the queue until there is nothing more to check. -For performance reasons, AP only checks every entrance once. However, if an entrance's access_rule depends on region access, then the following may happen: -1. The entrance is checked and determined to be nontraversable because the region in its access_rule hasn't been reached yet during the graph search. +For performance reasons, AP only checks every entrance once. However, if an entrance's access_rule depends on region +access, then the following may happen: +1. The entrance is checked and determined to be nontraversable because the region in its access_rule hasn't been + reached yet during the graph search. 2. Then, the region in its access_rule is determined to be reachable. This entrance *would* be in logic if it were rechecked, but it won't be rechecked this cycle. -To account for this case, AP would have to recheck all entrances every time a new region is reached until no new regions are reached. +To account for this case, AP would have to recheck all entrances every time a new region is reached until no new +regions are reached. -An indirect condition is how you can manually define that a specific entrance needs to be rechecked during region sweep if a specific region is reached during it. -This keeps most of the performance upsides. Even in a game making heavy use of indirect conditions (ex: The Witness), using them is significantly faster than just "rechecking each entrance until nothing new is found". -The reason entrance access rules using `location.can_reach` and `entrance.can_reach` are also affected is because they call `region.can_reach` on their respective parent/source region. +An indirect condition is how you can manually define that a specific entrance needs to be rechecked during region sweep +if a specific region is reached during it. +This keeps most of the performance upsides. Even in a game making heavy use of indirect conditions (ex: The Witness), +using them is significantly faster than just "rechecking each entrance until nothing new is found". +The reason entrance access rules using `location.can_reach` and `entrance.can_reach` are also affected is because they +call `region.can_reach` on their respective parent/source region. -We recognize it can feel like a trap since it will not alert you when you are missing an indirect condition, and that some games have very complex access rules. -As of [PR #3682 (Core: Region handling customization)](https://github.com/ArchipelagoMW/Archipelago/pull/3682) being merged, it is possible for a world to opt out of indirect conditions entirely, instead using the system of checking each entrance whenever a region has been reached, although this does come with a performance cost. -Opting out of using indirect conditions should only be used by games that *really* need it. For most games, it should be reasonable to know all entrance → region dependencies, making indirect conditions preferred because they are much faster. +We recognize it can feel like a trap since it will not alert you when you are missing an indirect condition, +and that some games have very complex access rules. +As of [PR #3682 (Core: Region handling customization)](https://github.com/ArchipelagoMW/Archipelago/pull/3682) +being merged, it is possible for a world to opt out of indirect conditions entirely, instead using the system of +checking each entrance whenever a region has been reached, although this does come with a performance cost. +Opting out of using indirect conditions should only be used by games that *really* need it. For most games, it should +be reasonable to know all entrance → region dependencies, making indirect conditions preferred because they are +much faster. --- From 17bc184e28f3371eb352a275aaf0bdff6cb20b39 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Wed, 7 May 2025 10:59:16 -0400 Subject: [PATCH 113/199] TUNIC: Add Hidden all_random Option (#4635) --- worlds/tunic/__init__.py | 17 ++++++++++++++++- worlds/tunic/options.py | 12 ++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 7027ab1a64..cdc8f05cb9 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -1,3 +1,4 @@ +from dataclasses import fields from typing import Dict, List, Any, Tuple, TypedDict, ClassVar, Union, Set, TextIO from logging import warning from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState @@ -16,7 +17,7 @@ from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_op from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table from .combat_logic import area_data, CombatState from worlds.AutoWorld import WebWorld, World -from Options import PlandoConnection, OptionError +from Options import PlandoConnection, OptionError, PerGameCommonOptions, Removed, Range from settings import Group, Bool @@ -120,6 +121,20 @@ class TunicWorld(World): raise Exception("You have a TUNIC APWorld in your lib/worlds folder and custom_worlds folder.\n" "This would cause an error at the end of generation.\n" "Please remove one of them, most likely the one in lib/worlds.") + + if self.options.all_random: + for option_name in (attr.name for attr in fields(TunicOptions) + if attr not in fields(PerGameCommonOptions)): + option = getattr(self.options, option_name) + if option_name == "all_random": + continue + if isinstance(option, Removed): + continue + if option.supports_weighting: + if isinstance(option, Range): + option.value = self.random.randint(option.range_start, option.range_end) + else: + option.value = self.random.choice(list(option.name_lookup)) check_options(self) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index e3fed5b52d..09e2d1d604 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -332,6 +332,16 @@ class LadderStorageWithoutItems(Toggle): display_name = "Ladder Storage without Items" +class HiddenAllRandom(Toggle): + """ + Sets all options that can be random to random. + For test gens. + """ + internal_name = "all_random" + display_name = "All Random Debug" + visibility = Visibility.none + + class LogicRules(Choice): """ This option has been superseded by the individual trick options. @@ -392,6 +402,8 @@ class TunicOptions(PerGameCommonOptions): ice_grappling: IceGrappling ladder_storage: LadderStorage ladder_storage_without_items: LadderStorageWithoutItems + + all_random: HiddenAllRandom fixed_shop: FixedShop # will be removed at a later date logic_rules: Removed # fully removed in the direction pairs update From dffde64079860ed815b266b9d957d643ef45bbaf Mon Sep 17 00:00:00 2001 From: Ixrec Date: Wed, 7 May 2025 17:20:21 +0100 Subject: [PATCH 114/199] Docs: add a "soft logic" question to apworld_dev_faq.md (#4953) * add a "soft logic" question to apworld_dev_faq.md * Update apworld_dev_faq.md * Update docs/apworld_dev_faq.md Co-authored-by: Scipio Wright * Update docs/apworld_dev_faq.md Co-authored-by: Scipio Wright * add a reminder about progression and how it influences soft logic implementations --------- Co-authored-by: Scipio Wright --- docs/apworld_dev_faq.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index e3e571d949..50bee148c6 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -109,3 +109,16 @@ Common situations where this can happen include: Also, consider using the `options.as_dict("option_name", "option_two")` helper. * Using enums as Location/Item names in the datapackage. When building out `location_name_to_id` and `item_name_to_id`, make sure that you are not using your enum class for either the names or ids in these mappings. + +--- + +### Some locations are technically possible to check with few or no items, but they'd be very tedious or frustrating. How do worlds deal with this? + +Sometimes the game can be modded to skip these locations or make them less tedious. But when this issue is due to a fundamental aspect of the game, then the general answer is "soft logic" (and its subtypes like "combat logic", "money logic", etc.). For example: you can logically require that a player have several helpful items before fighting the final boss, even if a skilled player technically needs no items to beat it. Randomizer logic should describe what's *fun* rather than what's technically possible. + +Concrete examples of soft logic include: +- Defeating a boss might logically require health upgrades, damage upgrades, certain weapons, etc. that aren't strictly necessary. +- Entering a high-level area might logically require access to enough other parts of the game that checking other locations should naturally get the player to the soft-required level. +- Buying expensive shop items might logically require access to a place where you can quickly farm money, or logically require access to enough parts of the game that checking other locations should naturally generate enough money without grinding. + +Remember that all items referenced by logic (however hard or soft) must be `progression`. Since you typically don't want to turn a ton of `filler` items into `progression` just for this, it's common to e.g. write money logic using only the rare "$100" item, so the dozens of "$1" and "$10" items in your world can remain `filler`. From 1ee8e339af92130bb42c74aaec93de7abc1e5742 Mon Sep 17 00:00:00 2001 From: Benjamin S Wolf Date: Wed, 7 May 2025 09:51:26 -0700 Subject: [PATCH 115/199] Launcher: Warn if there is no File Browser (#4275) --- Launcher.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Launcher.py b/Launcher.py index 859ebf0f76..594286fac5 100644 --- a/Launcher.py +++ b/Launcher.py @@ -84,12 +84,16 @@ def browse_files(): def open_folder(folder_path): if is_linux: exe = which('xdg-open') or which('gnome-open') or which('kde-open') - subprocess.Popen([exe, folder_path]) elif is_macos: exe = which("open") - subprocess.Popen([exe, folder_path]) else: webbrowser.open(folder_path) + return + + if exe: + subprocess.Popen([exe, folder_path]) + else: + logging.warning(f"No file browser available to open {folder_path}") def update_settings(): From 703f5a22fda63c15f4bccebb21ee87253efc3b76 Mon Sep 17 00:00:00 2001 From: digiholic Date: Wed, 7 May 2025 11:43:03 -0600 Subject: [PATCH 116/199] OSRS: New Tasks, New Options, Compatibility with new Plugin Features (#4688) --- worlds/osrs/Items.py | 2 +- worlds/osrs/LogicCSV/LogicCSVToPython.py | 215 +++++++++++++------- worlds/osrs/LogicCSV/items_generated.py | 57 +++++- worlds/osrs/LogicCSV/locations_generated.py | 53 ++++- worlds/osrs/LogicCSV/regions_generated.py | 36 ++-- worlds/osrs/LogicCSV/resources_generated.py | 7 + worlds/osrs/Names.py | 6 +- worlds/osrs/Options.py | 49 ++++- worlds/osrs/Rules.py | 16 +- worlds/osrs/__init__.py | 40 +++- 10 files changed, 366 insertions(+), 115 deletions(-) diff --git a/worlds/osrs/Items.py b/worlds/osrs/Items.py index 0679c964e7..248544aa15 100644 --- a/worlds/osrs/Items.py +++ b/worlds/osrs/Items.py @@ -62,7 +62,7 @@ chunksanity_starting_chunks: typing.List[str] = [ ItemNames.South_Of_Varrock, ItemNames.Central_Varrock, ItemNames.Varrock_Palace, - ItemNames.East_Of_Varrock, + ItemNames.Lumberyard, ItemNames.West_Varrock, ItemNames.Edgeville, ItemNames.Barbarian_Village, diff --git a/worlds/osrs/LogicCSV/LogicCSVToPython.py b/worlds/osrs/LogicCSV/LogicCSVToPython.py index ed8bd8172a..b66f53cc9d 100644 --- a/worlds/osrs/LogicCSV/LogicCSVToPython.py +++ b/worlds/osrs/LogicCSV/LogicCSVToPython.py @@ -8,7 +8,9 @@ import requests # The CSVs are updated at this repository to be shared between generator and client. data_repository_address = "https://raw.githubusercontent.com/digiholic/osrs-archipelago-logic/" # The Github tag of the CSVs this was generated with -data_csv_tag = "v1.5" +data_csv_tag = "v2.0.4" +# If true, generate using file names in the repository +debug = False if __name__ == "__main__": import sys @@ -26,98 +28,167 @@ if __name__ == "__main__": def load_location_csv(): this_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(this_dir, "locations_generated.py"), 'w+') as locPyFile: - locPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') - locPyFile.write("from ..Locations import LocationRow, SkillRequirement\n") - locPyFile.write("\n") - locPyFile.write("location_rows = [\n") + with open(os.path.join(this_dir, "locations_generated.py"), 'w+') as loc_py_file: + loc_py_file.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') + loc_py_file.write("from ..Locations import LocationRow, SkillRequirement\n") + loc_py_file.write("\n") + loc_py_file.write("location_rows = [\n") - with requests.get(data_repository_address + "/" + data_csv_tag + "/locations.csv") as req: - locations_reader = csv.reader(req.text.splitlines()) - for row in locations_reader: - row_line = "LocationRow(" - row_line += str_format(row[0]) - row_line += str_format(row[1].lower()) + if debug: + with open(os.path.join(this_dir, "locations.csv"), "r") as loc_file: + locations_reader = csv.reader(loc_file.read().splitlines()) + parse_loc_file(loc_py_file, locations_reader) + else: + print("Loading: " + data_repository_address + "/" + data_csv_tag + "/locations.csv") + with requests.get(data_repository_address + "/" + data_csv_tag + "/locations.csv") as req: + if req.status_code == 200: + locations_reader = csv.reader(req.text.splitlines()) + parse_loc_file(loc_py_file, locations_reader) + else: + print(str(req.status_code) + ": " + req.reason) + loc_py_file.write("]\n") - region_strings = row[2].split(", ") if row[2] else [] - row_line += f"{str_list_to_py(region_strings)}, " - skill_strings = row[3].split(", ") - row_line += "[" - if skill_strings: - split_skills = [skill.split(" ") for skill in skill_strings if skill != ""] - if split_skills: - for split in split_skills: - row_line += f"SkillRequirement('{split[0]}', {split[1]}), " - row_line += "], " + def parse_loc_file(loc_py_file, locations_reader): + for row in locations_reader: + # Skip the header row, if present + if row[0] == "Location Name": + continue + row_line = "LocationRow(" + row_line += str_format(row[0]) + row_line += str_format(row[1].lower()) + + region_strings = row[2].split(", ") if row[2] else [] + row_line += f"{str_list_to_py(region_strings)}, " + + skill_strings = row[3].split(", ") + row_line += "[" + if skill_strings: + split_skills = [skill.split(" ") for skill in skill_strings if skill != ""] + if split_skills: + for split in split_skills: + row_line += f"SkillRequirement('{split[0]}', {split[1]}), " + row_line += "], " + + item_strings = row[4].split(", ") if row[4] else [] + row_line += f"{str_list_to_py(item_strings)}, " + row_line += f"{row[5]})" if row[5] != "" else "0)" + loc_py_file.write(f"\t{row_line},\n") - item_strings = row[4].split(", ") if row[4] else [] - row_line += f"{str_list_to_py(item_strings)}, " - row_line += f"{row[5]})" if row[5] != "" else "0)" - locPyFile.write(f"\t{row_line},\n") - locPyFile.write("]\n") def load_region_csv(): this_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(this_dir, "regions_generated.py"), 'w+') as regPyFile: - regPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') - regPyFile.write("from ..Regions import RegionRow\n") - regPyFile.write("\n") - regPyFile.write("region_rows = [\n") + with open(os.path.join(this_dir, "regions_generated.py"), 'w+') as reg_py_file: + reg_py_file.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') + reg_py_file.write("from ..Regions import RegionRow\n") + reg_py_file.write("\n") + reg_py_file.write("region_rows = [\n") + + if debug: + with open(os.path.join(this_dir, "regions.csv"), "r") as region_file: + regions_reader = csv.reader(region_file.read().splitlines()) + parse_region_file(reg_py_file, regions_reader) + else: + print("Loading: "+ data_repository_address + "/" + data_csv_tag + "/regions.csv") + with requests.get(data_repository_address + "/" + data_csv_tag + "/regions.csv") as req: + if req.status_code == 200: + regions_reader = csv.reader(req.text.splitlines()) + parse_region_file(reg_py_file, regions_reader) + else: + print(str(req.status_code) + ": " + req.reason) + reg_py_file.write("]\n") + + + def parse_region_file(reg_py_file, regions_reader): + for row in regions_reader: + # Skip the header row, if present + if row[0] == "Region Name": + continue + + row_line = "RegionRow(" + row_line += str_format(row[0]) + row_line += str_format(row[1]) + connections = row[2] + row_line += f"{str_list_to_py(connections.split(', '))}, " + resources = row[3] + row_line += f"{str_list_to_py(resources.split(', '))})" + reg_py_file.write(f"\t{row_line},\n") - with requests.get(data_repository_address + "/" + data_csv_tag + "/regions.csv") as req: - regions_reader = csv.reader(req.text.splitlines()) - for row in regions_reader: - row_line = "RegionRow(" - row_line += str_format(row[0]) - row_line += str_format(row[1]) - connections = row[2].replace("'", "\\'") - row_line += f"{str_list_to_py(connections.split(', '))}, " - resources = row[3].replace("'", "\\'") - row_line += f"{str_list_to_py(resources.split(', '))})" - regPyFile.write(f"\t{row_line},\n") - regPyFile.write("]\n") def load_resource_csv(): this_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(this_dir, "resources_generated.py"), 'w+') as resPyFile: - resPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') - resPyFile.write("from ..Regions import ResourceRow\n") - resPyFile.write("\n") - resPyFile.write("resource_rows = [\n") + with open(os.path.join(this_dir, "resources_generated.py"), 'w+') as res_py_file: + res_py_file.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') + res_py_file.write("from ..Regions import ResourceRow\n") + res_py_file.write("\n") + res_py_file.write("resource_rows = [\n") - with requests.get(data_repository_address + "/" + data_csv_tag + "/resources.csv") as req: - resource_reader = csv.reader(req.text.splitlines()) - for row in resource_reader: - name = row[0].replace("'", "\\'") - row_line = f"ResourceRow('{name}')" - resPyFile.write(f"\t{row_line},\n") - resPyFile.write("]\n") + if debug: + with open(os.path.join(this_dir, "resources.csv"), "r") as region_file: + regions_reader = csv.reader(region_file.read().splitlines()) + parse_resources_file(res_py_file, regions_reader) + else: + print("Loading: " + data_repository_address + "/" + data_csv_tag + "/resources.csv") + with requests.get(data_repository_address + "/" + data_csv_tag + "/resources.csv") as req: + if req.status_code == 200: + resource_reader = csv.reader(req.text.splitlines()) + parse_resources_file(res_py_file, resource_reader) + else: + print(str(req.status_code) + ": " + req.reason) + res_py_file.write("]\n") + + + def parse_resources_file(res_py_file, resource_reader): + for row in resource_reader: + # Skip the header row, if present + if row[0] == "Resource Name": + continue + + name = row[0].replace("'", "\\'") + row_line = f"ResourceRow('{name}')" + res_py_file.write(f"\t{row_line},\n") def load_item_csv(): this_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(this_dir, "items_generated.py"), 'w+') as itemPyfile: - itemPyfile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') - itemPyfile.write("from BaseClasses import ItemClassification\n") - itemPyfile.write("from ..Items import ItemRow\n") - itemPyfile.write("\n") - itemPyfile.write("item_rows = [\n") + with open(os.path.join(this_dir, "items_generated.py"), 'w+') as item_py_file: + item_py_file.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') + item_py_file.write("from BaseClasses import ItemClassification\n") + item_py_file.write("from ..Items import ItemRow\n") + item_py_file.write("\n") + item_py_file.write("item_rows = [\n") - with requests.get(data_repository_address + "/" + data_csv_tag + "/items.csv") as req: - item_reader = csv.reader(req.text.splitlines()) - for row in item_reader: - row_line = "ItemRow(" - row_line += str_format(row[0]) - row_line += f"{row[1]}, " + if debug: + with open(os.path.join(this_dir, "items.csv"), "r") as region_file: + regions_reader = csv.reader(region_file.read().splitlines()) + parse_item_file(item_py_file, regions_reader) + else: + print("Loading: " + data_repository_address + "/" + data_csv_tag + "/items.csv") + with requests.get(data_repository_address + "/" + data_csv_tag + "/items.csv") as req: + if req.status_code == 200: + item_reader = csv.reader(req.text.splitlines()) + parse_item_file(item_py_file, item_reader) + else: + print(str(req.status_code) + ": " + req.reason) + item_py_file.write("]\n") - row_line += f"ItemClassification.{row[2]})" - itemPyfile.write(f"\t{row_line},\n") - itemPyfile.write("]\n") + def parse_item_file(item_py_file, item_reader): + for row in item_reader: + # Skip the header row, if present + if row[0] == "Name": + continue + + row_line = "ItemRow(" + row_line += str_format(row[0]) + row_line += f"{row[1]}, " + + row_line += f"ItemClassification.{row[2]})" + + item_py_file.write(f"\t{row_line},\n") def str_format(s) -> str: @@ -128,7 +199,7 @@ if __name__ == "__main__": def str_list_to_py(str_list) -> str: ret_str = "[" for s in str_list: - ret_str += f"'{s}', " + ret_str += str_format(s) ret_str += "]" return ret_str diff --git a/worlds/osrs/LogicCSV/items_generated.py b/worlds/osrs/LogicCSV/items_generated.py index b5e610a6e3..3a277b8d5e 100644 --- a/worlds/osrs/LogicCSV/items_generated.py +++ b/worlds/osrs/LogicCSV/items_generated.py @@ -10,7 +10,7 @@ item_rows = [ ItemRow('Area: HAM Hideout', 1, ItemClassification.progression), ItemRow('Area: Lumbridge Farms', 1, ItemClassification.progression), ItemRow('Area: South of Varrock', 1, ItemClassification.progression), - ItemRow('Area: East Varrock', 1, ItemClassification.progression), + ItemRow('Area: Lumberyard', 1, ItemClassification.progression), ItemRow('Area: Central Varrock', 1, ItemClassification.progression), ItemRow('Area: Varrock Palace', 1, ItemClassification.progression), ItemRow('Area: West Varrock', 1, ItemClassification.progression), @@ -37,7 +37,58 @@ item_rows = [ ItemRow('Progressive Armor', 6, ItemClassification.progression), ItemRow('Progressive Weapons', 6, ItemClassification.progression), ItemRow('Progressive Tools', 6, ItemClassification.useful), - ItemRow('Progressive Ranged Weapons', 3, ItemClassification.useful), + ItemRow('Progressive Ranged Weapon', 3, ItemClassification.useful), ItemRow('Progressive Ranged Armor', 3, ItemClassification.useful), - ItemRow('Progressive Magic', 2, ItemClassification.useful), + ItemRow('Progressive Magic Spell', 2, ItemClassification.useful), + ItemRow('An Invitation to the Gielinor Games', 1, ItemClassification.filler), + ItemRow('Settled\'s Crossbow', 1, ItemClassification.filler), + ItemRow('The Stone of Jas', 1, ItemClassification.filler), + ItemRow('Nieve\'s Phone Number', 1, ItemClassification.filler), + ItemRow('Hannanie\'s Lost Sanity', 1, ItemClassification.filler), + ItemRow('XP Waste', 1, ItemClassification.filler), + ItemRow('Ten Free Pulls on the Squeal of Fortune', 1, ItemClassification.filler), + ItemRow('Project Zanaris Beta Invite', 1, ItemClassification.filler), + ItemRow('A Funny Feeling You Would Have Been Followed', 1, ItemClassification.filler), + ItemRow('An Ominous Prediction From Gnome Child', 1, ItemClassification.filler), + ItemRow('A Logic Error', 1, ItemClassification.filler), + ItemRow('The Warding Skill', 1, ItemClassification.filler), + ItemRow('A 1/2500 Chance At Your Very Own Pet Baron Sucellus, Redeemable at your Local Duke, Some Restrictions May Apply', 1, ItemClassification.filler), + ItemRow('A Suspicious Email From Iagex.com Asking for your Password', 1, ItemClassification.filler), + ItemRow('A Review on that Pull Request You\'ve Been Waiting On', 1, ItemClassification.filler), + ItemRow('Fifty Billion RS3 GP (Worthless)', 1, ItemClassification.filler), + ItemRow('Mod Ash\'s Coffee Cup', 1, ItemClassification.filler), + ItemRow('An Embarrasing Photo of Zammorak at the Christmas Party', 1, ItemClassification.filler), + ItemRow('Another Bug To Report', 1, ItemClassification.filler), + ItemRow('1-Up Mushroom', 1, ItemClassification.filler), + ItemRow('Empty White Hallways', 1, ItemClassification.filler), + ItemRow('Area: Menaphos', 1, ItemClassification.filler), + ItemRow('A Ratcatchers Dialogue Rewrite', 1, ItemClassification.filler), + ItemRow('"Nostalgia"', 1, ItemClassification.filler), + ItemRow('A Hornless Unicorn', 1, ItemClassification.filler), + ItemRow('The Ability To Use ::bank', 1, ItemClassification.filler), + ItemRow('Free Haircut at the Falador Hairdresser', 1, ItemClassification.filler), + ItemRow('Nothing Interesting Happens', 1, ItemClassification.filler), + ItemRow('Why Fletch?', 1, ItemClassification.filler), + ItemRow('Evolution of Combat', 1, ItemClassification.filler), + ItemRow('Care Pack: 10,000 GP', 1, ItemClassification.useful), + ItemRow('Care Pack: 90 Steel Nails', 1, ItemClassification.useful), + ItemRow('Care Pack: 25 Swordfish', 1, ItemClassification.useful), + ItemRow('Care Pack: 50 Lobsters', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Law Runes', 1, ItemClassification.useful), + ItemRow('Care Pack: 300 Each Elemental Rune', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Chaos Runes', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Death Runes', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Oak Logs', 1, ItemClassification.useful), + ItemRow('Care Pack: 50 Willow Logs', 1, ItemClassification.useful), + ItemRow('Care Pack: 50 Bronze Bars', 1, ItemClassification.useful), + ItemRow('Care Pack: 200 Iron Ore', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Coal Ore', 1, ItemClassification.useful), + ItemRow('Care Pack: 100 Raw Trout', 1, ItemClassification.useful), + ItemRow('Care Pack: 200 Leather', 1, ItemClassification.useful), + ItemRow('Care Pack: 50 Energy Potion (4)', 2, ItemClassification.useful), + ItemRow('Care Pack: 200 Big Bones', 1, ItemClassification.useful), + ItemRow('Care Pack: 10 Each Uncut gems', 1, ItemClassification.useful), + ItemRow('Care Pack: 3 Rings of Forging', 1, ItemClassification.useful), + ItemRow('Care Pack: 500 Rune Essence', 1, ItemClassification.useful), + ItemRow('Care Pack: 200 Mind Runes', 1, ItemClassification.useful), ] diff --git a/worlds/osrs/LogicCSV/locations_generated.py b/worlds/osrs/LogicCSV/locations_generated.py index 2d617a7038..4c1cd0bdd8 100644 --- a/worlds/osrs/LogicCSV/locations_generated.py +++ b/worlds/osrs/LogicCSV/locations_generated.py @@ -19,37 +19,56 @@ location_rows = [ LocationRow('Quest: Witch\'s Potion', 'quest', ['Rimmington', 'Port Sarim', ], [], [], 0), LocationRow('Quest: The Knight\'s Sword', 'quest', ['Falador', 'Varrock Palace', 'Mudskipper Point', 'South of Varrock', 'Windmill', 'Pie Dish', 'Port Sarim', ], [SkillRequirement('Cooking', 10), SkillRequirement('Mining', 10), ], [], 0), LocationRow('Quest: Goblin Diplomacy', 'quest', ['Goblin Village', 'Draynor Village', 'Falador', 'South of Varrock', 'Onion', ], [], [], 0), - LocationRow('Quest: Pirate\'s Treasure', 'quest', ['Port Sarim', 'Karamja', 'Falador', ], [], [], 0), + LocationRow('Quest: Pirate\'s Treasure', 'quest', ['Port Sarim', 'Karamja', 'Falador', 'Central Varrock', ], [], [], 0), LocationRow('Quest: Rune Mysteries', 'quest', ['Lumbridge', 'Wizard Tower', 'Central Varrock', ], [], [], 0), LocationRow('Quest: Misthalin Mystery', 'quest', ['Lumbridge Swamp', ], [], [], 0), LocationRow('Quest: The Corsair Curse', 'quest', ['Rimmington', 'Falador Farms', 'Corsair Cove', ], [], [], 0), LocationRow('Quest: X Marks the Spot', 'quest', ['Lumbridge', 'Draynor Village', 'Port Sarim', ], [], [], 0), LocationRow('Quest: Below Ice Mountain', 'quest', ['Dwarven Mines', 'Dwarven Mountain Pass', 'Ice Mountain', 'Barbarian Village', 'Falador', 'Central Varrock', 'Edgeville', ], [], [], 16), LocationRow('Quest: Dragon Slayer', 'goal', ['Crandor', 'South of Varrock', 'Edgeville', 'Lumbridge', 'Rimmington', 'Monastery', 'Dwarven Mines', 'Port Sarim', 'Draynor Village', ], [], [], 32), + LocationRow('Bury Some Big Bones', 'prayer', ['Big Bones', ], [SkillRequirement('Prayer', 1), ], [], 0), + LocationRow('Activate the "Sharp Eye" Prayer', 'prayer', [], [SkillRequirement('Prayer', 8), ], [], 0), LocationRow('Activate the "Rock Skin" Prayer', 'prayer', [], [SkillRequirement('Prayer', 10), ], [], 0), LocationRow('Activate the "Protect Item" Prayer', 'prayer', [], [SkillRequirement('Prayer', 25), ], [], 2), LocationRow('Pray at the Edgeville Monastery', 'prayer', ['Monastery', ], [SkillRequirement('Prayer', 31), ], [], 6), LocationRow('Cast Bones To Bananas', 'magic', ['Nature Runes', ], [SkillRequirement('Magic', 15), ], [], 0), + LocationRow('Cast Earth Strike', 'magic', [], [SkillRequirement('Magic', 9), ], [], 0), + LocationRow('Cast Curse', 'magic', [], [SkillRequirement('Magic', 19), ], [], 0), LocationRow('Teleport to Varrock', 'magic', ['Central Varrock', 'Law Runes', ], [SkillRequirement('Magic', 25), ], [], 0), - LocationRow('Teleport to Lumbridge', 'magic', ['Lumbridge', 'Law Runes', ], [SkillRequirement('Magic', 31), ], [], 2), + LocationRow('Teleport to Lumbridge', 'magic', ['Lumbridge', 'Law Runes', ], [SkillRequirement('Magic', 31), ], [], 0), + LocationRow('Telegrab a Gold Bar from the Varrock Bank', 'magic', ['Law Runes', 'West Varrock', ], [SkillRequirement('Magic', 33), ], [], 0), LocationRow('Teleport to Falador', 'magic', ['Falador', 'Law Runes', ], [SkillRequirement('Magic', 37), ], [], 6), LocationRow('Craft an Air Rune', 'runecraft', ['Rune Essence', 'Falador Farms', ], [SkillRequirement('Runecraft', 1), ], [], 0), + LocationRow('Craft a Mind Rune', 'runecraft', ['Rune Essence', 'Goblin Village', ], [SkillRequirement('Runecraft', 2), ], [], 0), + LocationRow('Craft a Water Rune', 'runecraft', ['Rune Essence', 'Lumbridge Swamp', ], [SkillRequirement('Runecraft', 5), ], [], 0), + LocationRow('Craft an Earth Rune', 'runecraft', ['Rune Essence', 'Lumberyard', ], [SkillRequirement('Runecraft', 9), ], [], 0), + LocationRow('Craft a Fire Rune', 'runecraft', ['Rune Essence', 'Al Kharid', ], [SkillRequirement('Runecraft', 14), ], [], 0), + LocationRow('Craft a Body Rune', 'runecraft', ['Rune Essence', 'Dwarven Mountain Pass', ], [SkillRequirement('Runecraft', 20), ], [], 0), LocationRow('Craft runes with a Mind Core', 'runecraft', ['Camdozaal', 'Goblin Village', ], [SkillRequirement('Runecraft', 2), ], [], 0), LocationRow('Craft runes with a Body Core', 'runecraft', ['Camdozaal', 'Dwarven Mountain Pass', ], [SkillRequirement('Runecraft', 20), ], [], 0), + LocationRow('Craft a Pot', 'crafting', ['Clay Ore', 'Barbarian Village', ], [SkillRequirement('Crafting', 1), ], [], 0), + LocationRow('Craft a pair of Leather Boots', 'crafting', ['Milk', 'Al Kharid', ], [SkillRequirement('Crafting', 7), ], [], 0), LocationRow('Make an Unblessed Symbol', 'crafting', ['Silver Ore', 'Furnace', 'Al Kharid', 'Sheep', 'Spinning Wheel', ], [SkillRequirement('Crafting', 16), ], [], 0), LocationRow('Cut a Sapphire', 'crafting', ['Chisel', ], [SkillRequirement('Crafting', 20), ], [], 0), LocationRow('Cut an Emerald', 'crafting', ['Chisel', ], [SkillRequirement('Crafting', 27), ], [], 0), LocationRow('Cut a Ruby', 'crafting', ['Chisel', ], [SkillRequirement('Crafting', 34), ], [], 4), + LocationRow('Enter the Crafting Guild', 'crafting', ['Crafting Guild', ], [SkillRequirement('Crafting', 40), ], [], 0), LocationRow('Cut a Diamond', 'crafting', ['Chisel', ], [SkillRequirement('Crafting', 43), ], [], 8), + LocationRow('Mine Copper', 'crafting', ['Bronze Ores', ], [SkillRequirement('Mining', 1), ], [], 0), + LocationRow('Mine Tin', 'crafting', ['Bronze Ores', ], [SkillRequirement('Mining', 1), ], [], 0), + LocationRow('Mine Clay', 'crafting', ['Clay Ore', ], [SkillRequirement('Mining', 1), ], [], 0), + LocationRow('Mine Iron', 'mining', ['Iron Ore', ], [SkillRequirement('Mining', 1), ], [], 0), LocationRow('Mine a Blurite Ore', 'mining', ['Mudskipper Point', 'Port Sarim', ], [SkillRequirement('Mining', 10), ], [], 0), LocationRow('Crush a Barronite Deposit', 'mining', ['Camdozaal', ], [SkillRequirement('Mining', 14), ], [], 0), LocationRow('Mine Silver', 'mining', ['Silver Ore', ], [SkillRequirement('Mining', 20), ], [], 0), LocationRow('Mine Coal', 'mining', ['Coal Ore', ], [SkillRequirement('Mining', 30), ], [], 2), LocationRow('Mine Gold', 'mining', ['Gold Ore', ], [SkillRequirement('Mining', 40), ], [], 6), + LocationRow('Smelt a Bronze Bar', 'smithing', ['Bronze Ores', 'Furnace', ], [SkillRequirement('Smithing', 1), SkillRequirement('Mining', 1), ], [], 0), LocationRow('Smelt an Iron Bar', 'smithing', ['Iron Ore', 'Furnace', ], [SkillRequirement('Smithing', 15), SkillRequirement('Mining', 15), ], [], 0), LocationRow('Smelt a Silver Bar', 'smithing', ['Silver Ore', 'Furnace', ], [SkillRequirement('Smithing', 20), SkillRequirement('Mining', 20), ], [], 0), LocationRow('Smelt a Steel Bar', 'smithing', ['Coal Ore', 'Iron Ore', 'Furnace', ], [SkillRequirement('Smithing', 30), SkillRequirement('Mining', 30), ], [], 2), LocationRow('Smelt a Gold Bar', 'smithing', ['Gold Ore', 'Furnace', ], [SkillRequirement('Smithing', 40), SkillRequirement('Mining', 40), ], [], 6), + LocationRow('Catch a Sardine', 'fishing', ['Shrimp Spot', ], [SkillRequirement('Fishing', 5), ], [], 0), LocationRow('Catch some Anchovies', 'fishing', ['Shrimp Spot', ], [SkillRequirement('Fishing', 15), ], [], 0), LocationRow('Catch a Trout', 'fishing', ['Fly Fishing Spot', ], [SkillRequirement('Fishing', 20), ], [], 0), LocationRow('Prepare a Tetra', 'fishing', ['Camdozaal', ], [SkillRequirement('Fishing', 33), SkillRequirement('Cooking', 33), ], [], 2), @@ -58,13 +77,16 @@ location_rows = [ LocationRow('Bake a Redberry Pie', 'cooking', ['Redberry Bush', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 10), ], [], 0), LocationRow('Cook some Stew', 'cooking', ['Bowl', 'Meat', 'Potato', ], [SkillRequirement('Cooking', 25), ], [], 0), LocationRow('Bake an Apple Pie', 'cooking', ['Cooking Apple', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 32), ], [], 2), + LocationRow('Enter the Cook\'s Guild', 'cooking', ['Cook\'s Guild', ], [], [], 0), LocationRow('Bake a Cake', 'cooking', ['Wheat', 'Windmill', 'Egg', 'Milk', 'Cake Tin', ], [SkillRequirement('Cooking', 40), ], [], 6), LocationRow('Bake a Meat Pizza', 'cooking', ['Wheat', 'Windmill', 'Cheese', 'Tomato', 'Meat', ], [SkillRequirement('Cooking', 45), ], [], 8), + LocationRow('Burn a Log', 'firemaking', [], [SkillRequirement('Firemaking', 1), SkillRequirement('Woodcutting', 1), ], [], 0), LocationRow('Burn some Oak Logs', 'firemaking', ['Oak Tree', ], [SkillRequirement('Firemaking', 15), SkillRequirement('Woodcutting', 15), ], [], 0), LocationRow('Burn some Willow Logs', 'firemaking', ['Willow Tree', ], [SkillRequirement('Firemaking', 30), SkillRequirement('Woodcutting', 30), ], [], 0), LocationRow('Travel on a Canoe', 'woodcutting', ['Canoe Tree', ], [SkillRequirement('Woodcutting', 12), ], [], 0), LocationRow('Cut an Oak Log', 'woodcutting', ['Oak Tree', ], [SkillRequirement('Woodcutting', 15), ], [], 0), LocationRow('Cut a Willow Log', 'woodcutting', ['Willow Tree', ], [SkillRequirement('Woodcutting', 30), ], [], 0), + LocationRow('Kill a Duck', 'combat', ['Duck', ], [SkillRequirement('Combat', 1), ], [], 0), LocationRow('Kill Jeff', 'combat', ['Dwarven Mountain Pass', ], [SkillRequirement('Combat', 2), ], [], 0), LocationRow('Kill a Goblin', 'combat', ['Goblin', ], [SkillRequirement('Combat', 2), ], [], 0), LocationRow('Kill a Monkey', 'combat', ['Karamja', ], [SkillRequirement('Combat', 3), ], [], 0), @@ -81,19 +103,24 @@ location_rows = [ LocationRow('Kill an Ogress Shaman', 'combat', ['Corsair Cove', ], [SkillRequirement('Combat', 82), ], [], 8), LocationRow('Kill Obor', 'combat', ['Edgeville', ], [SkillRequirement('Combat', 106), ], [], 28), LocationRow('Kill Bryophyta', 'combat', ['Central Varrock', ], [SkillRequirement('Combat', 128), ], [], 28), + LocationRow('Die', 'general', [], [], [], 0), + LocationRow('Reach a Level 10', 'general', [], [], [], 0), LocationRow('Total XP 5,000', 'general', [], [], [], 0), LocationRow('Combat Level 5', 'general', [], [], [], 0), LocationRow('Total XP 10,000', 'general', [], [], [], 0), LocationRow('Total Level 50', 'general', [], [], [], 0), + LocationRow('Reach a Level 20', 'general', [], [], [], 0), LocationRow('Total XP 25,000', 'general', [], [], [], 0), LocationRow('Total Level 100', 'general', [], [], [], 0), LocationRow('Total XP 50,000', 'general', [], [], [], 0), LocationRow('Combat Level 15', 'general', [], [], [], 0), LocationRow('Total Level 150', 'general', [], [], [], 2), + LocationRow('Reach a Level 30', 'general', [], [], [], 2), LocationRow('Total XP 75,000', 'general', [], [], [], 2), LocationRow('Combat Level 25', 'general', [], [], [], 2), LocationRow('Total XP 100,000', 'general', [], [], [], 6), LocationRow('Total Level 200', 'general', [], [], [], 6), + LocationRow('Reach a Level 40', 'general', [], [], [], 6), LocationRow('Total XP 125,000', 'general', [], [], [], 6), LocationRow('Combat Level 30', 'general', [], [], [], 10), LocationRow('Total Level 250', 'general', [], [], [], 10), @@ -103,6 +130,28 @@ location_rows = [ LocationRow('Open a Simple Lockbox', 'general', ['Camdozaal', ], [], [], 0), LocationRow('Open an Elaborate Lockbox', 'general', ['Camdozaal', ], [], [], 0), LocationRow('Open an Ornate Lockbox', 'general', ['Camdozaal', ], [], [], 0), + LocationRow('Trans your Gender', 'general', ['Makeover', ], [], [], 0), + LocationRow('Read a Flyer from Ali the Leaflet Dropper', 'general', ['Al Kharid', 'South of Varrock', ], [], [], 0), + LocationRow('Cry by the Members Gate to Taverley', 'general', ['Dwarven Mountain Pass', ], [], [], 0), + LocationRow('Get Prompted to Buy Membership', 'general', [], [], [], 0), + LocationRow('Pet the Stray Dog in Varrock', 'general', ['Central Varrock', 'West Varrock', 'South of Varrock', ], [], [], 0), + LocationRow('Get Sent to Jail in Shantay Pass', 'general', ['Al Kharid', 'Port Sarim', ], [], [], 0), + LocationRow('Have the Apothecary Make a Strength Potion', 'general', ['Central Varrock', 'Red Spider Eggs', 'Limpwurt Root', ], [], [], 0), + LocationRow('Put a Whole Banana into a Bottle of Karamjan Rum', 'general', ['Karamja', ], [], [], 0), + LocationRow('Attempt to Shear "The Thing"', 'general', ['Lumbridge Farms West', ], [], [], 0), + LocationRow('Eat a Kebab', 'general', ['Al Kharid', ], [], [], 0), + LocationRow('Return a Beer Glass to a Bar', 'general', ['Falador', ], [], [], 0), + LocationRow('Enter the Varrock Bear Cage', 'general', ['Varrock Palace', ], [], [], 0), + LocationRow('Equip a Cabbage Cape', 'general', ['Draynor Village', ], [], [], 0), + LocationRow('Equip a Pride Scarf', 'general', ['Draynor Village', ], [], [], 0), + LocationRow('Visit the Black Hole', 'general', ['Draynor Village', 'Dwarven Mines', ], [], [], 0), + LocationRow('Try to Equip Goblin Mail', 'general', ['Goblin', ], [], [], 0), + LocationRow('Equip an Orange Cape', 'general', ['Draynor Village', ], [], [], 0), + LocationRow('Find a Needle in a Haystack', 'general', ['Haystack', ], [], [], 0), + LocationRow('Insult the Homeless (but not Charlie he\'s cool)', 'general', ['Central Varrock', 'South of Varrock', ], [], [], 0), + LocationRow('Dance with Party Pete', 'general', ['Falador', ], [], [], 0), + LocationRow('Read a Newspaper', 'general', ['Central Varrock', ], [], [], 0), + LocationRow('Add a Card to the Chronicle', 'general', ['Draynor Village', ], [], [], 0), LocationRow('Points: Cook\'s Assistant', 'points', [], [], [], 0), LocationRow('Points: Demon Slayer', 'points', [], [], [], 0), LocationRow('Points: The Restless Ghost', 'points', [], [], [], 0), diff --git a/worlds/osrs/LogicCSV/regions_generated.py b/worlds/osrs/LogicCSV/regions_generated.py index 87b3747d93..512cd3b268 100644 --- a/worlds/osrs/LogicCSV/regions_generated.py +++ b/worlds/osrs/LogicCSV/regions_generated.py @@ -4,19 +4,19 @@ This file was auto generated by LogicCSVToPython.py from ..Regions import RegionRow region_rows = [ - RegionRow('Lumbridge', 'Area: Lumbridge', ['Lumbridge Farms East', 'Lumbridge Farms West', 'Al Kharid', 'Lumbridge Swamp', 'HAM Hideout', 'South of Varrock', 'Barbarian Village', 'Edgeville', 'Wilderness', ], ['Mind Runes', 'Spinning Wheel', 'Furnace', 'Chisel', 'Bronze Anvil', 'Fly Fishing Spot', 'Bowl', 'Cake Tin', 'Oak Tree', 'Willow Tree', 'Canoe Tree', 'Goblin', 'Imps', ]), - RegionRow('Lumbridge Swamp', 'Area: Lumbridge Swamp', ['Lumbridge', 'HAM Hideout', ], ['Bronze Ores', 'Coal Ore', 'Shrimp Spot', 'Meat', 'Goblin', 'Imps', ]), + RegionRow('Lumbridge', 'Area: Lumbridge', ['Lumbridge Farms East', 'Lumbridge Farms West', 'Al Kharid', 'Lumbridge Swamp', 'HAM Hideout', 'South of Varrock', 'Barbarian Village', 'Edgeville', 'Wilderness', ], ['Mind Runes', 'Spinning Wheel', 'Furnace', 'Chisel', 'Bronze Anvil', 'Fly Fishing Spot', 'Bowl', 'Cake Tin', 'Oak Tree', 'Willow Tree', 'Canoe Tree', 'Goblin', 'Imps', 'Duck', 'Bar', ]), + RegionRow('Lumbridge Swamp', 'Area: Lumbridge Swamp', ['Lumbridge', 'HAM Hideout', ], ['Bronze Ores', 'Coal Ore', 'Shrimp Spot', 'Meat', 'Goblin', 'Imps', 'Big Bones', 'Duck', ]), RegionRow('HAM Hideout', 'Area: HAM Hideout', ['Lumbridge Farms West', 'Lumbridge', 'Lumbridge Swamp', 'Draynor Village', ], ['Goblin', ]), - RegionRow('Lumbridge Farms West', 'Area: Lumbridge Farms', ['Sourhog\'s Lair', 'HAM Hideout', 'Draynor Village', ], ['Sheep', 'Meat', 'Wheat', 'Windmill', 'Egg', 'Milk', 'Willow Tree', 'Imps', 'Potato', ]), + RegionRow('Lumbridge Farms West', 'Area: Lumbridge Farms', ['Sourhog\'s Lair', 'HAM Hideout', 'Draynor Village', ], ['Sheep', 'Meat', 'Wheat', 'Windmill', 'Egg', 'Milk', 'Willow Tree', 'Imps', 'Potato', 'Haystack', ]), RegionRow('Lumbridge Farms East', 'Area: Lumbridge Farms', ['South of Varrock', 'Lumbridge', ], ['Meat', 'Egg', 'Milk', 'Willow Tree', 'Goblin', 'Imps', 'Potato', ]), RegionRow('Sourhog\'s Lair', 'Area: South of Varrock', ['Lumbridge Farms West', 'Draynor Manor Outskirts', ], ['', ]), - RegionRow('South of Varrock', 'Area: South of Varrock', ['Al Kharid', 'West Varrock', 'Central Varrock', 'East Varrock', 'Lumbridge Farms East', 'Lumbridge', 'Barbarian Village', 'Edgeville', 'Wilderness', ], ['Sheep', 'Bronze Ores', 'Iron Ore', 'Silver Ore', 'Redberry Bush', 'Meat', 'Wheat', 'Oak Tree', 'Willow Tree', 'Canoe Tree', 'Guard', 'Imps', 'Clay Ore', ]), - RegionRow('East Varrock', 'Area: East Varrock', ['Wilderness', 'South of Varrock', 'Central Varrock', 'Varrock Palace', ], ['Guard', ]), - RegionRow('Central Varrock', 'Area: Central Varrock', ['Varrock Palace', 'East Varrock', 'South of Varrock', 'West Varrock', ], ['Mind Runes', 'Chisel', 'Anvil', 'Bowl', 'Cake Tin', 'Oak Tree', 'Barbarian', 'Guard', 'Rune Essence', 'Imps', ]), - RegionRow('Varrock Palace', 'Area: Varrock Palace', ['Wilderness', 'East Varrock', 'Central Varrock', 'West Varrock', ], ['Pie Dish', 'Oak Tree', 'Zombie', 'Guard', 'Deadly Red Spider', 'Moss Giant', 'Nature Runes', 'Law Runes', ]), + RegionRow('South of Varrock', 'Area: South of Varrock', ['Al Kharid', 'West Varrock', 'Central Varrock', 'Lumberyard', 'Lumbridge Farms East', 'Lumbridge', 'Barbarian Village', 'Edgeville', 'Wilderness', ], ['Sheep', 'Bronze Ores', 'Iron Ore', 'Silver Ore', 'Redberry Bush', 'Meat', 'Wheat', 'Oak Tree', 'Willow Tree', 'Canoe Tree', 'Guard', 'Imps', 'Clay Ore', 'Duck', ]), + RegionRow('Lumberyard', 'Area: Lumberyard', ['Wilderness', 'South of Varrock', 'Central Varrock', 'Varrock Palace', ], ['Guard', 'Bar', ]), + RegionRow('Central Varrock', 'Area: Central Varrock', ['Varrock Palace', 'Lumberyard', 'South of Varrock', 'West Varrock', ], ['Mind Runes', 'Chisel', 'Anvil', 'Bowl', 'Cake Tin', 'Oak Tree', 'Barbarian', 'Guard', 'Rune Essence', 'Imps', 'Makeover', 'Bar', ]), + RegionRow('Varrock Palace', 'Area: Varrock Palace', ['Wilderness', 'Lumberyard', 'Central Varrock', 'West Varrock', ], ['Pie Dish', 'Oak Tree', 'Zombie', 'Guard', 'Deadly Red Spider', 'Moss Giant', 'Nature Runes', 'Law Runes', 'Big Bones', 'Makeover', 'Red Spider Eggs', ]), RegionRow('West Varrock', 'Area: West Varrock', ['Wilderness', 'Varrock Palace', 'South of Varrock', 'Barbarian Village', 'Edgeville', 'Cook\'s Guild', ], ['Anvil', 'Wheat', 'Oak Tree', 'Goblin', 'Guard', 'Onion', ]), RegionRow('Cook\'s Guild', 'Area: West Varrock*', ['West Varrock', ], ['Bowl', 'Cooking Apple', 'Pie Dish', 'Cake Tin', 'Windmill', ]), - RegionRow('Edgeville', 'Area: Edgeville', ['Wilderness', 'West Varrock', 'Barbarian Village', 'South of Varrock', 'Lumbridge', ], ['Furnace', 'Chisel', 'Bronze Ores', 'Iron Ore', 'Coal Ore', 'Bowl', 'Meat', 'Cake Tin', 'Willow Tree', 'Canoe Tree', 'Zombie', 'Guard', 'Hill Giant', 'Nature Runes', 'Law Runes', 'Imps', ]), + RegionRow('Edgeville', 'Area: Edgeville', ['Wilderness', 'West Varrock', 'Barbarian Village', 'South of Varrock', 'Lumbridge', ], ['Furnace', 'Chisel', 'Bronze Ores', 'Iron Ore', 'Coal Ore', 'Bowl', 'Meat', 'Cake Tin', 'Willow Tree', 'Canoe Tree', 'Zombie', 'Guard', 'Hill Giant', 'Nature Runes', 'Law Runes', 'Imps', 'Big Bones', 'Limpwurt Root', 'Haystack', ]), RegionRow('Barbarian Village', 'Area: Barbarian Village', ['Edgeville', 'West Varrock', 'Draynor Manor Outskirts', 'Dwarven Mountain Pass', ], ['Spinning Wheel', 'Coal Ore', 'Anvil', 'Fly Fishing Spot', 'Meat', 'Canoe Tree', 'Barbarian', 'Zombie', 'Law Runes', ]), RegionRow('Draynor Manor Outskirts', 'Area: Draynor Manor', ['Barbarian Village', 'Sourhog\'s Lair', 'Draynor Village', 'Falador East Outskirts', ], ['Goblin', ]), RegionRow('Draynor Manor', 'Area: Draynor Manor', ['Draynor Village', ], ['', ]), @@ -27,21 +27,21 @@ region_rows = [ RegionRow('Ice Mountain', 'Area: Ice Mountain', ['Wilderness', 'Monastery', 'Dwarven Mines', 'Camdozaal*', ], ['', ]), RegionRow('Camdozaal', 'Area: Ice Mountain', ['Ice Mountain', ], ['Clay Ore', ]), RegionRow('Monastery', 'Area: Monastery', ['Wilderness', 'Dwarven Mountain Pass', 'Dwarven Mines', 'Ice Mountain', ], ['Sheep', ]), - RegionRow('Falador', 'Area: Falador', ['Dwarven Mountain Pass', 'Falador Farms', 'Dwarven Mines', ], ['Furnace', 'Chisel', 'Bowl', 'Cake Tin', 'Oak Tree', 'Guard', 'Imps', ]), - RegionRow('Falador Farms', 'Area: Falador Farms', ['Falador', 'Falador East Outskirts', 'Draynor Village', 'Port Sarim', 'Rimmington', 'Crafting Guild Outskirts', ], ['Spinning Wheel', 'Meat', 'Egg', 'Milk', 'Oak Tree', 'Imps', ]), + RegionRow('Falador', 'Area: Falador', ['Dwarven Mountain Pass', 'Falador Farms', 'Dwarven Mines', ], ['Furnace', 'Chisel', 'Bowl', 'Cake Tin', 'Oak Tree', 'Guard', 'Imps', 'Duck', 'Makeover', 'Bar', ]), + RegionRow('Falador Farms', 'Area: Falador Farms', ['Falador', 'Falador East Outskirts', 'Draynor Village', 'Port Sarim', 'Rimmington', 'Crafting Guild Outskirts', ], ['Spinning Wheel', 'Meat', 'Egg', 'Milk', 'Oak Tree', 'Imps', 'Duck', ]), RegionRow('Port Sarim', 'Area: Port Sarim', ['Falador Farms', 'Mudskipper Point', 'Rimmington', 'Karamja Docks', 'Crandor', ], ['Mind Runes', 'Shrimp Spot', 'Meat', 'Cheese', 'Tomato', 'Oak Tree', 'Willow Tree', 'Goblin', 'Potato', ]), RegionRow('Karamja Docks', 'Area: Mudskipper Point', ['Port Sarim', 'Karamja', ], ['', ]), - RegionRow('Mudskipper Point', 'Area: Mudskipper Point', ['Rimmington', 'Port Sarim', ], ['Anvil', 'Ice Giant', 'Nature Runes', 'Law Runes', ]), - RegionRow('Karamja', 'Area: Karamja', ['Karamja Docks', 'Crandor', ], ['Gold Ore', 'Lobster Spot', 'Bowl', 'Cake Tin', 'Deadly Red Spider', 'Imps', ]), - RegionRow('Crandor', 'Area: Crandor', ['Karamja', 'Port Sarim', ], ['Coal Ore', 'Gold Ore', 'Moss Giant', 'Lesser Demon', 'Nature Runes', 'Law Runes', ]), + RegionRow('Mudskipper Point', 'Area: Mudskipper Point', ['Rimmington', 'Port Sarim', ], ['Anvil', 'Ice Giant', 'Nature Runes', 'Law Runes', 'Big Bones', 'Limpwurt Root', ]), + RegionRow('Karamja', 'Area: Karamja', ['Karamja Docks', 'Crandor', ], ['Gold Ore', 'Lobster Spot', 'Bowl', 'Cake Tin', 'Deadly Red Spider', 'Imps', 'Red Spider Eggs', ]), + RegionRow('Crandor', 'Area: Crandor', ['Karamja', 'Port Sarim', ], ['Coal Ore', 'Gold Ore', 'Moss Giant', 'Lesser Demon', 'Nature Runes', 'Law Runes', 'Big Bones', 'Limpwurt Root', ]), RegionRow('Rimmington', 'Area: Rimmington', ['Falador Farms', 'Port Sarim', 'Mudskipper Point', 'Crafting Guild Peninsula', 'Corsair Cove', ], ['Chisel', 'Bronze Ores', 'Iron Ore', 'Gold Ore', 'Bowl', 'Cake Tin', 'Wheat', 'Oak Tree', 'Willow Tree', 'Crafting Moulds', 'Imps', 'Clay Ore', 'Onion', ]), - RegionRow('Crafting Guild Peninsula', 'Area: Crafting Guild', ['Falador Farms', 'Rimmington', ], ['', ]), - RegionRow('Crafting Guild Outskirts', 'Area: Crafting Guild', ['Falador Farms', 'Crafting Guild', ], ['Sheep', 'Willow Tree', 'Oak Tree', ]), + RegionRow('Crafting Guild Peninsula', 'Area: Crafting Guild', ['Falador Farms', 'Rimmington', ], ['Limpwurt Root', ]), + RegionRow('Crafting Guild Outskirts', 'Area: Crafting Guild', ['Falador Farms', 'Crafting Guild', ], ['Sheep', 'Willow Tree', 'Oak Tree', 'Makeover', ]), RegionRow('Crafting Guild', 'Area: Crafting Guild*', ['Crafting Guild', ], ['Spinning Wheel', 'Chisel', 'Silver Ore', 'Gold Ore', 'Meat', 'Milk', 'Clay Ore', ]), RegionRow('Draynor Village', 'Area: Draynor Village', ['Draynor Manor', 'Lumbridge Farms West', 'HAM Hideout', 'Wizard Tower', ], ['Anvil', 'Shrimp Spot', 'Wheat', 'Cheese', 'Tomato', 'Willow Tree', 'Goblin', 'Zombie', 'Nature Runes', 'Law Runes', 'Imps', ]), RegionRow('Wizard Tower', 'Area: Wizard Tower', ['Draynor Village', ], ['Lesser Demon', 'Rune Essence', ]), - RegionRow('Corsair Cove', 'Area: Corsair Cove*', ['Rimmington', ], ['Anvil', 'Meat', ]), + RegionRow('Corsair Cove', 'Area: Corsair Cove*', ['Rimmington', ], ['Anvil', 'Meat', 'Limpwurt Root', ]), RegionRow('Al Kharid', 'Area: Al Kharid', ['South of Varrock', 'Citharede Abbey', 'Lumbridge', 'Port Sarim', ], ['Furnace', 'Chisel', 'Bronze Ores', 'Iron Ore', 'Silver Ore', 'Coal Ore', 'Gold Ore', 'Shrimp Spot', 'Bowl', 'Cake Tin', 'Cheese', 'Crafting Moulds', 'Imps', ]), - RegionRow('Citharede Abbey', 'Area: Citharede Abbey', ['Al Kharid', ], ['Iron Ore', 'Coal Ore', 'Anvil', 'Hill Giant', 'Nature Runes', 'Law Runes', ]), - RegionRow('Wilderness', 'Area: Wilderness', ['East Varrock', 'Varrock Palace', 'West Varrock', 'Edgeville', 'Monastery', 'Ice Mountain', 'Goblin Village', 'South of Varrock', 'Lumbridge', ], ['Furnace', 'Chisel', 'Iron Ore', 'Coal Ore', 'Anvil', 'Meat', 'Cake Tin', 'Cheese', 'Tomato', 'Oak Tree', 'Canoe Tree', 'Zombie', 'Hill Giant', 'Deadly Red Spider', 'Moss Giant', 'Ice Giant', 'Lesser Demon', 'Nature Runes', 'Law Runes', ]), + RegionRow('Citharede Abbey', 'Area: Citharede Abbey', ['Al Kharid', ], ['Iron Ore', 'Coal Ore', 'Anvil', 'Hill Giant', 'Nature Runes', 'Law Runes', 'Big Bones', 'Limpwurt Root', ]), + RegionRow('Wilderness', 'Area: Wilderness', ['Lumberyard', 'Varrock Palace', 'West Varrock', 'Edgeville', 'Monastery', 'Ice Mountain', 'Goblin Village', 'South of Varrock', 'Lumbridge', ], ['Furnace', 'Chisel', 'Iron Ore', 'Coal Ore', 'Anvil', 'Meat', 'Cake Tin', 'Cheese', 'Tomato', 'Oak Tree', 'Canoe Tree', 'Zombie', 'Hill Giant', 'Deadly Red Spider', 'Moss Giant', 'Ice Giant', 'Lesser Demon', 'Nature Runes', 'Law Runes', 'Big Bones', 'Limpwurt Root', 'Bar', ]), ] diff --git a/worlds/osrs/LogicCSV/resources_generated.py b/worlds/osrs/LogicCSV/resources_generated.py index 18c2ebe2f3..2b08f11919 100644 --- a/worlds/osrs/LogicCSV/resources_generated.py +++ b/worlds/osrs/LogicCSV/resources_generated.py @@ -51,4 +51,11 @@ resource_rows = [ ResourceRow('Clay Ore'), ResourceRow('Onion'), ResourceRow('Potato'), + ResourceRow('Big Bones'), + ResourceRow('Duck'), + ResourceRow('Makeover'), + ResourceRow('Limpwurt Root'), + ResourceRow('Bar'), + ResourceRow('Haystack'), + ResourceRow('Red Spider Eggs'), ] diff --git a/worlds/osrs/Names.py b/worlds/osrs/Names.py index 1a44aa389c..138fa84850 100644 --- a/worlds/osrs/Names.py +++ b/worlds/osrs/Names.py @@ -73,7 +73,7 @@ class ItemNames(str, Enum): South_Of_Varrock = "Area: South of Varrock" Central_Varrock = "Area: Central Varrock" Varrock_Palace = "Area: Varrock Palace" - East_Of_Varrock = "Area: East Varrock" + Lumberyard = "Area: Lumberyard" West_Varrock = "Area: West Varrock" Edgeville = "Area: Edgeville" Barbarian_Village = "Area: Barbarian Village" @@ -94,8 +94,8 @@ class ItemNames(str, Enum): Progressive_Weapons = "Progressive Weapons" Progressive_Tools = "Progressive Tools" Progressive_Range_Armor = "Progressive Ranged Armor" - Progressive_Range_Weapon = "Progressive Ranged Weapons" - Progressive_Magic = "Progressive Magic" + Progressive_Range_Weapon = "Progressive Ranged Weapon" + Progressive_Magic = "Progressive Magic Spell" Lobsters = "10 Lobsters" Swordfish = "5 Swordfish" Energy_Potions = "10 Energy Potions" diff --git a/worlds/osrs/Options.py b/worlds/osrs/Options.py index 81e017eddb..55a040b095 100644 --- a/worlds/osrs/Options.py +++ b/worlds/osrs/Options.py @@ -3,18 +3,19 @@ from dataclasses import dataclass from Options import Choice, Toggle, Range, PerGameCommonOptions MAX_COMBAT_TASKS = 16 -MAX_PRAYER_TASKS = 3 -MAX_MAGIC_TASKS = 4 -MAX_RUNECRAFT_TASKS = 3 -MAX_CRAFTING_TASKS = 5 -MAX_MINING_TASKS = 5 -MAX_SMITHING_TASKS = 4 -MAX_FISHING_TASKS = 5 -MAX_COOKING_TASKS = 5 -MAX_FIREMAKING_TASKS = 2 + +MAX_PRAYER_TASKS = 5 +MAX_MAGIC_TASKS = 7 +MAX_RUNECRAFT_TASKS = 8 +MAX_CRAFTING_TASKS = 11 +MAX_MINING_TASKS = 6 +MAX_SMITHING_TASKS = 5 +MAX_FISHING_TASKS = 6 +MAX_COOKING_TASKS = 6 +MAX_FIREMAKING_TASKS = 3 MAX_WOODCUTTING_TASKS = 3 -NON_QUEST_LOCATION_COUNT = 22 +NON_QUEST_LOCATION_COUNT = 49 class StartingArea(Choice): @@ -58,6 +59,31 @@ class ProgressiveTasks(Toggle): display_name = "Progressive Tasks" +class EnableDuds(Toggle): + """ + Whether to include filler "Dud" items that serve no purpose but allow for more tasks in the pool. + """ + display_name = "Enable Duds" + + +class DudCount(Range): + """ + How many "Dud" items to include in the pool. This setting is ignored if "Enable Duds" is not included + """ + display_name = "Dud Item Count" + range_start = 0 + range_end = 30 + default = 10 + + +class EnableCarePacks(Toggle): + """ + Whether or not to include useful "Care Pack" items that allow you to trade over specific items. + Note: Requires your account NOT to be an Ironman. Also, requires access to another account to trade over the items, + or gold to purchase off of the grand exchange. + """ + display_name = "Enable Care Packs" + class MaxCombatLevel(Range): """ The highest combat level of monster to possibly be assigned as a task. @@ -472,6 +498,9 @@ class OSRSOptions(PerGameCommonOptions): starting_area: StartingArea brutal_grinds: BrutalGrinds progressive_tasks: ProgressiveTasks + enable_duds: EnableDuds + dud_count: DudCount + enable_carepacks: EnableCarePacks max_combat_level: MaxCombatLevel max_combat_tasks: MaxCombatTasks combat_task_weight: CombatTaskWeight diff --git a/worlds/osrs/Rules.py b/worlds/osrs/Rules.py index 22a19934c8..7fd770f0f7 100644 --- a/worlds/osrs/Rules.py +++ b/worlds/osrs/Rules.py @@ -212,11 +212,14 @@ def get_skill_rule(skill, level, player, options) -> CollectionRule: return lambda state: True -def generate_special_rules_for(entrance, region_row, outbound_region_name, player, options): +def generate_special_rules_for(entrance, region_row, outbound_region_name, player, options, world): if outbound_region_name == RegionNames.Cooks_Guild: add_rule(entrance, get_cooking_skill_rule(32, player, options)) + # Since there's goblins in this chunk, checking for hat access is superfluous, you'd always have it anyway elif outbound_region_name == RegionNames.Crafting_Guild: add_rule(entrance, get_crafting_skill_rule(40, player, options)) + # Literally the only brown apron access in the entirety of f2p is buying it in varrock + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Central_Varrock, player)) elif outbound_region_name == RegionNames.Corsair_Cove: # Need to be able to start Corsair Curse in addition to having the item add_rule(entrance, lambda state: state.can_reach(RegionNames.Falador_Farm, "Region", player)) @@ -224,6 +227,17 @@ def generate_special_rules_for(entrance, region_row, outbound_region_name, playe add_rule(entrance, lambda state: state.has(ItemNames.QP_Below_Ice_Mountain, player)) elif region_row.name == "Dwarven Mountain Pass" and outbound_region_name == "Anvil*": add_rule(entrance, lambda state: state.has(ItemNames.QP_Dorics_Quest, player)) + elif outbound_region_name == RegionNames.Crandor: + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.South_Of_Varrock, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Edgeville, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Lumbridge, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Rimmington, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Monastery, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Dwarven_Mines, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Port_Sarim, player)) + add_rule(entrance, lambda state: state.can_reach_region(RegionNames.Draynor_Village, player)) + add_rule(entrance, lambda state: world.quest_points(state) >= 32) + # Special logic for canoes canoe_regions = [RegionNames.Lumbridge, RegionNames.South_Of_Varrock, RegionNames.Barbarian_Village, diff --git a/worlds/osrs/__init__.py b/worlds/osrs/__init__.py index d6ddd63875..9e439fe52c 100644 --- a/worlds/osrs/__init__.py +++ b/worlds/osrs/__init__.py @@ -168,7 +168,7 @@ class OSRSWorld(World): item_name = self.region_rows_by_name[parsed_outbound].itemReq entrance.access_rule = lambda state, item_name=item_name.replace("*",""): state.has(item_name, self.player) - generate_special_rules_for(entrance, region_row, outbound_region_name, self.player, self.options) + generate_special_rules_for(entrance, region_row, outbound_region_name, self.player, self.options, self) for resource_region in region_row.resources: if not resource_region: @@ -179,7 +179,7 @@ class OSRSWorld(World): entrance.connect(self.region_name_to_data[resource_region]) else: entrance.connect(self.region_name_to_data[resource_region.replace('*', '')]) - generate_special_rules_for(entrance, region_row, resource_region, self.player, self.options) + generate_special_rules_for(entrance, region_row, resource_region, self.player, self.options, self) self.roll_locations() @@ -195,7 +195,16 @@ class OSRSWorld(World): generation_is_fake = hasattr(self.multiworld, "generation_is_fake") # UT specific override locations_required = 0 for item_row in item_rows: + # If it's a filler item, set it aside for later + if item_row.progression == ItemClassification.filler: + continue + + # If it starts with "Care Pack", only add it if Care Packs are enabled + if item_row.name.startswith("Care Pack"): + if not self.options.enable_carepacks: + continue locations_required += item_row.amount + if self.options.enable_duds: locations_required += self.options.dud_count locations_added = 1 # At this point we've already added the starting area, so we start at 1 instead of 0 @@ -232,6 +241,7 @@ class OSRSWorld(World): max_amount_for_task_type = getattr(self.options, f"max_{task_type}_tasks") tasks_for_this_type = [task for task in self.locations_by_category[task_type] if self.task_within_skill_levels(task.skills)] + max_amount_for_task_type = min(max_amount_for_task_type, len(tasks_for_this_type)) if not self.options.progressive_tasks: rnd.shuffle(tasks_for_this_type) else: @@ -286,16 +296,36 @@ class OSRSWorld(World): self.create_and_add_location(index) def create_items(self) -> None: + filler_items = [] for item_row in item_rows: if item_row.name != self.starting_area_item: + # If it's a filler item, set it aside for later + if item_row.progression == ItemClassification.filler: + filler_items.append(item_row) + continue + + # If it starts with "Care Pack", only add it if Care Packs are enabled + if item_row.name.startswith("Care Pack"): + if not self.options.enable_carepacks: + continue + for c in range(item_row.amount): item = self.create_item(item_row.name) self.multiworld.itempool.append(item) + if self.options.enable_duds: + self.random.shuffle(filler_items) + filler_items = filler_items[0:self.options.dud_count] + for item_row in filler_items: + item = self.create_item(item_row.name) + self.multiworld.itempool.append(item) def get_filler_item_name(self) -> str: - return self.random.choice( - [ItemNames.Progressive_Armor, ItemNames.Progressive_Weapons, ItemNames.Progressive_Magic, - ItemNames.Progressive_Tools, ItemNames.Progressive_Range_Armor, ItemNames.Progressive_Range_Weapon]) + if self.options.enable_duds: + return self.random.choice([item for item in item_rows if item.progression == ItemClassification.filler]) + else: + return self.random.choice([ItemNames.Progressive_Weapons, ItemNames.Progressive_Magic, + ItemNames.Progressive_Range_Weapon, ItemNames.Progressive_Armor, + ItemNames.Progressive_Range_Armor, ItemNames.Progressive_Tools]) def create_and_add_location(self, row_index) -> None: location_row = location_rows[row_index] From bcd7d62d0bd6f1c72a2727cf15ba931ca5c9bad4 Mon Sep 17 00:00:00 2001 From: kbranch Date: Wed, 7 May 2025 14:53:58 -0400 Subject: [PATCH 117/199] LADX: Improve Fake Tracker Items (#4897) --- LinksAwakeningClient.py | 20 ++++++++++++++------ worlds/ladx/ItemTracker.py | 3 +-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index 16896540d6..14aaa415f1 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -33,7 +33,7 @@ from worlds.ladx.TrackerConsts import storage_key from worlds.ladx.ItemTracker import ItemTracker from worlds.ladx.LADXR.checkMetadata import checkMetadataTable from worlds.ladx.Locations import get_locations_to_id, meta_to_name -from worlds.ladx.Tracker import LocationTracker, MagpieBridge +from worlds.ladx.Tracker import LocationTracker, MagpieBridge, Check class GameboyException(Exception): @@ -626,6 +626,11 @@ class LinksAwakeningContext(CommonContext): "password": self.password, }) + # We can process linked items on already-checked checks now that we have slot_data + if self.client.tracker: + checked_checks = set(self.client.tracker.all_checks) - set(self.client.tracker.remaining_checks) + self.add_linked_items(checked_checks) + # TODO - use watcher_event if cmd == "ReceivedItems": for index, item in enumerate(args["items"], start=args["index"]): @@ -641,6 +646,13 @@ class LinksAwakeningContext(CommonContext): sync_msg = [{'cmd': 'Sync'}] await self.send_msgs(sync_msg) + def add_linked_items(self, checks: typing.List[Check]): + for check in checks: + if check.value and check.linkedItem: + linkedItem = check.linkedItem + if 'condition' not in linkedItem or (self.slot_data and linkedItem['condition'](self.slot_data)): + self.client.item_tracker.setExtraItem(check.linkedItem['item'], check.linkedItem['qty']) + item_id_lookup = get_locations_to_id() async def run_game_loop(self): @@ -649,11 +661,7 @@ class LinksAwakeningContext(CommonContext): checkMetadataTable[check.id])] for check in ladxr_checks] self.new_checks(checks, [check.id for check in ladxr_checks]) - for check in ladxr_checks: - if check.value and check.linkedItem: - linkedItem = check.linkedItem - if 'condition' not in linkedItem or linkedItem['condition'](self.slot_data): - self.client.item_tracker.setExtraItem(check.linkedItem['item'], check.linkedItem['qty']) + self.add_linked_items(ladxr_checks) async def victory(): await self.send_victory() diff --git a/worlds/ladx/ItemTracker.py b/worlds/ladx/ItemTracker.py index b288bba843..981fd42d2a 100644 --- a/worlds/ladx/ItemTracker.py +++ b/worlds/ladx/ItemTracker.py @@ -151,8 +151,7 @@ class ItemTracker: def __init__(self, gameboy) -> None: self.gameboy = gameboy self.loadItems() - pass - extraItems = {} + self.extraItems = {} async def readRamByte(self, byte): return (await self.gameboy.read_memory_cache([byte]))[byte] From b0f42466f0003ab02b408dda6189f94455f6f675 Mon Sep 17 00:00:00 2001 From: digiholic Date: Thu, 8 May 2025 11:31:00 -0600 Subject: [PATCH 118/199] MMBN3: Adds Beach Access to Help With Rehab Job Bonus Reward Check (#4963) --- worlds/mmbn3/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worlds/mmbn3/__init__.py b/worlds/mmbn3/__init__.py index 08165a7df6..507ddbc21f 100644 --- a/worlds/mmbn3/__init__.py +++ b/worlds/mmbn3/__init__.py @@ -278,6 +278,9 @@ class MMBN3World(World): self.multiworld.get_location(LocationName.Help_with_rehab, self.player).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) + self.multiworld.get_location(LocationName.Help_with_rehab_bonus, self.player).access_rule = \ + lambda state: \ + state.can_reach_region(RegionName.Beach_Overworld, self.player) self.multiworld.get_location(LocationName.Old_Master, self.player).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) and \ From 9a8abeac2821d38920e177831b5fb49cb63a3e76 Mon Sep 17 00:00:00 2001 From: palex00 <32203971+palex00@users.noreply.github.com> Date: Fri, 9 May 2025 16:27:43 +0200 Subject: [PATCH 119/199] Add blurb about patch files to the host page (#4974) --- WebHostLib/templates/hostGame.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WebHostLib/templates/hostGame.html b/WebHostLib/templates/hostGame.html index d7d0a96331..3840635153 100644 --- a/WebHostLib/templates/hostGame.html +++ b/WebHostLib/templates/hostGame.html @@ -17,7 +17,9 @@ This page allows you to host a game which was not generated by the website. For example, if you have generated a game on your own computer, you may upload the zip file created by the generator to host the game here. This will also provide a tracker, and the ability for your players to download - their patch files. + their patch files if the game is core-verified. For Custom Games, you can find the patch files in + the output .zip file you are uploading here. You need to manually distribute those patch files to + your players.

In addition to the zip file created by the generator, you may upload a multidata file here as well.

From cbfcaeba8be2a2b740148f786f0d2b302bdc6f25 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 10 May 2025 00:05:18 +0200 Subject: [PATCH 120/199] Subnautica: use less multiworld API (#4977) --- worlds/subnautica/rules.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/worlds/subnautica/rules.py b/worlds/subnautica/rules.py index ea9ec6a805..8f90af9b13 100644 --- a/worlds/subnautica/rules.py +++ b/worlds/subnautica/rules.py @@ -254,8 +254,8 @@ def can_access_location(state: "CollectionState", player: int, loc: LocationDict return get_max_depth(state, player) >= depth -def set_location_rule(world, player: int, loc: LocationDict): - set_rule(world.get_location(loc["name"], player), lambda state: can_access_location(state, player, loc)) +def set_location_rule(world: "SubnauticaWorld", player: int, loc: LocationDict): + set_rule(world.get_location(loc["name"]), lambda state: can_access_location(state, player, loc)) def can_scan_creature(state: "CollectionState", player: int, creature: str) -> bool: @@ -264,8 +264,8 @@ def can_scan_creature(state: "CollectionState", player: int, creature: str) -> b return get_max_depth(state, player) >= all_creatures[creature] -def set_creature_rule(world, player: int, creature_name: str) -> "Location": - location = world.get_location(creature_name + suffix, player) +def set_creature_rule(world: "SubnauticaWorld", player: int, creature_name: str) -> "Location": + location = world.get_location(creature_name + suffix) set_rule(location, lambda state: can_scan_creature(state, player, creature_name)) return location @@ -290,16 +290,15 @@ aggression_rules: Dict[int, Callable[["CollectionState", int], bool]] = { def set_rules(subnautica_world: "SubnauticaWorld"): player = subnautica_world.player - multiworld = subnautica_world.multiworld for loc in location_table.values(): - set_location_rule(multiworld, player, loc) + set_location_rule(subnautica_world, player, loc) if subnautica_world.creatures_to_scan: - option = multiworld.worlds[player].options.creature_scan_logic + option = subnautica_world.options.creature_scan_logic for creature_name in subnautica_world.creatures_to_scan: - location = set_creature_rule(multiworld, player, creature_name) + location = set_creature_rule(subnautica_world, player, creature_name) if creature_name in containment: # there is no other way, hard-required containment add_rule(location, lambda state: has_containment(state, player)) elif creature_name in aggressive: @@ -309,7 +308,7 @@ def set_rules(subnautica_world: "SubnauticaWorld"): lambda state, loc_rule=get_aggression_rule(option, creature_name): loc_rule(state, player)) # Victory locations - set_rule(multiworld.get_location("Neptune Launch", player), + set_rule(subnautica_world.get_location("Neptune Launch"), lambda state: get_max_depth(state, player) >= 1444 and has_mobile_vehicle_bay(state, player) and @@ -322,14 +321,14 @@ def set_rules(subnautica_world: "SubnauticaWorld"): state.has("Ion Battery", player) and has_cyclops_shield(state, player)) - set_rule(multiworld.get_location("Disable Quarantine", player), + set_rule(subnautica_world.get_location("Disable Quarantine"), lambda state: get_max_depth(state, player) >= 1444) - set_rule(multiworld.get_location("Full Infection", player), + set_rule(subnautica_world.get_location("Full Infection"), lambda state: get_max_depth(state, player) >= 900) - room = multiworld.get_location("Aurora Drive Room - Upgrade Console", player) - set_rule(multiworld.get_location("Repair Aurora Drive", player), + room = subnautica_world.get_location("Aurora Drive Room - Upgrade Console") + set_rule(subnautica_world.get_location("Repair Aurora Drive"), lambda state: room.can_reach(state)) - multiworld.completion_condition[player] = lambda state: state.has("Victory", player) + subnautica_world.multiworld.completion_condition[player] = lambda state: state.has("Victory", player) From 4e61f1f23c14c20d244766c3c33c8a302d600f29 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 10 May 2025 04:11:39 +0200 Subject: [PATCH 121/199] Core: Institute limit of 10000 items on StartInventory (#4972) * Institute limit on StartInventory * Update Options.py * Update Options.py Co-authored-by: Scipio Wright * Update Options.py --------- Co-authored-by: Scipio Wright --- Options.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Options.py b/Options.py index bea3804d1e..41c2a77d3a 100644 --- a/Options.py +++ b/Options.py @@ -1353,6 +1353,7 @@ class StartInventory(ItemDict): verify_item_name = True display_name = "Start Inventory" rich_text_doc = True + max = 10000 class StartInventoryPool(StartInventory): From 5f24da7e181def3ac51930c931bca164dbc1910b Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Sat, 10 May 2025 23:20:43 +1000 Subject: [PATCH 122/199] Core: Use the location of Utils.py rather than __main__ to determine the AP Folder (#4009) --- Utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Utils.py b/Utils.py index a3a529d754..f930335b24 100644 --- a/Utils.py +++ b/Utils.py @@ -139,8 +139,11 @@ def local_path(*path: str) -> str: local_path.cached_path = os.path.dirname(os.path.abspath(sys.argv[0])) else: import __main__ - if hasattr(__main__, "__file__") and os.path.isfile(__main__.__file__): + if globals().get("__file__") and os.path.isfile(__file__): # we are running in a normal Python environment + local_path.cached_path = os.path.dirname(os.path.abspath(__file__)) + elif hasattr(__main__, "__file__") and os.path.isfile(__main__.__file__): + # we are running in a normal Python environment, but AP was imported weirdly local_path.cached_path = os.path.dirname(os.path.abspath(__main__.__file__)) else: # pray From 8f71dac417a901f2175ee5ee65e2a9bbf8789596 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Sat, 10 May 2025 17:57:24 -0400 Subject: [PATCH 123/199] Stardew valley: Add Trap Distribution setting (#4601) Co-authored-by: Jouramie <16137441+Jouramie@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/stardew_valley/__init__.py | 8 +- worlds/stardew_valley/items/__init__.py | 1 + .../{items.py => items/item_creation.py} | 200 ++++-------------- worlds/stardew_valley/items/item_data.py | 143 +++++++++++++ worlds/stardew_valley/options/__init__.py | 4 +- .../stardew_valley/options/option_groups.py | 3 +- worlds/stardew_valley/options/options.py | 61 +++++- worlds/stardew_valley/options/presets.py | 16 +- worlds/stardew_valley/test/TestGeneration.py | 20 +- worlds/stardew_valley/test/TestItemLink.py | 8 +- worlds/stardew_valley/test/TestOptions.py | 8 +- worlds/stardew_valley/test/TestTraps.py | 122 +++++++++++ worlds/stardew_valley/test/__init__.py | 27 ++- .../test/options/TestPresets.py | 8 +- worlds/stardew_valley/test/options/presets.py | 6 +- 15 files changed, 426 insertions(+), 209 deletions(-) create mode 100644 worlds/stardew_valley/items/__init__.py rename worlds/stardew_valley/{items.py => items/item_creation.py} (86%) create mode 100644 worlds/stardew_valley/items/item_data.py create mode 100644 worlds/stardew_valley/test/TestTraps.py diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index f48c9bc1a4..9a05c04d51 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -10,11 +10,13 @@ from .bundles.bundle_room import BundleRoom from .bundles.bundles import get_all_bundles from .content import StardewContent, create_content from .early_items import setup_early_items -from .items import item_table, create_items, ItemData, Group, items_by_group, generate_filler_choice_pool +from .items import item_table, ItemData, Group, items_by_group +from .items.item_creation import create_items, get_all_filler_items, remove_limited_amount_packs, \ + generate_filler_choice_pool from .locations import location_table, create_locations, LocationData, locations_by_tag from .logic.logic import StardewLogic -from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, EnabledFillerBuffs, NumberOfMovementBuffs, \ - BuildingProgression, EntranceRandomization, FarmType +from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, EnabledFillerBuffs, \ + NumberOfMovementBuffs, BuildingProgression, EntranceRandomization, FarmType from .options.forced_options import force_change_options_if_incompatible from .options.option_groups import sv_option_groups from .options.presets import sv_options_presets diff --git a/worlds/stardew_valley/items/__init__.py b/worlds/stardew_valley/items/__init__.py new file mode 100644 index 0000000000..ddf5e69f68 --- /dev/null +++ b/worlds/stardew_valley/items/__init__.py @@ -0,0 +1 @@ +from .item_data import item_table, ItemData, Group, items_by_group, load_item_csv diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items/item_creation.py similarity index 86% rename from worlds/stardew_valley/items.py rename to worlds/stardew_valley/items/item_creation.py index a0f901a209..6928ca8b66 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items/item_creation.py @@ -1,165 +1,26 @@ -import csv -import enum import logging -from dataclasses import dataclass, field -from functools import reduce -from pathlib import Path from random import Random -from typing import Dict, List, Protocol, Union, Set, Optional +from typing import List, Set from BaseClasses import Item, ItemClassification -from . import data -from .content.feature import friendsanity -from .content.game_content import StardewContent -from .data.game_item import ItemTag -from .logic.logic_event import all_events -from .mods.mod_data import ModNames -from .options import StardewValleyOptions, TrapItems, FestivalLocations, ExcludeGingerIsland, SpecialOrderLocations, SeasonRandomization, Museumsanity, \ +from .item_data import StardewItemFactory, items_by_group, Group, item_table, ItemData +from ..content.feature import friendsanity +from ..content.game_content import StardewContent +from ..data.game_item import ItemTag +from ..mods.mod_data import ModNames +from ..options import StardewValleyOptions, FestivalLocations, ExcludeGingerIsland, SpecialOrderLocations, SeasonRandomization, Museumsanity, \ ElevatorProgression, BackpackProgression, ArcadeMachineLocations, Monstersanity, Goal, \ - Chefsanity, Craftsanity, BundleRandomization, EntranceRandomization, Shipsanity, Walnutsanity, EnabledFillerBuffs -from .strings.ap_names.ap_option_names import BuffOptionName, WalnutsanityOptionName -from .strings.ap_names.ap_weapon_names import APWeapon -from .strings.ap_names.buff_names import Buff -from .strings.ap_names.community_upgrade_names import CommunityUpgrade -from .strings.ap_names.mods.mod_items import SVEQuestItem -from .strings.currency_names import Currency -from .strings.tool_names import Tool -from .strings.wallet_item_names import Wallet - -ITEM_CODE_OFFSET = 717000 + Chefsanity, Craftsanity, BundleRandomization, EntranceRandomization, Shipsanity, Walnutsanity, EnabledFillerBuffs, TrapDifficulty +from ..strings.ap_names.ap_option_names import BuffOptionName, WalnutsanityOptionName +from ..strings.ap_names.ap_weapon_names import APWeapon +from ..strings.ap_names.buff_names import Buff +from ..strings.ap_names.community_upgrade_names import CommunityUpgrade +from ..strings.ap_names.mods.mod_items import SVEQuestItem +from ..strings.currency_names import Currency +from ..strings.tool_names import Tool +from ..strings.wallet_item_names import Wallet logger = logging.getLogger(__name__) -world_folder = Path(__file__).parent - - -class Group(enum.Enum): - RESOURCE_PACK = enum.auto() - FRIENDSHIP_PACK = enum.auto() - COMMUNITY_REWARD = enum.auto() - TRASH = enum.auto() - FOOTWEAR = enum.auto() - HATS = enum.auto() - RING = enum.auto() - WEAPON = enum.auto() - WEAPON_GENERIC = enum.auto() - WEAPON_SWORD = enum.auto() - WEAPON_CLUB = enum.auto() - WEAPON_DAGGER = enum.auto() - WEAPON_SLINGSHOT = enum.auto() - PROGRESSIVE_TOOLS = enum.auto() - SKILL_LEVEL_UP = enum.auto() - SKILL_MASTERY = enum.auto() - BUILDING = enum.auto() - WIZARD_BUILDING = enum.auto() - ARCADE_MACHINE_BUFFS = enum.auto() - BASE_RESOURCE = enum.auto() - WARP_TOTEM = enum.auto() - GEODE = enum.auto() - ORE = enum.auto() - FERTILIZER = enum.auto() - SEED = enum.auto() - CROPSANITY = enum.auto() - FISHING_RESOURCE = enum.auto() - SEASON = enum.auto() - TRAVELING_MERCHANT_DAY = enum.auto() - MUSEUM = enum.auto() - FRIENDSANITY = enum.auto() - FESTIVAL = enum.auto() - RARECROW = enum.auto() - TRAP = enum.auto() - BONUS = enum.auto() - MAXIMUM_ONE = enum.auto() - AT_LEAST_TWO = enum.auto() - DEPRECATED = enum.auto() - RESOURCE_PACK_USEFUL = enum.auto() - SPECIAL_ORDER_BOARD = enum.auto() - SPECIAL_ORDER_QI = enum.auto() - BABY = enum.auto() - GINGER_ISLAND = enum.auto() - WALNUT_PURCHASE = enum.auto() - TV_CHANNEL = enum.auto() - QI_CRAFTING_RECIPE = enum.auto() - CHEFSANITY = enum.auto() - CHEFSANITY_STARTER = enum.auto() - CHEFSANITY_QOS = enum.auto() - CHEFSANITY_PURCHASE = enum.auto() - CHEFSANITY_FRIENDSHIP = enum.auto() - CHEFSANITY_SKILL = enum.auto() - CRAFTSANITY = enum.auto() - BOOK_POWER = enum.auto() - LOST_BOOK = enum.auto() - PLAYER_BUFF = enum.auto() - # Mods - MAGIC_SPELL = enum.auto() - MOD_WARP = enum.auto() - - -@dataclass(frozen=True) -class ItemData: - code_without_offset: Optional[int] - name: str - classification: ItemClassification - mod_name: Optional[str] = None - groups: Set[Group] = field(default_factory=frozenset) - - def __post_init__(self): - if not isinstance(self.groups, frozenset): - super().__setattr__("groups", frozenset(self.groups)) - - @property - def code(self): - return ITEM_CODE_OFFSET + self.code_without_offset if self.code_without_offset is not None else None - - def has_any_group(self, *group: Group) -> bool: - groups = set(group) - return bool(groups.intersection(self.groups)) - - -class StardewItemFactory(Protocol): - def __call__(self, name: Union[str, ItemData], override_classification: ItemClassification = None) -> Item: - raise NotImplementedError - - -def load_item_csv(): - from importlib.resources import files - - items = [] - with files(data).joinpath("items.csv").open() as file: - item_reader = csv.DictReader(file) - for item in item_reader: - id = int(item["id"]) if item["id"] else None - classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) - groups = {Group[group] for group in item["groups"].split(",") if group} - mod_name = str(item["mod_name"]) if item["mod_name"] else None - items.append(ItemData(id, item["name"], classification, mod_name, groups)) - return items - - -events = [ - ItemData(None, e, ItemClassification.progression) - for e in sorted(all_events) -] - -all_items: List[ItemData] = load_item_csv() + events -item_table: Dict[str, ItemData] = {} -items_by_group: Dict[Group, List[ItemData]] = {} - - -def initialize_groups(): - for item in all_items: - for group in item.groups: - item_group = items_by_group.get(group, list()) - item_group.append(item) - items_by_group[group] = item_group - - -def initialize_item_table(): - item_table.update({item.name: item for item in all_items}) - - -initialize_item_table() -initialize_groups() - def get_too_many_items_error_message(locations_count: int, items_count: int) -> str: return f"There should be at least as many locations [{locations_count}] as there are mandatory items [{items_count}]" @@ -712,13 +573,15 @@ def weapons_count(options: StardewValleyOptions): def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options: StardewValleyOptions, random: Random, items_already_added: List[Item], available_item_slots: int) -> List[Item]: - include_traps = options.trap_items != TrapItems.option_no_traps + include_traps = options.trap_difficulty != TrapDifficulty.option_no_traps items_already_added_names = [item.name for item in items_already_added] useful_resource_packs = [pack for pack in items_by_group[Group.RESOURCE_PACK_USEFUL] if pack.name not in items_already_added_names] trap_items = [trap for trap in items_by_group[Group.TRAP] if trap.name not in items_already_added_names and - (trap.mod_name is None or trap.mod_name in options.mods)] + Group.DEPRECATED not in trap.groups and + (trap.mod_name is None or trap.mod_name in options.mods) and + options.trap_distribution[trap.name] > 0] player_buffs = get_allowed_player_buffs(options.enabled_filler_buffs) priority_filler_items = [] @@ -750,11 +613,13 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options (filler_pack.name not in [priority_item.name for priority_item in priority_filler_items] and filler_pack.name not in items_already_added_names)] + filler_weights = get_filler_weights(options, all_filler_packs) + while available_item_slots > 0: - resource_pack = random.choice(all_filler_packs) + resource_pack = random.choices(all_filler_packs, weights=filler_weights, k=1)[0] exactly_2 = Group.AT_LEAST_TWO in resource_pack.groups while exactly_2 and available_item_slots == 1: - resource_pack = random.choice(all_filler_packs) + resource_pack = random.choices(all_filler_packs, weights=filler_weights, k=1)[0] exactly_2 = Group.AT_LEAST_TWO in resource_pack.groups classification = ItemClassification.useful if resource_pack.classification == ItemClassification.progression else resource_pack.classification items.append(item_factory(resource_pack, classification)) @@ -763,11 +628,24 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options items.append(item_factory(resource_pack, classification)) available_item_slots -= 1 if exactly_2 or Group.MAXIMUM_ONE in resource_pack.groups: - all_filler_packs.remove(resource_pack) + index = all_filler_packs.index(resource_pack) + all_filler_packs.pop(index) + filler_weights.pop(index) return items +def get_filler_weights(options: StardewValleyOptions, all_filler_packs: List[ItemData]): + weights = [] + for filler in all_filler_packs: + if filler.name in options.trap_distribution: + num = options.trap_distribution[filler.name] + else: + num = options.trap_distribution.default_weight + weights.append(num) + return weights + + def filter_deprecated_items(items: List[ItemData]) -> List[ItemData]: return [item for item in items if Group.DEPRECATED not in item.groups] @@ -792,7 +670,7 @@ def remove_excluded_items_island_mods(items, exclude_ginger_island: bool, mods: def generate_filler_choice_pool(options: StardewValleyOptions) -> list[str]: - include_traps = options.trap_items != TrapItems.option_no_traps + include_traps = options.trap_difficulty != TrapDifficulty.option_no_traps exclude_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true available_filler = get_all_filler_items(include_traps, exclude_island) diff --git a/worlds/stardew_valley/items/item_data.py b/worlds/stardew_valley/items/item_data.py new file mode 100644 index 0000000000..e7c3779e27 --- /dev/null +++ b/worlds/stardew_valley/items/item_data.py @@ -0,0 +1,143 @@ +import csv +import enum +from dataclasses import dataclass, field +from functools import reduce +from pathlib import Path +from typing import Dict, List, Protocol, Union, Set, Optional + +from BaseClasses import Item, ItemClassification +from .. import data +from ..logic.logic_event import all_events + +ITEM_CODE_OFFSET = 717000 + +world_folder = Path(__file__).parent + + +class Group(enum.Enum): + RESOURCE_PACK = enum.auto() + FRIENDSHIP_PACK = enum.auto() + COMMUNITY_REWARD = enum.auto() + TRASH = enum.auto() + FOOTWEAR = enum.auto() + HATS = enum.auto() + RING = enum.auto() + WEAPON = enum.auto() + WEAPON_GENERIC = enum.auto() + WEAPON_SWORD = enum.auto() + WEAPON_CLUB = enum.auto() + WEAPON_DAGGER = enum.auto() + WEAPON_SLINGSHOT = enum.auto() + PROGRESSIVE_TOOLS = enum.auto() + SKILL_LEVEL_UP = enum.auto() + SKILL_MASTERY = enum.auto() + BUILDING = enum.auto() + WIZARD_BUILDING = enum.auto() + ARCADE_MACHINE_BUFFS = enum.auto() + BASE_RESOURCE = enum.auto() + WARP_TOTEM = enum.auto() + GEODE = enum.auto() + ORE = enum.auto() + FERTILIZER = enum.auto() + SEED = enum.auto() + CROPSANITY = enum.auto() + FISHING_RESOURCE = enum.auto() + SEASON = enum.auto() + TRAVELING_MERCHANT_DAY = enum.auto() + MUSEUM = enum.auto() + FRIENDSANITY = enum.auto() + FESTIVAL = enum.auto() + RARECROW = enum.auto() + TRAP = enum.auto() + BONUS = enum.auto() + MAXIMUM_ONE = enum.auto() + AT_LEAST_TWO = enum.auto() + DEPRECATED = enum.auto() + RESOURCE_PACK_USEFUL = enum.auto() + SPECIAL_ORDER_BOARD = enum.auto() + SPECIAL_ORDER_QI = enum.auto() + BABY = enum.auto() + GINGER_ISLAND = enum.auto() + WALNUT_PURCHASE = enum.auto() + TV_CHANNEL = enum.auto() + QI_CRAFTING_RECIPE = enum.auto() + CHEFSANITY = enum.auto() + CHEFSANITY_STARTER = enum.auto() + CHEFSANITY_QOS = enum.auto() + CHEFSANITY_PURCHASE = enum.auto() + CHEFSANITY_FRIENDSHIP = enum.auto() + CHEFSANITY_SKILL = enum.auto() + CRAFTSANITY = enum.auto() + BOOK_POWER = enum.auto() + LOST_BOOK = enum.auto() + PLAYER_BUFF = enum.auto() + # Mods + MAGIC_SPELL = enum.auto() + MOD_WARP = enum.auto() + + +@dataclass(frozen=True) +class ItemData: + code_without_offset: Optional[int] + name: str + classification: ItemClassification + mod_name: Optional[str] = None + groups: Set[Group] = field(default_factory=frozenset) + + def __post_init__(self): + if not isinstance(self.groups, frozenset): + super().__setattr__("groups", frozenset(self.groups)) + + @property + def code(self): + return ITEM_CODE_OFFSET + self.code_without_offset if self.code_without_offset is not None else None + + def has_any_group(self, *group: Group) -> bool: + groups = set(group) + return bool(groups.intersection(self.groups)) + + +class StardewItemFactory(Protocol): + def __call__(self, name: Union[str, ItemData], override_classification: ItemClassification = None) -> Item: + raise NotImplementedError + + +def load_item_csv(): + from importlib.resources import files + + items = [] + with files(data).joinpath("items.csv").open() as file: + item_reader = csv.DictReader(file) + for item in item_reader: + id = int(item["id"]) if item["id"] else None + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) + groups = {Group[group] for group in item["groups"].split(",") if group} + mod_name = str(item["mod_name"]) if item["mod_name"] else None + items.append(ItemData(id, item["name"], classification, mod_name, groups)) + return items + + +events = [ + ItemData(None, e, ItemClassification.progression) + for e in sorted(all_events) +] + +all_items: List[ItemData] = load_item_csv() + events +item_table: Dict[str, ItemData] = {} +items_by_group: Dict[Group, List[ItemData]] = {} + + +def initialize_groups(): + for item in all_items: + for group in item.groups: + item_group = items_by_group.get(group, list()) + item_group.append(item) + items_by_group[group] = item_group + + +def initialize_item_table(): + item_table.update({item.name: item for item in all_items}) + + +initialize_item_table() +initialize_groups() diff --git a/worlds/stardew_valley/options/__init__.py b/worlds/stardew_valley/options/__init__.py index 713d3e9537..12c0d7c647 100644 --- a/worlds/stardew_valley/options/__init__.py +++ b/worlds/stardew_valley/options/__init__.py @@ -1,6 +1,6 @@ from .options import StardewValleyOption, Goal, FarmType, StartingMoney, ProfitMargin, BundleRandomization, BundlePrice, EntranceRandomization, \ SeasonRandomization, Cropsanity, BackpackProgression, ToolProgression, ElevatorProgression, SkillProgression, BuildingProgression, FestivalLocations, \ ArcadeMachineLocations, SpecialOrderLocations, QuestLocations, Fishsanity, Museumsanity, Monstersanity, Shipsanity, Cooksanity, Chefsanity, Craftsanity, \ - Friendsanity, FriendsanityHeartSize, Booksanity, Walnutsanity, NumberOfMovementBuffs, EnabledFillerBuffs, ExcludeGingerIsland, TrapItems, \ + Friendsanity, FriendsanityHeartSize, Booksanity, Walnutsanity, NumberOfMovementBuffs, EnabledFillerBuffs, ExcludeGingerIsland, TrapDifficulty, \ MultipleDaySleepEnabled, MultipleDaySleepCost, ExperienceMultiplier, FriendshipMultiplier, DebrisMultiplier, QuickStart, Gifting, Mods, BundlePlando, \ - StardewValleyOptions, enabled_mods, disabled_mods, all_mods + StardewValleyOptions, enabled_mods, disabled_mods, all_mods, TrapDistribution, TrapItems, StardewValleyOptions diff --git a/worlds/stardew_valley/options/option_groups.py b/worlds/stardew_valley/options/option_groups.py index bcb9bee77f..4ae1fc3c4d 100644 --- a/worlds/stardew_valley/options/option_groups.py +++ b/worlds/stardew_valley/options/option_groups.py @@ -52,7 +52,8 @@ else: options.DebrisMultiplier, options.NumberOfMovementBuffs, options.EnabledFillerBuffs, - options.TrapItems, + options.TrapDifficulty, + options.TrapDistribution, options.MultipleDaySleepEnabled, options.MultipleDaySleepCost, options.QuickStart, diff --git a/worlds/stardew_valley/options/options.py b/worlds/stardew_valley/options/options.py index 84026387c5..f81cdaac81 100644 --- a/worlds/stardew_valley/options/options.py +++ b/worlds/stardew_valley/options/options.py @@ -3,7 +3,8 @@ import typing from dataclasses import dataclass from typing import Protocol, ClassVar -from Options import Range, NamedRange, Toggle, Choice, OptionSet, PerGameCommonOptions, DeathLink, OptionList, Visibility +from Options import Range, NamedRange, Toggle, Choice, OptionSet, PerGameCommonOptions, DeathLink, OptionList, Visibility, Removed, OptionCounter +from ..items import items_by_group, Group from ..mods.mod_data import ModNames from ..strings.ap_names.ap_option_names import BuffOptionName, WalnutsanityOptionName from ..strings.bundle_names import all_cc_bundle_names @@ -658,13 +659,29 @@ class ExcludeGingerIsland(Toggle): default = 0 -class TrapItems(Choice): - """When rolling filler items, including resource packs, the game can also roll trap items. - Trap items are negative items that cause problems or annoyances for the player - This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. +class TrapItems(Removed): + """Deprecated setting, replaced by TrapDifficulty """ internal_name = "trap_items" display_name = "Trap Items" + default = "" + visibility = Visibility.none + + def __init__(self, value: str): + if value: + raise Exception("Option trap_items was replaced by trap_difficulty, please update your options file") + super().__init__(value) + + +class TrapDifficulty(Choice): + """When rolling filler items, including resource packs, the game can also roll trap items. + Trap items are negative items that cause problems or annoyances for the player. + This setting is for choosing how punishing traps will be. + Lower difficulties will be on the funny annoyance side, higher difficulty will be on the extreme problems side. + Only play Nightmare at your own risk. + """ + internal_name = "trap_difficulty" + display_name = "Trap Difficulty" default = 2 option_no_traps = 0 option_easy = 1 @@ -674,6 +691,34 @@ class TrapItems(Choice): option_nightmare = 5 +trap_default_weight = 100 + + +class TrapDistribution(OptionCounter): + """ + Specify the weighted chance of rolling individual traps when rolling random filler items. + The average filler item should be considered to be "100", as in 100%. + So a trap on "200" will be twice as likely to roll as any filler item. A trap on "10" will be 10% as likely. + You can use weight "0" to disable this trap entirely. The maximum weight is 1000, for x10 chance + """ + internal_name = "trap_distribution" + display_name = "Trap Distribution" + default_weight = trap_default_weight + visibility = Visibility.all ^ Visibility.simple_ui + min = 0 + max = 1000 + valid_keys = frozenset({ + trap_data.name + for trap_data in items_by_group[Group.TRAP] + if Group.DEPRECATED not in trap_data.groups + }) + default = { + trap_data.name: trap_default_weight + for trap_data in items_by_group[Group.TRAP] + if Group.DEPRECATED not in trap_data.groups + } + + class MultipleDaySleepEnabled(Toggle): """Enable the ability to sleep automatically for multiple days straight?""" internal_name = "multiple_day_sleep_enabled" @@ -851,10 +896,14 @@ class StardewValleyOptions(PerGameCommonOptions): debris_multiplier: DebrisMultiplier movement_buff_number: NumberOfMovementBuffs enabled_filler_buffs: EnabledFillerBuffs - trap_items: TrapItems + trap_difficulty: TrapDifficulty + trap_distribution: TrapDistribution multiple_day_sleep_enabled: MultipleDaySleepEnabled multiple_day_sleep_cost: MultipleDaySleepCost gifting: Gifting mods: Mods bundle_plando: BundlePlando death_link: DeathLink + + # removed: + trap_items: TrapItems \ No newline at end of file diff --git a/worlds/stardew_valley/options/presets.py b/worlds/stardew_valley/options/presets.py index 3dbb5ab3f5..a711fe08ff 100644 --- a/worlds/stardew_valley/options/presets.py +++ b/worlds/stardew_valley/options/presets.py @@ -38,7 +38,7 @@ all_random_settings = { options.Booksanity.internal_name: "random", options.NumberOfMovementBuffs.internal_name: "random", options.ExcludeGingerIsland.internal_name: "random", - options.TrapItems.internal_name: "random", + options.TrapDifficulty.internal_name: "random", options.MultipleDaySleepEnabled.internal_name: "random", options.MultipleDaySleepCost.internal_name: "random", options.ExperienceMultiplier.internal_name: "random", @@ -82,7 +82,7 @@ easy_settings = { options.NumberOfMovementBuffs.internal_name: 8, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_all, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.option_easy, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_easy, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.option_true, options.MultipleDaySleepCost.internal_name: "free", options.ExperienceMultiplier.internal_name: "triple", @@ -126,7 +126,7 @@ medium_settings = { options.NumberOfMovementBuffs.internal_name: 6, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_all, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.option_medium, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_medium, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.option_true, options.MultipleDaySleepCost.internal_name: "free", options.ExperienceMultiplier.internal_name: "double", @@ -170,7 +170,7 @@ hard_settings = { options.NumberOfMovementBuffs.internal_name: 4, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.default, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.TrapItems.internal_name: options.TrapItems.option_hard, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_hard, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.option_true, options.MultipleDaySleepCost.internal_name: "cheap", options.ExperienceMultiplier.internal_name: "vanilla", @@ -214,7 +214,7 @@ nightmare_settings = { options.NumberOfMovementBuffs.internal_name: 2, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_none, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.TrapItems.internal_name: options.TrapItems.option_hell, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_hell, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.option_true, options.MultipleDaySleepCost.internal_name: "expensive", options.ExperienceMultiplier.internal_name: "half", @@ -258,7 +258,7 @@ short_settings = { options.NumberOfMovementBuffs.internal_name: 10, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_all, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.option_easy, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_easy, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.option_true, options.MultipleDaySleepCost.internal_name: "free", options.ExperienceMultiplier.internal_name: "quadruple", @@ -302,7 +302,7 @@ minsanity_settings = { options.NumberOfMovementBuffs.internal_name: options.NumberOfMovementBuffs.default, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.default, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.default, + options.TrapDifficulty.internal_name: options.TrapDifficulty.default, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.default, options.MultipleDaySleepCost.internal_name: options.MultipleDaySleepCost.default, options.ExperienceMultiplier.internal_name: options.ExperienceMultiplier.default, @@ -346,7 +346,7 @@ allsanity_settings = { options.NumberOfMovementBuffs.internal_name: 12, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_all, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.TrapItems.internal_name: options.TrapItems.default, + options.TrapDifficulty.internal_name: options.TrapDifficulty.default, options.MultipleDaySleepEnabled.internal_name: options.MultipleDaySleepEnabled.default, options.MultipleDaySleepCost.internal_name: options.MultipleDaySleepCost.default, options.ExperienceMultiplier.internal_name: options.ExperienceMultiplier.default, diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 77092c78fc..6d0846f8c1 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -2,8 +2,8 @@ from typing import List from BaseClasses import ItemClassification, Item from . import SVTestBase -from .. import items, location_table, options -from ..items import Group, ItemData +from .. import location_table, options, items +from ..items import Group, ItemData, item_data from ..locations import LocationTags from ..options import Friendsanity, SpecialOrderLocations, Shipsanity, Chefsanity, SeasonRandomization, Craftsanity, ExcludeGingerIsland, SkillProgression, \ Booksanity, Walnutsanity @@ -15,10 +15,10 @@ def get_all_permanent_progression_items() -> List[ItemData]: """ return [ item - for item in items.all_items + for item in item_data.all_items if ItemClassification.progression in item.classification if item.mod_name is None - if item.name not in {event.name for event in items.events} + if item.name not in {event.name for event in item_data.events} if item.name not in {deprecated.name for deprecated in items.items_by_group[Group.DEPRECATED]} if item.name not in {season.name for season in items.items_by_group[Group.SEASON]} if item.name not in {weapon.name for weapon in items.items_by_group[Group.WEAPON]} @@ -54,19 +54,19 @@ class TestBaseItemGeneration(SVTestBase): def test_does_not_create_deprecated_items(self): all_created_items = set(self.get_all_created_items()) - for deprecated_item in items.items_by_group[items.Group.DEPRECATED]: + for deprecated_item in item_data.items_by_group[item_data.Group.DEPRECATED]: with self.subTest(f"{deprecated_item.name}"): self.assertNotIn(deprecated_item.name, all_created_items) def test_does_not_create_more_than_one_maximum_one_items(self): all_created_items = self.get_all_created_items() - for maximum_one_item in items.items_by_group[items.Group.MAXIMUM_ONE]: + for maximum_one_item in item_data.items_by_group[item_data.Group.MAXIMUM_ONE]: with self.subTest(f"{maximum_one_item.name}"): self.assertLessEqual(all_created_items.count(maximum_one_item.name), 1) def test_does_not_create_or_create_two_of_exactly_two_items(self): all_created_items = self.get_all_created_items() - for exactly_two_item in items.items_by_group[items.Group.AT_LEAST_TWO]: + for exactly_two_item in item_data.items_by_group[item_data.Group.AT_LEAST_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) self.assertTrue(count == 0 or count == 2) @@ -102,19 +102,19 @@ class TestNoGingerIslandItemGeneration(SVTestBase): def test_does_not_create_deprecated_items(self): all_created_items = self.get_all_created_items() - for deprecated_item in items.items_by_group[items.Group.DEPRECATED]: + for deprecated_item in item_data.items_by_group[item_data.Group.DEPRECATED]: with self.subTest(f"Deprecated item: {deprecated_item.name}"): self.assertNotIn(deprecated_item.name, all_created_items) def test_does_not_create_more_than_one_maximum_one_items(self): all_created_items = self.get_all_created_items() - for maximum_one_item in items.items_by_group[items.Group.MAXIMUM_ONE]: + for maximum_one_item in item_data.items_by_group[item_data.Group.MAXIMUM_ONE]: with self.subTest(f"{maximum_one_item.name}"): self.assertLessEqual(all_created_items.count(maximum_one_item.name), 1) def test_does_not_create_exactly_two_items(self): all_created_items = self.get_all_created_items() - for exactly_two_item in items.items_by_group[items.Group.AT_LEAST_TWO]: + for exactly_two_item in item_data.items_by_group[item_data.Group.AT_LEAST_TWO]: with self.subTest(f"{exactly_two_item.name}"): count = all_created_items.count(exactly_two_item.name) self.assertTrue(count == 0 or count == 2) diff --git a/worlds/stardew_valley/test/TestItemLink.py b/worlds/stardew_valley/test/TestItemLink.py index 3a0d976511..f1c8346142 100644 --- a/worlds/stardew_valley/test/TestItemLink.py +++ b/worlds/stardew_valley/test/TestItemLink.py @@ -6,7 +6,7 @@ max_iterations = 2000 class TestItemLinksEverythingIncluded(SVTestBase): options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.TrapItems.internal_name: options.TrapItems.option_medium} + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_medium} def test_filler_of_all_types_generated(self): max_number_filler = 114 @@ -33,7 +33,7 @@ class TestItemLinksEverythingIncluded(SVTestBase): class TestItemLinksNoIsland(SVTestBase): options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.option_medium} + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_medium} def test_filler_has_no_island_but_has_traps(self): max_number_filler = 109 @@ -57,7 +57,7 @@ class TestItemLinksNoIsland(SVTestBase): class TestItemLinksNoTraps(SVTestBase): options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.TrapItems.internal_name: options.TrapItems.option_no_traps} + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_no_traps} def test_filler_has_no_traps_but_has_island(self): max_number_filler = 99 @@ -81,7 +81,7 @@ class TestItemLinksNoTraps(SVTestBase): class TestItemLinksNoTrapsAndIsland(SVTestBase): options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, - options.TrapItems.internal_name: options.TrapItems.option_no_traps} + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_no_traps} def test_filler_generated_without_island_or_traps(self): max_number_filler = 94 diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 4894ea55f2..11b0a01415 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -9,7 +9,7 @@ from .options.option_names import all_option_choices from .options.presets import allsanity_no_mods_6_x_x, allsanity_mods_6_x_x from .. import items_by_group, Group from ..locations import locations_by_tag, LocationTags, location_table -from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations +from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapDifficulty, SpecialOrderLocations, ArcadeMachineLocations from ..strings.goal_names import Goal as GoalName from ..strings.season_names import Season from ..strings.special_order_names import SpecialOrder @@ -126,7 +126,7 @@ class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase class TestTraps(SVTestCase): def test_given_no_traps_when_generate_then_no_trap_in_pool(self): world_options = allsanity_no_mods_6_x_x().copy() - world_options[TrapItems.internal_name] = TrapItems.option_no_traps + world_options[TrapDifficulty.internal_name] = TrapDifficulty.option_no_traps with solo_multiworld(world_options) as (multi_world, _): trap_items = [item_data.name for item_data in items_by_group[Group.TRAP]] multiworld_items = [item.name for item in multi_world.get_items()] @@ -136,12 +136,12 @@ class TestTraps(SVTestCase): self.assertNotIn(item, multiworld_items) def test_given_traps_when_generate_then_all_traps_in_pool(self): - trap_option = TrapItems + trap_option = TrapDifficulty for value in trap_option.options: if value == "no_traps": continue world_options = allsanity_mods_6_x_x() - world_options.update({TrapItems.internal_name: trap_option.options[value]}) + world_options.update({TrapDifficulty.internal_name: trap_option.options[value]}) with solo_multiworld(world_options) as (multi_world, _): trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups and item_data.mod_name is None] diff --git a/worlds/stardew_valley/test/TestTraps.py b/worlds/stardew_valley/test/TestTraps.py new file mode 100644 index 0000000000..9df07a6d74 --- /dev/null +++ b/worlds/stardew_valley/test/TestTraps.py @@ -0,0 +1,122 @@ +import unittest + +from . import SVTestBase +from .assertion import WorldAssertMixin +from .. import options, items_by_group, Group +from ..options import TrapDistribution + +default_distribution = {trap.name: TrapDistribution.default_weight for trap in items_by_group[Group.TRAP] if Group.DEPRECATED not in trap.groups} +threshold_difference = 2 +threshold_ballpark = 3 + + +class TestTrapDifficultyCanRemoveAllTraps(WorldAssertMixin, SVTestBase): + options = { + options.QuestLocations.internal_name: 56, + options.Fishsanity.internal_name: options.Fishsanity.option_all, + options.Museumsanity.internal_name: options.Museumsanity.option_all, + options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_board_qi, + options.Shipsanity.internal_name: options.Shipsanity.option_everything, + options.Cooksanity.internal_name: options.Cooksanity.option_all, + options.Craftsanity.internal_name: options.Craftsanity.option_all, + options.Mods.internal_name: frozenset(options.Mods.valid_keys), + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_no_traps, + } + + def test_no_traps_in_item_pool(self): + items = self.multiworld.get_items() + item_names = set(item.name for item in items) + for trap in items_by_group[Group.TRAP]: + if Group.DEPRECATED in trap.groups: + continue + self.assertNotIn(trap.name, item_names) + + +class TestDefaultDistributionHasAllTraps(WorldAssertMixin, SVTestBase): + options = { + options.QuestLocations.internal_name: 56, + options.Fishsanity.internal_name: options.Fishsanity.option_all, + options.Museumsanity.internal_name: options.Museumsanity.option_all, + options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_board_qi, + options.Shipsanity.internal_name: options.Shipsanity.option_everything, + options.Cooksanity.internal_name: options.Cooksanity.option_all, + options.Craftsanity.internal_name: options.Craftsanity.option_all, + options.Mods.internal_name: frozenset(options.Mods.valid_keys), + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_medium, + } + + def test_all_traps_in_item_pool(self): + items = self.multiworld.get_items() + item_names = set(item.name for item in items) + for trap in items_by_group[Group.TRAP]: + if Group.DEPRECATED in trap.groups: + continue + self.assertIn(trap.name, item_names) + + +class TestDistributionIsRespectedAllTraps(WorldAssertMixin, SVTestBase): + options = { + options.QuestLocations.internal_name: 56, + options.Fishsanity.internal_name: options.Fishsanity.option_all, + options.Museumsanity.internal_name: options.Museumsanity.option_all, + options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_board_qi, + options.Shipsanity.internal_name: options.Shipsanity.option_everything, + options.Cooksanity.internal_name: options.Cooksanity.option_all, + options.Craftsanity.internal_name: options.Craftsanity.option_all, + options.Mods.internal_name: frozenset(options.Mods.valid_keys), + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_medium, + options.TrapDistribution.internal_name: default_distribution | {"Nudge Trap": 100, "Bark Trap": 1, "Meow Trap": 1000, "Shuffle Trap": 0} + } + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + if cls.skip_long_tests: + raise unittest.SkipTest("Unstable tests disabled to not annoy anyone else when it rarely fails") + + def test_about_as_many_nudges_as_other_filler(self): + items = self.multiworld.get_items() + item_names = [item.name for item in items] + num_nudge = len([item for item in item_names if item == "Nudge Trap"]) + other_fillers = ["Resource Pack: 4 Frozen Geode", "Resource Pack: 50 Wood", "Resource Pack: 5 Warp Totem: Farm", + "Resource Pack: 500 Money", "Resource Pack: 75 Copper Ore", "Resource Pack: 30 Speed-Gro"] + at_least_one_in_ballpark = False + for filler_item in other_fillers: + num_filler = len([item for item in item_names if item == filler_item]) + diff_num = abs(num_filler - num_nudge) + is_in_ballpark = diff_num <= threshold_ballpark + at_least_one_in_ballpark = at_least_one_in_ballpark or is_in_ballpark + self.assertTrue(at_least_one_in_ballpark) + + def test_fewer_barks_than_nudges_in_item_pool(self): + items = self.multiworld.get_items() + item_names = [item.name for item in items] + num_nudge = len([item for item in item_names if item == "Nudge Trap"]) + num_bark = len([item for item in item_names if item == "Bark Trap"]) + self.assertLess(num_bark, num_nudge - threshold_difference) + + def test_more_meows_than_nudges_in_item_pool(self): + items = self.multiworld.get_items() + item_names = [item.name for item in items] + num_nudge = len([item for item in item_names if item == "Nudge Trap"]) + num_meow = len([item for item in item_names if item == "Meow Trap"]) + self.assertGreater(num_meow, num_nudge + threshold_difference) + + def test_no_shuffles_in_item_pool(self): + items = self.multiworld.get_items() + item_names = [item.name for item in items] + num_shuffle = len([item for item in item_names if item == "Shuffle Trap"]) + self.assertEqual(0, num_shuffle) + + def test_omitted_item_same_as_nudge_in_item_pool(self): + items = self.multiworld.get_items() + item_names = [item.name for item in items] + num_time_flies = len([item for item in item_names if item == "Time Flies Trap"]) + num_debris = len([item for item in item_names if item == "Debris Trap"]) + num_bark = len([item for item in item_names if item == "Bark Trap"]) + num_meow = len([item for item in item_names if item == "Meow Trap"]) + self.assertLess(num_bark, num_time_flies - threshold_difference) + self.assertLess(num_bark, num_debris - threshold_difference) + self.assertGreater(num_meow, num_time_flies + threshold_difference) + self.assertGreater(num_meow, num_debris + threshold_difference) + diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index 702f590221..6a8011a37d 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -14,7 +14,7 @@ from .assertion import RuleAssertMixin from .options.utils import fill_namespace_with_default, parse_class_option_keys, fill_dataclass_with_default from .. import StardewValleyWorld, StardewItem, StardewRule from ..logic.time_logic import MONTH_COEFFICIENT -from ..options import StardewValleyOption +from ..options import StardewValleyOption, options logger = logging.getLogger(__name__) @@ -221,9 +221,9 @@ def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOp # Yes I reuse the worlds generated between tests, its speeds the execution by a couple seconds # If the simple dict caching ends up taking too much memory, we could replace it with some kind of lru cache. - should_cache = "start_inventory" not in test_options + should_cache = should_cache_world(test_options) if should_cache: - frozen_options = frozenset(test_options.items()).union({("seed", seed)}) + frozen_options = make_hashable(test_options, seed) cached_multi_world = search_world_cache(_cache, frozen_options) if cached_multi_world: print(f"Using cached solo multi world [Seed = {cached_multi_world.seed}] [Cache size = {len(_cache)}]") @@ -252,6 +252,27 @@ def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOp return multiworld +def should_cache_world(test_options): + if "start_inventory" in test_options: + return False + + trap_distribution_key = "trap_distribution" + if trap_distribution_key not in test_options: + return True + + trap_distribution = test_options[trap_distribution_key] + for key in trap_distribution: + if trap_distribution[key] != options.TrapDistribution.default_weight: + return False + + return True + + + +def make_hashable(test_options, seed): + return frozenset(test_options.items()).union({("seed", seed)}) + + def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset) -> Optional[MultiWorld]: try: return cache[frozen_options] diff --git a/worlds/stardew_valley/test/options/TestPresets.py b/worlds/stardew_valley/test/options/TestPresets.py index 9384acd770..5d9e89531c 100644 --- a/worlds/stardew_valley/test/options/TestPresets.py +++ b/worlds/stardew_valley/test/options/TestPresets.py @@ -1,16 +1,16 @@ -from Options import PerGameCommonOptions, OptionSet +from Options import PerGameCommonOptions, OptionSet, OptionDict from .. import SVTestCase -from ...options import StardewValleyOptions +from ...options import StardewValleyOptions, TrapItems from ...options.presets import sv_options_presets class TestPresets(SVTestCase): def test_all_presets_explicitly_set_all_options(self): all_option_names = {option_key for option_key in StardewValleyOptions.type_hints} - omitted_option_names = {option_key for option_key in PerGameCommonOptions.type_hints} + omitted_option_names = {option_key for option_key in PerGameCommonOptions.type_hints} | {TrapItems.internal_name} mandatory_option_names = {option_key for option_key in all_option_names if option_key not in omitted_option_names and - not issubclass(StardewValleyOptions.type_hints[option_key], OptionSet)} + not issubclass(StardewValleyOptions.type_hints[option_key], OptionSet | OptionDict)} for preset_name in sv_options_presets: with self.subTest(f"{preset_name}"): diff --git a/worlds/stardew_valley/test/options/presets.py b/worlds/stardew_valley/test/options/presets.py index 57f8b0beb9..86b21c693e 100644 --- a/worlds/stardew_valley/test/options/presets.py +++ b/worlds/stardew_valley/test/options/presets.py @@ -70,7 +70,7 @@ def allsanity_no_mods_6_x_x(): options.SkillProgression.internal_name: options.SkillProgression.option_progressive_with_masteries, options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_board_qi, options.ToolProgression.internal_name: options.ToolProgression.option_progressive, - options.TrapItems.internal_name: options.TrapItems.option_nightmare, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_nightmare, options.Walnutsanity.internal_name: options.Walnutsanity.preset_all } @@ -119,7 +119,7 @@ def get_minsanity_options(): options.SkillProgression.internal_name: options.SkillProgression.option_vanilla, options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_vanilla, options.ToolProgression.internal_name: options.ToolProgression.option_vanilla, - options.TrapItems.internal_name: options.TrapItems.option_no_traps, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_no_traps, options.Walnutsanity.internal_name: options.Walnutsanity.preset_none } @@ -156,7 +156,7 @@ def minimal_locations_maximal_items(): options.SkillProgression.internal_name: options.SkillProgression.option_vanilla, options.SpecialOrderLocations.internal_name: options.SpecialOrderLocations.option_vanilla, options.ToolProgression.internal_name: options.ToolProgression.option_vanilla, - options.TrapItems.internal_name: options.TrapItems.option_nightmare, + options.TrapDifficulty.internal_name: options.TrapDifficulty.option_nightmare, options.Walnutsanity.internal_name: options.Walnutsanity.preset_none } return min_max_options From 68ed20861364c4f734a21aa9aac91667b18d7818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szab=C3=B3=20Benedek=20Zolt=C3=A1n?= <99742992+TVV1GK@users.noreply.github.com> Date: Sun, 11 May 2025 00:31:05 +0200 Subject: [PATCH 124/199] DS3: "US: Homeward Bone - foot, drop overlook" (#4875) --- worlds/dark_souls_3/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index c5cdbba85d..7b30997581 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -706,7 +706,7 @@ location_tables: Dict[str, List[DS3LocationData]] = { DS3LocationData("US: Whip - back alley, behind wooden wall", "Whip", hidden=True), DS3LocationData("US: Great Scythe - building by white tree, balcony", "Great Scythe"), DS3LocationData("US: Homeward Bone - foot, drop overlook", "Homeward Bone", - static='02,0:53100540::'), + static='02,0:53100950::'), DS3LocationData("US: Large Soul of a Deserted Corpse - around corner by Cliff Underside", "Large Soul of a Deserted Corpse", hidden=True), # Hidden corner DS3LocationData("US: Ember - behind burning tree", "Ember"), From a166dc77bcb2c3828d028bf8a69a1253ed894934 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 10 May 2025 17:49:49 -0500 Subject: [PATCH 125/199] Core: Plando Items "Rewrite" (#3046) --- BaseClasses.py | 37 +- Fill.py | 349 +++++++++--------- Generate.py | 14 +- Main.py | 14 +- Options.py | 140 ++++++- test/general/test_implemented.py | 16 + test/general/test_state.py | 2 +- worlds/alttp/EntranceRandomizer.py | 5 +- worlds/alttp/__init__.py | 37 +- worlds/blasphemous/__init__.py | 1 - worlds/hylics2/__init__.py | 4 + worlds/kh2/__init__.py | 4 + worlds/ladx/test/testShop.py | 12 +- worlds/oot/__init__.py | 4 +- worlds/pokemon_rb/__init__.py | 11 +- worlds/pokemon_rb/pokemon.py | 2 +- worlds/sc2/Locations.py | 7 +- worlds/shivers/__init__.py | 23 +- .../test/stability/TestUniversalTracker.py | 3 - worlds/witness/player_items.py | 25 +- 20 files changed, 448 insertions(+), 262 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index e59e96e17d..f480cbbda3 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -9,8 +9,9 @@ from argparse import Namespace from collections import Counter, deque from collections.abc import Collection, MutableSequence from enum import IntEnum, IntFlag -from typing import (AbstractSet, Any, Callable, ClassVar, Dict, Iterable, Iterator, List, Mapping, NamedTuple, +from typing import (AbstractSet, Any, Callable, ClassVar, Dict, Iterable, Iterator, List, Literal, Mapping, NamedTuple, Optional, Protocol, Set, Tuple, Union, TYPE_CHECKING) +import dataclasses from typing_extensions import NotRequired, TypedDict @@ -54,12 +55,21 @@ class HasNameAndPlayer(Protocol): player: int +@dataclasses.dataclass +class PlandoItemBlock: + player: int + from_pool: bool + force: bool | Literal["silent"] + worlds: set[int] = dataclasses.field(default_factory=set) + items: list[str] = dataclasses.field(default_factory=list) + locations: list[str] = dataclasses.field(default_factory=list) + resolved_locations: list[Location] = dataclasses.field(default_factory=list) + count: dict[str, int] = dataclasses.field(default_factory=dict) + + class MultiWorld(): debug_types = False player_name: Dict[int, str] - plando_texts: List[Dict[str, str]] - plando_items: List[List[Dict[str, Any]]] - plando_connections: List worlds: Dict[int, "AutoWorld.World"] groups: Dict[int, Group] regions: RegionManager @@ -83,6 +93,8 @@ class MultiWorld(): start_location_hints: Dict[int, Options.StartLocationHints] item_links: Dict[int, Options.ItemLinks] + plando_item_blocks: Dict[int, List[PlandoItemBlock]] + game: Dict[int, str] random: random.Random @@ -160,13 +172,12 @@ class MultiWorld(): self.local_early_items = {player: {} for player in self.player_ids} self.indirect_connections = {} self.start_inventory_from_pool: Dict[int, Options.StartInventoryPool] = {} + self.plando_item_blocks = {} for player in range(1, players + 1): def set_player_attr(attr: str, val) -> None: self.__dict__.setdefault(attr, {})[player] = val - set_player_attr('plando_items', []) - set_player_attr('plando_texts', {}) - set_player_attr('plando_connections', []) + set_player_attr('plando_item_blocks', []) set_player_attr('game', "Archipelago") set_player_attr('completion_condition', lambda state: True) self.worlds = {} @@ -427,7 +438,8 @@ class MultiWorld(): def get_location(self, location_name: str, player: int) -> Location: return self.regions.location_cache[player][location_name] - def get_all_state(self, use_cache: bool, allow_partial_entrances: bool = False) -> CollectionState: + def get_all_state(self, use_cache: bool, allow_partial_entrances: bool = False, + collect_pre_fill_items: bool = True) -> CollectionState: cached = getattr(self, "_all_state", None) if use_cache and cached: return cached.copy() @@ -436,10 +448,11 @@ class MultiWorld(): for item in self.itempool: self.worlds[item.player].collect(ret, item) - for player in self.player_ids: - subworld = self.worlds[player] - for item in subworld.get_pre_fill_items(): - subworld.collect(ret, item) + if collect_pre_fill_items: + for player in self.player_ids: + subworld = self.worlds[player] + for item in subworld.get_pre_fill_items(): + subworld.collect(ret, item) ret.sweep_for_advancements() if use_cache: diff --git a/Fill.py b/Fill.py index cce7aec209..ff59aa22cb 100644 --- a/Fill.py +++ b/Fill.py @@ -4,7 +4,7 @@ import logging import typing from collections import Counter, deque -from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld +from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld, PlandoItemBlock from Options import Accessibility from worlds.AutoWorld import call_all @@ -100,7 +100,7 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati # if minimal accessibility, only check whether location is reachable if game not beatable if multiworld.worlds[item_to_place.player].options.accessibility == Accessibility.option_minimal: perform_access_check = not multiworld.has_beaten_game(maximum_exploration_state, - item_to_place.player) \ + item_to_place.player) \ if single_player_placement else not has_beaten_game else: perform_access_check = True @@ -242,7 +242,7 @@ def remaining_fill(multiworld: MultiWorld, unplaced_items: typing.List[Item] = [] placements: typing.List[Location] = [] swapped_items: typing.Counter[typing.Tuple[int, str]] = Counter() - total = min(len(itempool), len(locations)) + total = min(len(itempool), len(locations)) placed = 0 # Optimisation: Decide whether to do full location.can_fill check (respect excluded), or only check the item rule @@ -343,8 +343,10 @@ def fast_fill(multiworld: MultiWorld, def accessibility_corrections(multiworld: MultiWorld, state: CollectionState, locations, pool=[]): maximum_exploration_state = sweep_from_pool(state, pool) - minimal_players = {player for player in multiworld.player_ids if multiworld.worlds[player].options.accessibility == "minimal"} - unreachable_locations = [location for location in multiworld.get_locations() if location.player in minimal_players and + minimal_players = {player for player in multiworld.player_ids if + multiworld.worlds[player].options.accessibility == "minimal"} + unreachable_locations = [location for location in multiworld.get_locations() if + location.player in minimal_players and not location.can_reach(maximum_exploration_state)] for location in unreachable_locations: if (location.item is not None and location.item.advancement and location.address is not None and not @@ -365,7 +367,7 @@ def inaccessible_location_rules(multiworld: MultiWorld, state: CollectionState, unreachable_locations = [location for location in locations if not location.can_reach(maximum_exploration_state)] if unreachable_locations: def forbid_important_item_rule(item: Item): - return not ((item.classification & 0b0011) and multiworld.worlds[item.player].options.accessibility != 'minimal') + return not ((item.classification & 0b0011) and multiworld.worlds[item.player].options.accessibility != "minimal") for location in unreachable_locations: add_item_rule(location, forbid_important_item_rule) @@ -677,9 +679,9 @@ def balance_multiworld_progression(multiworld: MultiWorld) -> None: if multiworld.worlds[player].options.progression_balancing > 0 } if not balanceable_players: - logging.info('Skipping multiworld progression balancing.') + logging.info("Skipping multiworld progression balancing.") else: - logging.info(f'Balancing multiworld progression for {len(balanceable_players)} Players.') + logging.info(f"Balancing multiworld progression for {len(balanceable_players)} Players.") logging.debug(balanceable_players) state: CollectionState = CollectionState(multiworld) checked_locations: typing.Set[Location] = set() @@ -777,7 +779,7 @@ def balance_multiworld_progression(multiworld: MultiWorld) -> None: if player in threshold_percentages): break elif not balancing_sphere: - raise RuntimeError('Not all required items reachable. Something went terribly wrong here.') + raise RuntimeError("Not all required items reachable. Something went terribly wrong here.") # Gather a set of locations which we can swap items into unlocked_locations: typing.Dict[int, typing.Set[Location]] = collections.defaultdict(set) for l in unchecked_locations: @@ -793,8 +795,8 @@ def balance_multiworld_progression(multiworld: MultiWorld) -> None: testing = items_to_test.pop() reducing_state = state.copy() for location in itertools.chain(( - l for l in items_to_replace - if l.item.player == player + l for l in items_to_replace + if l.item.player == player ), items_to_test): reducing_state.collect(location.item, True, location) @@ -867,52 +869,30 @@ def swap_location_item(location_1: Location, location_2: Location, check_locked: location_2.item.location = location_2 -def distribute_planned(multiworld: MultiWorld) -> None: - def warn(warning: str, force: typing.Union[bool, str]) -> None: - if force in [True, 'fail', 'failure', 'none', False, 'warn', 'warning']: - logging.warning(f'{warning}') +def parse_planned_blocks(multiworld: MultiWorld) -> dict[int, list[PlandoItemBlock]]: + def warn(warning: str, force: bool | str) -> None: + if isinstance(force, bool): + logging.warning(f"{warning}") else: - logging.debug(f'{warning}') + logging.debug(f"{warning}") - def failed(warning: str, force: typing.Union[bool, str]) -> None: - if force in [True, 'fail', 'failure']: + def failed(warning: str, force: bool | str) -> None: + if force is True: raise Exception(warning) else: warn(warning, force) - swept_state = multiworld.state.copy() - swept_state.sweep_for_advancements() - reachable = frozenset(multiworld.get_reachable_locations(swept_state)) - early_locations: typing.Dict[int, typing.List[str]] = collections.defaultdict(list) - non_early_locations: typing.Dict[int, typing.List[str]] = collections.defaultdict(list) - for loc in multiworld.get_unfilled_locations(): - if loc in reachable: - early_locations[loc.player].append(loc.name) - else: # not reachable with swept state - non_early_locations[loc.player].append(loc.name) - world_name_lookup = multiworld.world_name_lookup - block_value = typing.Union[typing.List[str], typing.Dict[str, typing.Any], str] - plando_blocks: typing.List[typing.Dict[str, typing.Any]] = [] - player_ids = set(multiworld.player_ids) + plando_blocks: dict[int, list[PlandoItemBlock]] = dict() + player_ids: set[int] = set(multiworld.player_ids) for player in player_ids: - for block in multiworld.plando_items[player]: - block['player'] = player - if 'force' not in block: - block['force'] = 'silent' - if 'from_pool' not in block: - block['from_pool'] = True - elif not isinstance(block['from_pool'], bool): - from_pool_type = type(block['from_pool']) - raise Exception(f'Plando "from_pool" has to be boolean, not {from_pool_type} for player {player}.') - if 'world' not in block: - target_world = False - else: - target_world = block['world'] - + plando_blocks[player] = [] + for block in multiworld.worlds[player].options.plando_items: + new_block: PlandoItemBlock = PlandoItemBlock(player, block.from_pool, block.force) + target_world = block.world if target_world is False or multiworld.players == 1: # target own world - worlds: typing.Set[int] = {player} + worlds: set[int] = {player} elif target_world is True: # target any worlds besides own worlds = set(multiworld.player_ids) - {player} elif target_world is None: # target all worlds @@ -922,172 +902,197 @@ def distribute_planned(multiworld: MultiWorld) -> None: for listed_world in target_world: if listed_world not in world_name_lookup: failed(f"Cannot place item to {target_world}'s world as that world does not exist.", - block['force']) + block.force) continue worlds.add(world_name_lookup[listed_world]) elif type(target_world) == int: # target world by slot number if target_world not in range(1, multiworld.players + 1): failed( f"Cannot place item in world {target_world} as it is not in range of (1, {multiworld.players})", - block['force']) + block.force) continue worlds = {target_world} else: # target world by slot name if target_world not in world_name_lookup: failed(f"Cannot place item to {target_world}'s world as that world does not exist.", - block['force']) + block.force) continue worlds = {world_name_lookup[target_world]} - block['world'] = worlds + new_block.worlds = worlds - items: block_value = [] - if "items" in block: - items = block["items"] - if 'count' not in block: - block['count'] = False - elif "item" in block: - items = block["item"] - if 'count' not in block: - block['count'] = 1 - else: - failed("You must specify at least one item to place items with plando.", block['force']) - continue + items: list[str] | dict[str, typing.Any] = block.items if isinstance(items, dict): - item_list: typing.List[str] = [] + item_list: list[str] = [] for key, value in items.items(): if value is True: value = multiworld.itempool.count(multiworld.worlds[player].create_item(key)) item_list += [key] * value items = item_list - if isinstance(items, str): - items = [items] - block['items'] = items + new_block.items = items - locations: block_value = [] - if 'location' in block: - locations = block['location'] # just allow 'location' to keep old yamls compatible - elif 'locations' in block: - locations = block['locations'] + locations: list[str] = block.locations if isinstance(locations, str): locations = [locations] - if isinstance(locations, dict): - location_list = [] - for key, value in locations.items(): - location_list += [key] * value - locations = location_list + locations_from_groups: list[str] = [] + resolved_locations: list[Location] = [] + for target_player in worlds: + world_locations = multiworld.get_unfilled_locations(target_player) + for group in multiworld.worlds[target_player].location_name_groups: + if group in locations: + locations_from_groups.extend(multiworld.worlds[target_player].location_name_groups[group]) + resolved_locations.extend(location for location in world_locations + if location.name in [*locations, *locations_from_groups]) + new_block.locations = sorted(dict.fromkeys(locations)) + new_block.resolved_locations = sorted(set(resolved_locations)) + count = block.count + if not count: + count = len(new_block.items) + if isinstance(count, int): + count = {"min": count, "max": count} + if "min" not in count: + count["min"] = 0 + if "max" not in count: + count["max"] = len(new_block.items) + + new_block.count = count + plando_blocks[player].append(new_block) + + return plando_blocks + + +def resolve_early_locations_for_planned(multiworld: MultiWorld): + def warn(warning: str, force: bool | str) -> None: + if isinstance(force, bool): + logging.warning(f"{warning}") + else: + logging.debug(f"{warning}") + + def failed(warning: str, force: bool | str) -> None: + if force is True: + raise Exception(warning) + else: + warn(warning, force) + + swept_state = multiworld.state.copy() + swept_state.sweep_for_advancements() + reachable = frozenset(multiworld.get_reachable_locations(swept_state)) + early_locations: dict[int, list[Location]] = collections.defaultdict(list) + non_early_locations: dict[int, list[Location]] = collections.defaultdict(list) + for loc in multiworld.get_unfilled_locations(): + if loc in reachable: + early_locations[loc.player].append(loc) + else: # not reachable with swept state + non_early_locations[loc.player].append(loc) + + for player in multiworld.plando_item_blocks: + removed = [] + for block in multiworld.plando_item_blocks[player]: + locations = block.locations + resolved_locations = block.resolved_locations + worlds = block.worlds if "early_locations" in locations: - locations.remove("early_locations") for target_player in worlds: - locations += early_locations[target_player] + resolved_locations += early_locations[target_player] if "non_early_locations" in locations: - locations.remove("non_early_locations") for target_player in worlds: - locations += non_early_locations[target_player] + resolved_locations += non_early_locations[target_player] - block['locations'] = list(dict.fromkeys(locations)) + if block.count["max"] > len(block.items): + count = block.count["max"] + failed(f"Plando count {count} greater than items specified", block.force) + block.count["max"] = len(block.items) + if block.count["min"] > len(block.items): + block.count["min"] = len(block.items) + if block.count["max"] > len(block.resolved_locations) > 0: + count = block.count["max"] + failed(f"Plando count {count} greater than locations specified", block.force) + block.count["max"] = len(block.resolved_locations) + if block.count["min"] > len(block.resolved_locations): + block.count["min"] = len(block.resolved_locations) + block.count["target"] = multiworld.random.randint(block.count["min"], + block.count["max"]) - if not block['count']: - block['count'] = (min(len(block['items']), len(block['locations'])) if - len(block['locations']) > 0 else len(block['items'])) - if isinstance(block['count'], int): - block['count'] = {'min': block['count'], 'max': block['count']} - if 'min' not in block['count']: - block['count']['min'] = 0 - if 'max' not in block['count']: - block['count']['max'] = (min(len(block['items']), len(block['locations'])) if - len(block['locations']) > 0 else len(block['items'])) - if block['count']['max'] > len(block['items']): - count = block['count'] - failed(f"Plando count {count} greater than items specified", block['force']) - block['count'] = len(block['items']) - if block['count']['max'] > len(block['locations']) > 0: - count = block['count'] - failed(f"Plando count {count} greater than locations specified", block['force']) - block['count'] = len(block['locations']) - block['count']['target'] = multiworld.random.randint(block['count']['min'], block['count']['max']) + if not block.count["target"]: + removed.append(block) - if block['count']['target'] > 0: - plando_blocks.append(block) + for block in removed: + multiworld.plando_item_blocks[player].remove(block) + + +def distribute_planned_blocks(multiworld: MultiWorld, plando_blocks: list[PlandoItemBlock]): + def warn(warning: str, force: bool | str) -> None: + if isinstance(force, bool): + logging.warning(f"{warning}") + else: + logging.debug(f"{warning}") + + def failed(warning: str, force: bool | str) -> None: + if force is True: + raise Exception(warning) + else: + warn(warning, force) # shuffle, but then sort blocks by number of locations minus number of items, # so less-flexible blocks get priority multiworld.random.shuffle(plando_blocks) - plando_blocks.sort(key=lambda block: (len(block['locations']) - block['count']['target'] - if len(block['locations']) > 0 - else len(multiworld.get_unfilled_locations(player)) - block['count']['target'])) - + plando_blocks.sort(key=lambda block: (len(block.resolved_locations) - block.count["target"] + if len(block.resolved_locations) > 0 + else len(multiworld.get_unfilled_locations(block.player)) - + block.count["target"])) for placement in plando_blocks: - player = placement['player'] + player = placement.player try: - worlds = placement['world'] - locations = placement['locations'] - items = placement['items'] - maxcount = placement['count']['target'] - from_pool = placement['from_pool'] + worlds = placement.worlds + locations = placement.resolved_locations + items = placement.items + maxcount = placement.count["target"] + from_pool = placement.from_pool - candidates = list(multiworld.get_unfilled_locations_for_players(locations, sorted(worlds))) - multiworld.random.shuffle(candidates) - multiworld.random.shuffle(items) - count = 0 - err: typing.List[str] = [] - successful_pairs: typing.List[typing.Tuple[int, Item, Location]] = [] - claimed_indices: typing.Set[typing.Optional[int]] = set() - for item_name in items: - index_to_delete: typing.Optional[int] = None - if from_pool: - try: - # If from_pool, try to find an existing item with this name & player in the itempool and use it - index_to_delete, item = next( - (i, item) for i, item in enumerate(multiworld.itempool) - if item.player == player and item.name == item_name and i not in claimed_indices - ) - except StopIteration: - warn( - f"Could not remove {item_name} from pool for {multiworld.player_name[player]} as it's already missing from it.", - placement['force']) - item = multiworld.worlds[player].create_item(item_name) - else: - item = multiworld.worlds[player].create_item(item_name) - - for location in reversed(candidates): - if (location.address is None) == (item.code is None): # either both None or both not None - if not location.item: - if location.item_rule(item): - if location.can_fill(multiworld.state, item, False): - successful_pairs.append((index_to_delete, item, location)) - claimed_indices.add(index_to_delete) - candidates.remove(location) - count = count + 1 - break - else: - err.append(f"Can't place item at {location} due to fill condition not met.") - else: - err.append(f"{item_name} not allowed at {location}.") - else: - err.append(f"Cannot place {item_name} into already filled location {location}.") + item_candidates = [] + if from_pool: + instances = [item for item in multiworld.itempool if item.player == player and item.name in items] + for item in multiworld.random.sample(items, maxcount): + candidate = next((i for i in instances if i.name == item), None) + if candidate is None: + warn(f"Could not remove {item} from pool for {multiworld.player_name[player]} as " + f"it's already missing from it", placement.force) + candidate = multiworld.worlds[player].create_item(item) else: - err.append(f"Mismatch between {item_name} and {location}, only one is an event.") - - if count == maxcount: - break - if count < placement['count']['min']: - m = placement['count']['min'] - failed( - f"Plando block failed to place {m - count} of {m} item(s) for {multiworld.player_name[player]}, error(s): {' '.join(err)}", - placement['force']) - - # Sort indices in reverse so we can remove them one by one - successful_pairs = sorted(successful_pairs, key=lambda successful_pair: successful_pair[0] or 0, reverse=True) - - for (index, item, location) in successful_pairs: - multiworld.push_item(location, item, collect=False) - location.locked = True - logging.debug(f"Plando placed {item} at {location}") - if index is not None: # If this item is from_pool and was found in the pool, remove it. - multiworld.itempool.pop(index) + multiworld.itempool.remove(candidate) + instances.remove(candidate) + item_candidates.append(candidate) + else: + item_candidates = [multiworld.worlds[player].create_item(item) + for item in multiworld.random.sample(items, maxcount)] + if any(item.code is None for item in item_candidates) \ + and not all(item.code is None for item in item_candidates): + failed(f"Plando block for player {player} ({multiworld.player_name[player]}) contains both " + f"event items and non-event items. " + f"Event items: {[item for item in item_candidates if item.code is None]}, " + f"Non-event items: {[item for item in item_candidates if item.code is not None]}", + placement.force) + continue + else: + is_real = item_candidates[0].code is not None + candidates = [candidate for candidate in locations if candidate.item is None + and bool(candidate.address) == is_real] + multiworld.random.shuffle(candidates) + allstate = multiworld.get_all_state(False) + mincount = placement.count["min"] + allowed_margin = len(item_candidates) - mincount + fill_restrictive(multiworld, allstate, candidates, item_candidates, lock=True, + allow_partial=True, name="Plando Main Fill") + if len(item_candidates) > allowed_margin: + failed(f"Could not place {len(item_candidates)} " + f"of {mincount + allowed_margin} item(s) " + f"for {multiworld.player_name[player]}, " + f"remaining items: {item_candidates}", + placement.force) + if from_pool: + multiworld.itempool.extend([item for item in item_candidates if item.code is not None]) except Exception as e: raise Exception( f"Error running plando for player {player} ({multiworld.player_name[player]})") from e diff --git a/Generate.py b/Generate.py index 867a5b6c7a..e72887c26c 100644 --- a/Generate.py +++ b/Generate.py @@ -334,12 +334,6 @@ def handle_name(name: str, player: int, name_counter: Counter): return new_name -def roll_percentage(percentage: Union[int, float]) -> bool: - """Roll a percentage chance. - percentage is expected to be in range [0, 100]""" - return random.random() < (float(percentage) / 100) - - def update_weights(weights: dict, new_weights: dict, update_type: str, name: str) -> dict: logging.debug(f'Applying {new_weights}') cleaned_weights = {} @@ -405,7 +399,7 @@ def roll_linked_options(weights: dict) -> dict: if "name" not in option_set: raise ValueError("One of your linked options does not have a name.") try: - if roll_percentage(option_set["percentage"]): + if Options.roll_percentage(option_set["percentage"]): logging.debug(f"Linked option {option_set['name']} triggered.") new_options = option_set["options"] for category_name, category_options in new_options.items(): @@ -438,7 +432,7 @@ def roll_triggers(weights: dict, triggers: list, valid_keys: set) -> dict: trigger_result = get_choice("option_result", option_set) result = get_choice(key, currently_targeted_weights) currently_targeted_weights[key] = result - if result == trigger_result and roll_percentage(get_choice("percentage", option_set, 100)): + if result == trigger_result and Options.roll_percentage(get_choice("percentage", option_set, 100)): for category_name, category_options in option_set["options"].items(): currently_targeted_weights = weights if category_name: @@ -542,10 +536,6 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b handle_option(ret, game_weights, option_key, option, plando_options) valid_keys.add(option_key) - # TODO remove plando_items after moving it to the options system - valid_keys.add("plando_items") - if PlandoOptions.items in plando_options: - ret.plando_items = copy.deepcopy(game_weights.get("plando_items", [])) if ret.game == "A Link to the Past": # TODO there are still more LTTP options not on the options system valid_keys |= {"sprite_pool", "sprite", "random_sprite_on_event"} diff --git a/Main.py b/Main.py index 5d9e1bc211..147fa382e2 100644 --- a/Main.py +++ b/Main.py @@ -11,8 +11,8 @@ from typing import Dict, List, Optional, Set, Tuple, Union import worlds from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld, Region -from Fill import FillError, balance_multiworld_progression, distribute_items_restrictive, distribute_planned, \ - flood_items +from Fill import FillError, balance_multiworld_progression, distribute_items_restrictive, flood_items, \ + parse_planned_blocks, distribute_planned_blocks, resolve_early_locations_for_planned from Options import StartInventoryPool from Utils import __version__, output_path, version_tuple, get_settings from settings import get_settings @@ -37,9 +37,6 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No logger = logging.getLogger() multiworld.set_seed(seed, args.race, str(args.outputname) if args.outputname else None) multiworld.plando_options = args.plando_options - multiworld.plando_items = args.plando_items.copy() - multiworld.plando_texts = args.plando_texts.copy() - multiworld.plando_connections = args.plando_connections.copy() multiworld.game = args.game.copy() multiworld.player_name = args.name.copy() multiworld.sprite = args.sprite.copy() @@ -135,6 +132,8 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No multiworld.worlds[1].options.non_local_items.value = set() multiworld.worlds[1].options.local_items.value = set() + multiworld.plando_item_blocks = parse_planned_blocks(multiworld) + AutoWorld.call_all(multiworld, "connect_entrances") AutoWorld.call_all(multiworld, "generate_basic") @@ -179,8 +178,9 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No multiworld._all_state = None logger.info("Running Item Plando.") - - distribute_planned(multiworld) + resolve_early_locations_for_planned(multiworld) + distribute_planned_blocks(multiworld, [x for player in multiworld.plando_item_blocks + for x in multiworld.plando_item_blocks[player]]) logger.info('Running Pre Main Fill.') diff --git a/Options.py b/Options.py index 41c2a77d3a..86e58ca64a 100644 --- a/Options.py +++ b/Options.py @@ -24,6 +24,12 @@ if typing.TYPE_CHECKING: import pathlib +def roll_percentage(percentage: int | float) -> bool: + """Roll a percentage chance. + percentage is expected to be in range [0, 100]""" + return random.random() < (float(percentage) / 100) + + class OptionError(ValueError): pass @@ -1019,7 +1025,7 @@ class PlandoTexts(Option[typing.List[PlandoText]], VerifyKeys): if isinstance(data, typing.Iterable): for text in data: if isinstance(text, typing.Mapping): - if random.random() < float(text.get("percentage", 100)/100): + if roll_percentage(text.get("percentage", 100)): at = text.get("at", None) if at is not None: if isinstance(at, dict): @@ -1045,7 +1051,7 @@ class PlandoTexts(Option[typing.List[PlandoText]], VerifyKeys): else: raise OptionError("\"at\" must be a valid string or weighted list of strings!") elif isinstance(text, PlandoText): - if random.random() < float(text.percentage/100): + if roll_percentage(text.percentage): texts.append(text) else: raise Exception(f"Cannot create plando text from non-dictionary type, got {type(text)}") @@ -1169,7 +1175,7 @@ class PlandoConnections(Option[typing.List[PlandoConnection]], metaclass=Connect for connection in data: if isinstance(connection, typing.Mapping): percentage = connection.get("percentage", 100) - if random.random() < float(percentage / 100): + if roll_percentage(percentage): entrance = connection.get("entrance", None) if is_iterable_except_str(entrance): entrance = random.choice(sorted(entrance)) @@ -1187,7 +1193,7 @@ class PlandoConnections(Option[typing.List[PlandoConnection]], metaclass=Connect percentage )) elif isinstance(connection, PlandoConnection): - if random.random() < float(connection.percentage / 100): + if roll_percentage(connection.percentage): value.append(connection) else: raise Exception(f"Cannot create connection from non-Dict type, got {type(connection)}.") @@ -1469,6 +1475,131 @@ class ItemLinks(OptionList): link["item_pool"] = list(pool) +@dataclass(frozen=True) +class PlandoItem: + items: list[str] | dict[str, typing.Any] + locations: list[str] + world: int | str | bool | None | typing.Iterable[str] | set[int] = False + from_pool: bool = True + force: bool | typing.Literal["silent"] = "silent" + count: int | bool | dict[str, int] = False + percentage: int = 100 + + +class PlandoItems(Option[typing.List[PlandoItem]]): + """Generic items plando.""" + default = () + supports_weighting = False + display_name = "Plando Items" + + def __init__(self, value: typing.Iterable[PlandoItem]) -> None: + self.value = list(deepcopy(value)) + super().__init__() + + @classmethod + def from_any(cls, data: typing.Any) -> Option[typing.List[PlandoItem]]: + if not isinstance(data, typing.Iterable): + raise OptionError(f"Cannot create plando items from non-Iterable type, got {type(data)}") + + value: typing.List[PlandoItem] = [] + for item in data: + if isinstance(item, typing.Mapping): + percentage = item.get("percentage", 100) + if not isinstance(percentage, int): + raise OptionError(f"Plando `percentage` has to be int, not {type(percentage)}.") + if not (0 <= percentage <= 100): + raise OptionError(f"Plando `percentage` has to be between 0 and 100 (inclusive) not {percentage}.") + if roll_percentage(percentage): + count = item.get("count", False) + items = item.get("items", []) + if not items: + items = item.get("item", None) # explicitly throw an error here if not present + if not items: + raise OptionError("You must specify at least one item to place items with plando.") + count = 1 + if isinstance(items, str): + items = [items] + elif not isinstance(items, (dict, list)): + raise OptionError(f"Plando 'items' has to be string, list, or " + f"dictionary, not {type(items)}") + locations = item.get("locations", []) + if not locations: + locations = item.get("location", ["Everywhere"]) + if locations: + count = 1 + if isinstance(locations, str): + locations = [locations] + if not isinstance(locations, list): + raise OptionError(f"Plando `location` has to be string or list, not {type(locations)}") + world = item.get("world", False) + from_pool = item.get("from_pool", True) + force = item.get("force", "silent") + if not isinstance(from_pool, bool): + raise OptionError(f"Plando 'from_pool' has to be true or false, not {from_pool!r}.") + if not (isinstance(force, bool) or force == "silent"): + raise OptionError(f"Plando `force` has to be true or false or `silent`, not {force!r}.") + value.append(PlandoItem(items, locations, world, from_pool, force, count, percentage)) + elif isinstance(item, PlandoItem): + if roll_percentage(item.percentage): + value.append(item) + else: + raise OptionError(f"Cannot create plando item from non-Dict type, got {type(item)}.") + return cls(value) + + def verify(self, world: typing.Type[World], player_name: str, plando_options: "PlandoOptions") -> None: + if not self.value: + return + from BaseClasses import PlandoOptions + if not (PlandoOptions.items & plando_options): + # plando is disabled but plando options were given so overwrite the options + self.value = [] + logging.warning(f"The plando items module is turned off, " + f"so items for {player_name} will be ignored.") + else: + # filter down item groups + for plando in self.value: + # confirm a valid count + if isinstance(plando.count, dict): + if "min" in plando.count and "max" in plando.count: + if plando.count["min"] > plando.count["max"]: + raise OptionError("Plando cannot have count `min` greater than `max`.") + items_copy = plando.items.copy() + if isinstance(plando.items, dict): + for item in items_copy: + if item in world.item_name_groups: + value = plando.items.pop(item) + group = world.item_name_groups[item] + filtered_items = sorted(group.difference(list(plando.items.keys()))) + if not filtered_items: + raise OptionError(f"Plando `items` contains the group \"{item}\" " + f"and every item in it. This is not allowed.") + if value is True: + for key in filtered_items: + plando.items[key] = True + else: + for key in random.choices(filtered_items, k=value): + plando.items[key] = plando.items.get(key, 0) + 1 + else: + assert isinstance(plando.items, list) # pycharm can't figure out the hinting without the hint + for item in items_copy: + if item in world.item_name_groups: + plando.items.remove(item) + plando.items.extend(sorted(world.item_name_groups[item])) + + @classmethod + def get_option_name(cls, value: list[PlandoItem]) -> str: + return ", ".join(["(%s: %s)" % (item.items, item.locations) for item in value]) #TODO: see what a better way to display would be + + def __getitem__(self, index: typing.SupportsIndex) -> PlandoItem: + return self.value.__getitem__(index) + + def __iter__(self) -> typing.Iterator[PlandoItem]: + yield from self.value + + def __len__(self) -> int: + return len(self.value) + + class Removed(FreeText): """This Option has been Removed.""" rich_text_doc = True @@ -1491,6 +1622,7 @@ class PerGameCommonOptions(CommonOptions): exclude_locations: ExcludeLocations priority_locations: PriorityLocations item_links: ItemLinks + plando_items: PlandoItems @dataclass diff --git a/test/general/test_implemented.py b/test/general/test_implemented.py index 1082a02912..b74f82b738 100644 --- a/test/general/test_implemented.py +++ b/test/general/test_implemented.py @@ -53,6 +53,22 @@ class TestImplemented(unittest.TestCase): if failed_world_loads: self.fail(f"The following worlds failed to load: {failed_world_loads}") + def test_prefill_items(self): + """Test that every world can reach every location from allstate before pre_fill.""" + for gamename, world_type in AutoWorldRegister.world_types.items(): + if gamename not in ("Archipelago", "Sudoku", "Final Fantasy", "Test Game"): + with self.subTest(gamename): + multiworld = setup_solo_multiworld(world_type, ("generate_early", "create_regions", "create_items", + "set_rules", "connect_entrances", "generate_basic")) + allstate = multiworld.get_all_state(False) + locations = multiworld.get_locations() + reachable = multiworld.get_reachable_locations(allstate) + unreachable = [location for location in locations if location not in reachable] + + self.assertTrue(not unreachable, + f"Locations were not reachable with all state before prefill: " + f"{unreachable}. Seed: {multiworld.seed}") + def test_explicit_indirect_conditions_spheres(self): """Tests that worlds using explicit indirect conditions produce identical spheres as when using implicit indirect conditions""" diff --git a/test/general/test_state.py b/test/general/test_state.py index 460fc3d608..06c4046a69 100644 --- a/test/general/test_state.py +++ b/test/general/test_state.py @@ -26,4 +26,4 @@ class TestBase(unittest.TestCase): for step in self.test_steps: with self.subTest("Step", step=step): call_all(multiworld, step) - self.assertTrue(multiworld.get_all_state(False, True)) + self.assertTrue(multiworld.get_all_state(False, allow_partial_entrances=True)) diff --git a/worlds/alttp/EntranceRandomizer.py b/worlds/alttp/EntranceRandomizer.py index e62088c1e0..569e6a5d7e 100644 --- a/worlds/alttp/EntranceRandomizer.py +++ b/worlds/alttp/EntranceRandomizer.py @@ -54,16 +54,13 @@ def parse_arguments(argv, no_defaults=False): ret = parser.parse_args(argv) # cannot be set through CLI currently - ret.plando_items = [] - ret.plando_texts = {} - ret.plando_connections = [] if multiargs.multi: defaults = copy.deepcopy(ret) for player in range(1, multiargs.multi + 1): playerargs = parse_arguments(shlex.split(getattr(ret, f"p{player}")), True) - for name in ["plando_items", "plando_texts", "plando_connections", "game", "sprite", "sprite_pool"]: + for name in ["game", "sprite", "sprite_pool"]: value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) if player == 1: setattr(ret, name, {1: value}) diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 1934138afa..7f8d6ddf68 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -505,20 +505,20 @@ class ALTTPWorld(World): def pre_fill(self): from Fill import fill_restrictive, FillError attempts = 5 - world = self.multiworld - player = self.player - all_state = world.get_all_state(use_cache=True) + all_state = self.multiworld.get_all_state(use_cache=False) crystals = [self.create_item(name) for name in ['Red Pendant', 'Blue Pendant', 'Green Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 7', 'Crystal 5', 'Crystal 6']] - crystal_locations = [world.get_location('Turtle Rock - Prize', player), - world.get_location('Eastern Palace - Prize', player), - world.get_location('Desert Palace - Prize', player), - world.get_location('Tower of Hera - Prize', player), - world.get_location('Palace of Darkness - Prize', player), - world.get_location('Thieves\' Town - Prize', player), - world.get_location('Skull Woods - Prize', player), - world.get_location('Swamp Palace - Prize', player), - world.get_location('Ice Palace - Prize', player), - world.get_location('Misery Mire - Prize', player)] + for crystal in crystals: + all_state.remove(crystal) + crystal_locations = [self.get_location('Turtle Rock - Prize'), + self.get_location('Eastern Palace - Prize'), + self.get_location('Desert Palace - Prize'), + self.get_location('Tower of Hera - Prize'), + self.get_location('Palace of Darkness - Prize'), + self.get_location('Thieves\' Town - Prize'), + self.get_location('Skull Woods - Prize'), + self.get_location('Swamp Palace - Prize'), + self.get_location('Ice Palace - Prize'), + self.get_location('Misery Mire - Prize')] placed_prizes = {loc.item.name for loc in crystal_locations if loc.item} unplaced_prizes = [crystal for crystal in crystals if crystal.name not in placed_prizes] empty_crystal_locations = [loc for loc in crystal_locations if not loc.item] @@ -526,8 +526,8 @@ class ALTTPWorld(World): try: prizepool = unplaced_prizes.copy() prize_locs = empty_crystal_locations.copy() - world.random.shuffle(prize_locs) - fill_restrictive(world, all_state, prize_locs, prizepool, True, lock=True, + self.multiworld.random.shuffle(prize_locs) + fill_restrictive(self.multiworld, all_state, prize_locs, prizepool, True, lock=True, name="LttP Dungeon Prizes") except FillError as e: lttp_logger.exception("Failed to place dungeon prizes (%s). Will retry %s more times", e, @@ -541,7 +541,7 @@ class ALTTPWorld(World): if self.options.mode == 'standard' and self.options.small_key_shuffle \ and self.options.small_key_shuffle != small_key_shuffle.option_universal and \ self.options.small_key_shuffle != small_key_shuffle.option_own_dungeons: - world.local_early_items[player]["Small Key (Hyrule Castle)"] = 1 + self.multiworld.local_early_items[self.player]["Small Key (Hyrule Castle)"] = 1 @classmethod def stage_pre_fill(cls, world): @@ -811,12 +811,15 @@ class ALTTPWorld(World): return GetBeemizerItem(self.multiworld, self.player, item) def get_pre_fill_items(self): - res = [] + res = [self.create_item(name) for name in ('Red Pendant', 'Blue Pendant', 'Green Pendant', 'Crystal 1', + 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 7', 'Crystal 5', + 'Crystal 6')] if self.dungeon_local_item_names: for dungeon in self.dungeons.values(): for item in dungeon.all_items: if item.name in self.dungeon_local_item_names: res.append(item) + return res def fill_slot_data(self): diff --git a/worlds/blasphemous/__init__.py b/worlds/blasphemous/__init__.py index a643e91c9b..9dffc6c6d2 100644 --- a/worlds/blasphemous/__init__.py +++ b/worlds/blasphemous/__init__.py @@ -207,7 +207,6 @@ class BlasphemousWorld(World): if not self.options.skill_randomizer: self.place_items_from_dict(skill_dict) - def place_items_from_set(self, location_set: Set[str], name: str): for loc in location_set: self.get_location(loc).place_locked_item(self.create_item(name)) diff --git a/worlds/hylics2/__init__.py b/worlds/hylics2/__init__.py index 18bcb0edc1..f94d9c2253 100644 --- a/worlds/hylics2/__init__.py +++ b/worlds/hylics2/__init__.py @@ -127,6 +127,10 @@ class Hylics2World(World): tv = tvs.pop() self.get_location(tv).place_locked_item(self.create_item(gesture)) + def get_pre_fill_items(self) -> List["Item"]: + if self.options.gesture_shuffle: + return [self.create_item(gesture["name"]) for gesture in Items.gesture_item_table.values()] + return [] def fill_slot_data(self) -> Dict[str, Any]: slot_data: Dict[str, Any] = { diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index edc4305acc..defb285d50 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -436,6 +436,10 @@ class KH2World(World): for location in keyblade_locations: location.locked = True + def get_pre_fill_items(self) -> List["Item"]: + return [self.create_item(item) for item in [*DonaldAbility_Table.keys(), *GoofyAbility_Table.keys(), + *SupportAbility_Table.keys()]] + def starting_invo_verify(self): """ Making sure the player doesn't put too many abilities in their starting inventory. diff --git a/worlds/ladx/test/testShop.py b/worlds/ladx/test/testShop.py index 91d504d521..a28ba39b2f 100644 --- a/worlds/ladx/test/testShop.py +++ b/worlds/ladx/test/testShop.py @@ -1,6 +1,7 @@ from typing import Optional -from Fill import distribute_planned +from Fill import parse_planned_blocks, distribute_planned_blocks, resolve_early_locations_for_planned +from Options import PlandoItems from test.general import setup_solo_multiworld from worlds.AutoWorld import call_all from . import LADXTestBase @@ -19,14 +20,17 @@ class PlandoTest(LADXTestBase): ], }], } - + def world_setup(self, seed: Optional[int] = None) -> None: self.multiworld = setup_solo_multiworld( LinksAwakeningWorld, ("generate_early", "create_regions", "create_items", "set_rules", "generate_basic") ) - self.multiworld.plando_items[1] = self.options["plando_items"] - distribute_planned(self.multiworld) + self.multiworld.worlds[1].options.plando_items = PlandoItems.from_any(self.options["plando_items"]) + self.multiworld.plando_item_blocks = parse_planned_blocks(self.multiworld) + resolve_early_locations_for_planned(self.multiworld) + distribute_planned_blocks(self.multiworld, [x for player in self.multiworld.plando_item_blocks + for x in self.multiworld.plando_item_blocks[player]]) call_all(self.multiworld, "pre_fill") def test_planned(self): diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index 136439ee96..401c387d5e 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -32,7 +32,7 @@ from .Cosmetics import patch_cosmetics from settings import get_settings from BaseClasses import MultiWorld, CollectionState, Tutorial, LocationProgressType -from Options import Range, Toggle, VerifyKeys, Accessibility, PlandoConnections +from Options import Range, Toggle, VerifyKeys, Accessibility, PlandoConnections, PlandoItems from Fill import fill_restrictive, fast_fill, FillError from worlds.generic.Rules import exclusion_rules, add_item_rule from worlds.AutoWorld import World, AutoLogicRegister, WebWorld @@ -220,6 +220,8 @@ class OOTWorld(World): option_value = result.value elif isinstance(result, PlandoConnections): option_value = result.value + elif isinstance(result, PlandoItems): + option_value = result.value else: option_value = result.current_key setattr(self, option_name, option_value) diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index 6bf66a1106..a455e38f29 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -321,7 +321,7 @@ class PokemonRedBlueWorld(World): "Fuchsia Gym - Koga Prize", "Saffron Gym - Sabrina Prize", "Cinnabar Gym - Blaine Prize", "Viridian Gym - Giovanni Prize" ] if self.multiworld.get_location(loc, self.player).item is None] - state = self.multiworld.get_all_state(False) + state = self.multiworld.get_all_state(False, True, False) # Give it two tries to place badges with wild Pokemon and learnsets as-is. # If it can't, then try with all Pokemon collected, and we'll try to fix HM move availability after. if attempt > 1: @@ -395,7 +395,7 @@ class PokemonRedBlueWorld(World): # Delete evolution events for Pokémon that are not in logic in an all_state so that accessibility check does not # fail. Re-use test_state from previous final loop. - all_state = self.multiworld.get_all_state(False) + all_state = self.multiworld.get_all_state(False, True, False) evolutions_region = self.multiworld.get_region("Evolution", self.player) for location in evolutions_region.locations.copy(): if not all_state.can_reach(location, player=self.player): @@ -448,7 +448,7 @@ class PokemonRedBlueWorld(World): self.local_locs = locs - all_state = self.multiworld.get_all_state(False) + all_state = self.multiworld.get_all_state(False, True, False) reachable_mons = set() for mon in poke_data.pokemon_data: @@ -516,6 +516,11 @@ class PokemonRedBlueWorld(World): loc.item = None loc.place_locked_item(self.pc_item) + def get_pre_fill_items(self) -> typing.List["Item"]: + pool = [self.create_item(mon) for mon in poke_data.pokemon_data] + pool.append(self.pc_item) + return pool + @classmethod def stage_post_fill(cls, multiworld): # Convert all but one of each instance of a wild Pokemon to useful classification. diff --git a/worlds/pokemon_rb/pokemon.py b/worlds/pokemon_rb/pokemon.py index e5d161a433..f1c171b88d 100644 --- a/worlds/pokemon_rb/pokemon.py +++ b/worlds/pokemon_rb/pokemon.py @@ -400,7 +400,7 @@ def verify_hm_moves(multiworld, world, player): last_intervene = None while True: intervene_move = None - test_state = multiworld.get_all_state(False) + test_state = multiworld.get_all_state(False, True, False) if not logic.can_learn_hm(test_state, world, "Surf", player): intervene_move = "Surf" elif not logic.can_learn_hm(test_state, world, "Strength", player): diff --git a/worlds/sc2/Locations.py b/worlds/sc2/Locations.py index b9c30bb701..42b1dd4d4e 100644 --- a/worlds/sc2/Locations.py +++ b/worlds/sc2/Locations.py @@ -66,11 +66,8 @@ def get_plando_locations(world: World) -> List[str]: if world is None: return [] plando_locations = [] - for plando_setting in world.multiworld.plando_items[world.player]: - plando_locations += plando_setting.get("locations", []) - plando_setting_location = plando_setting.get("location", None) - if plando_setting_location is not None: - plando_locations.append(plando_setting_location) + for plando_setting in world.options.plando_items: + plando_locations += plando_setting.locations return plando_locations diff --git a/worlds/shivers/__init__.py b/worlds/shivers/__init__.py index 85f2cf1861..3430a5a02d 100644 --- a/worlds/shivers/__init__.py +++ b/worlds/shivers/__init__.py @@ -245,7 +245,7 @@ class ShiversWorld(World): storage_items += [self.create_item("Empty") for _ in range(3)] - state = self.multiworld.get_all_state(False) + state = self.multiworld.get_all_state(False, True, False) self.random.shuffle(storage_locs) self.random.shuffle(storage_items) @@ -255,6 +255,27 @@ class ShiversWorld(World): self.storage_placements = {location.name.replace("Storage: ", ""): location.item.name.replace(" DUPE", "") for location in storage_locs} + def get_pre_fill_items(self) -> List[Item]: + if self.options.full_pots == "pieces": + return [self.create_item(name) for name, data in item_table.items() if + data.type == ItemType.POT_DUPLICATE] + elif self.options.full_pots == "complete": + return [self.create_item(name) for name, data in item_table.items() if + data.type == ItemType.POT_COMPELTE_DUPLICATE] + else: + pool = [] + pieces = [self.create_item(name) for name, data in item_table.items() if + data.type == ItemType.POT_DUPLICATE] + complete = [self.create_item(name) for name, data in item_table.items() if + data.type == ItemType.POT_COMPELTE_DUPLICATE] + for i in range(10): + if self.pot_completed_list[i] == 0: + pool.append(pieces[i]) + pool.append(pieces[i + 10]) + else: + pool.append(complete[i]) + return pool + def fill_slot_data(self) -> dict: return { "StoragePlacements": self.storage_placements, diff --git a/worlds/stardew_valley/test/stability/TestUniversalTracker.py b/worlds/stardew_valley/test/stability/TestUniversalTracker.py index 0268d9e515..7590635aa1 100644 --- a/worlds/stardew_valley/test/stability/TestUniversalTracker.py +++ b/worlds/stardew_valley/test/stability/TestUniversalTracker.py @@ -35,9 +35,6 @@ class TestUniversalTrackerGenerationIsStable(SVTestBase): args.multi = 1 args.race = None args.plando_options = self.multiworld.plando_options - args.plando_items = self.multiworld.plando_items - args.plando_texts = self.multiworld.plando_texts - args.plando_connections = self.multiworld.plando_connections args.game = self.multiworld.game args.name = self.multiworld.player_name args.sprite = {} diff --git a/worlds/witness/player_items.py b/worlds/witness/player_items.py index 7b71e3c1f9..d13ebcafdc 100644 --- a/worlds/witness/player_items.py +++ b/worlds/witness/player_items.py @@ -214,20 +214,17 @@ class WitnessPlayerItems: # Remove items that are mentioned in any plando options. (Hopefully, in the future, plando will get resolved # before create_items so that we'll be able to check placed items instead of just removing all items mentioned # regardless of whether or not they actually wind up being manually placed. - for plando_setting in self._multiworld.plando_items[self._player_id]: - if plando_setting.get("from_pool", True): - for item_setting_key in [key for key in ["item", "items"] if key in plando_setting]: - if isinstance(plando_setting[item_setting_key], str): - output -= {plando_setting[item_setting_key]} - elif isinstance(plando_setting[item_setting_key], dict): - output -= {item for item, weight in plando_setting[item_setting_key].items() if weight} - else: - # Assume this is some other kind of iterable. - for inner_item in plando_setting[item_setting_key]: - if isinstance(inner_item, str): - output -= {inner_item} - elif isinstance(inner_item, dict): - output -= {item for item, weight in inner_item.items() if weight} + for plando_setting in self._world.options.plando_items: + if plando_setting.from_pool: + if isinstance(plando_setting.items, dict): + output -= {item for item, weight in plando_setting.items.items() if weight} + else: + # Assume this is some other kind of iterable. + for inner_item in plando_setting.items: + if isinstance(inner_item, str): + output -= {inner_item} + elif isinstance(inner_item, dict): + output -= {item for item, weight in inner_item.items() if weight} # Sort the output for consistency across versions if the implementation changes but the logic does not. return sorted(output) From 53defd310835e064c9ca10d142d13185be717ae3 Mon Sep 17 00:00:00 2001 From: qwint Date: Sat, 10 May 2025 17:51:44 -0500 Subject: [PATCH 126/199] MultiServer: More Guardrails for Nolocation Clients (#4470) --- MultiServer.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index bdc6b8c84f..9bcf8f6f4c 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1826,7 +1826,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): ctx.clients[team][slot].append(client) client.version = args['version'] client.tags = args['tags'] - client.no_locations = "TextOnly" in client.tags or "Tracker" in client.tags + client.no_locations = bool(client.tags & _non_game_messages.keys()) # set NoText for old PopTracker clients that predate the tag to save traffic client.no_text = "NoText" in client.tags or ("PopTracker" in client.tags and client.version < (0, 5, 1)) connected_packet = { @@ -1900,7 +1900,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): old_tags = client.tags client.tags = args["tags"] if set(old_tags) != set(client.tags): - client.no_locations = 'TextOnly' in client.tags or 'Tracker' in client.tags + client.no_locations = bool(client.tags & _non_game_messages.keys()) client.no_text = "NoText" in client.tags or ( "PopTracker" in client.tags and client.version < (0, 5, 1) ) @@ -1990,9 +1990,14 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): ctx.save() for slot in concerning_slots: ctx.on_changed_hints(client.team, slot) - + elif cmd == 'StatusUpdate': - update_client_status(ctx, client, args["status"]) + if client.no_locations and args["status"] == ClientStatus.CLIENT_GOAL: + await ctx.send_msgs(client, [{'cmd': 'InvalidPacket', "type": "cmd", + "text": "Trackers can't register Goal Complete", + "original_cmd": cmd}]) + else: + update_client_status(ctx, client, args["status"]) elif cmd == 'Say': if "text" not in args or type(args["text"]) is not str or not args["text"].isprintable(): From e809b9328bbbbf7c65599cb8d3bbb726f7f1ab0f Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Sat, 10 May 2025 17:57:16 -0500 Subject: [PATCH 127/199] The Messenger: do all empty state validation during portal shuffle (#4971) --- worlds/messenger/__init__.py | 6 ++-- worlds/messenger/portals.py | 6 ++-- worlds/messenger/subclasses.py | 17 ---------- worlds/messenger/transitions.py | 55 +++++++++++++++++---------------- 4 files changed, 34 insertions(+), 50 deletions(-) diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 2382a46c31..09911fd531 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -16,8 +16,8 @@ from .portals import PORTALS, add_closed_portal_reqs, disconnect_portals, shuffl from .regions import LEVELS, MEGA_SHARDS, LOCATIONS, REGION_CONNECTIONS from .rules import MessengerHardRules, MessengerOOBRules, MessengerRules from .shop import FIGURINES, PROG_SHOP_ITEMS, SHOP_ITEMS, USEFUL_SHOP_ITEMS, shuffle_shop_prices -from .subclasses import MessengerEntrance, MessengerItem, MessengerRegion, MessengerShopLocation -from .transitions import shuffle_transitions +from .subclasses import MessengerItem, MessengerRegion, MessengerShopLocation +from .transitions import disconnect_entrances, shuffle_transitions components.append( Component("The Messenger", component_type=Type.CLIENT, func=launch_game, game_name="The Messenger", supports_uri=True) @@ -266,6 +266,8 @@ class MessengerWorld(World): # MessengerOOBRules(self).set_messenger_rules() def connect_entrances(self) -> None: + if self.options.shuffle_transitions: + disconnect_entrances(self) add_closed_portal_reqs(self) # i need portal shuffle to happen after rules exist so i can validate it attempts = 5 diff --git a/worlds/messenger/portals.py b/worlds/messenger/portals.py index 704285896c..c04fc696e9 100644 --- a/worlds/messenger/portals.py +++ b/worlds/messenger/portals.py @@ -292,12 +292,10 @@ def disconnect_portals(world: "MessengerWorld") -> None: def validate_portals(world: "MessengerWorld") -> bool: - if world.options.shuffle_transitions: - return True - new_state = CollectionState(world.multiworld) + new_state = CollectionState(world.multiworld, True) new_state.update_reachable_regions(world.player) reachable_locs = 0 - for loc in world.multiworld.get_locations(world.player): + for loc in world.get_locations(): reachable_locs += loc.can_reach(new_state) if reachable_locs > 5: return True diff --git a/worlds/messenger/subclasses.py b/worlds/messenger/subclasses.py index 0138a3f074..2e438fdbfd 100644 --- a/worlds/messenger/subclasses.py +++ b/worlds/messenger/subclasses.py @@ -10,25 +10,8 @@ if TYPE_CHECKING: from . import MessengerWorld -class MessengerEntrance(Entrance): - world: "MessengerWorld | None" = None - - def can_connect_to(self, other: Entrance, dead_end: bool, state: "ERPlacementState") -> bool: - can_connect = super().can_connect_to(other, dead_end, state) - world: MessengerWorld = getattr(self, "world", None) - if not world or world.reachable_locs or not can_connect: - return can_connect - empty_state = CollectionState(world.multiworld, True) - self.connected_region = other.connected_region - empty_state.update_reachable_regions(world.player) - world.reachable_locs = any(loc.can_reach(empty_state) and not loc.is_event for loc in world.get_locations()) - self.connected_region = None - return world.reachable_locs and (not state.coupled or self.name != other.name) - - class MessengerRegion(Region): parent: str | None - entrance_type = MessengerEntrance def __init__(self, name: str, world: "MessengerWorld", parent: str | None = None) -> None: super().__init__(name, world.player, world.multiworld) diff --git a/worlds/messenger/transitions.py b/worlds/messenger/transitions.py index 53cfd836d5..c0ae64c548 100644 --- a/worlds/messenger/transitions.py +++ b/worlds/messenger/transitions.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING -from BaseClasses import Region +from BaseClasses import Entrance, Region from entrance_rando import EntranceType, randomize_entrances from .connections import RANDOMIZED_CONNECTIONS, TRANSITIONS from .options import ShuffleTransitions, TransitionPlando @@ -9,6 +9,33 @@ if TYPE_CHECKING: from . import MessengerWorld +def disconnect_entrances(world: "MessengerWorld") -> None: + def disconnect_entrance() -> None: + child = entrance.connected_region.name + child_region = entrance.connected_region + child_region.entrances.remove(entrance) + entrance.connected_region = None + + er_type = EntranceType.ONE_WAY if child == "Glacial Peak - Left" else \ + EntranceType.TWO_WAY if child in RANDOMIZED_CONNECTIONS else EntranceType.ONE_WAY + if er_type == EntranceType.TWO_WAY: + mock_entrance = entrance.parent_region.create_er_target(entrance.name) + else: + mock_entrance = child_region.create_er_target(child) + + entrance.randomization_type = er_type + mock_entrance.randomization_type = er_type + + + for parent, child in RANDOMIZED_CONNECTIONS.items(): + if child == "Corrupted Future": + entrance = world.get_entrance("Artificer's Portal") + elif child == "Tower of Time - Left": + entrance = world.get_entrance("Artificer's Challenge") + else: + entrance = world.get_entrance(f"{parent} -> {child}") + disconnect_entrance() + def connect_plando(world: "MessengerWorld", plando_connections: TransitionPlando) -> None: def remove_dangling_exit(region: Region) -> None: # find the disconnected exit and remove references to it @@ -59,32 +86,6 @@ def connect_plando(world: "MessengerWorld", plando_connections: TransitionPlando def shuffle_transitions(world: "MessengerWorld") -> None: coupled = world.options.shuffle_transitions == ShuffleTransitions.option_coupled - def disconnect_entrance() -> None: - child_region.entrances.remove(entrance) - entrance.connected_region = None - - er_type = EntranceType.ONE_WAY if child == "Glacial Peak - Left" else \ - EntranceType.TWO_WAY if child in RANDOMIZED_CONNECTIONS else EntranceType.ONE_WAY - if er_type == EntranceType.TWO_WAY: - mock_entrance = parent_region.create_er_target(entrance.name) - else: - mock_entrance = child_region.create_er_target(child) - - entrance.randomization_type = er_type - mock_entrance.randomization_type = er_type - - for parent, child in RANDOMIZED_CONNECTIONS.items(): - if child == "Corrupted Future": - entrance = world.get_entrance("Artificer's Portal") - elif child == "Tower of Time - Left": - entrance = world.get_entrance("Artificer's Challenge") - else: - entrance = world.get_entrance(f"{parent} -> {child}") - parent_region = entrance.parent_region - child_region = entrance.connected_region - entrance.world = world - disconnect_entrance() - plando = world.options.plando_connections if plando: connect_plando(world, plando) From c0b3fa9ff74e89b33b668cbfe0201ebc65f1a31c Mon Sep 17 00:00:00 2001 From: lordlou <87331798+lordlou@users.noreply.github.com> Date: Sun, 11 May 2025 02:10:51 -0400 Subject: [PATCH 128/199] SMZ3: replace copyright credits music (#4978) --- worlds/smz3/data/zsm.ips | Bin 1470841 -> 1404088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/smz3/data/zsm.ips b/worlds/smz3/data/zsm.ips index 87a4f924f1933fcf59493753c034192ef03a328c..54c558185045dd59fcfbeae1d71a2b8ad01303bd 100644 GIT binary patch delta 1027 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

TS6{ARUI;eo3BGM;K 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 Date: Sun, 11 May 2025 03:41:35 -0700 Subject: [PATCH 129/199] Docs: clarify that ModuleUpdate.py is a prerequisite for running tests (#4970) * Update tests.md Spelled out that tests will not run without running UpdateModule.py first and including a link to the instructions on how to do that. * Applied black-silver's feedback and also I ran into tests that don't run correctly unless you also have run Webhost.py once. I have included that in the documentation as well. * More black-silver feedback. --- docs/tests.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/tests.md b/docs/tests.md index a9a1962685..13d62b0132 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -119,8 +119,12 @@ variable to keep all the benefits of the test framework while not running the ma #### Using Pycharm In PyCharm, running all tests can be done by right-clicking the root test directory and selecting Run 'Archipelago Unittests'. -Unless you configured PyCharm to use pytest as a test runner, you may get import failures. To solve this, edit the run configuration, -and set the working directory to the Archipelago directory which contains all the project files. +If you have never previously run ModuleUpdate.py, then you will need to do this once before the tests will run. +You can run ModuleUpdate.py by right-clicking ModuleUpdate.py and selecting `Run 'ModuleUpdate'`. +After running ModuleUpdate.py you may still get a `ModuleNotFoundError: No module named 'flask'` for the webhost tests. +If this happens, run WebHost.py by right-clicking it and selecting `Run 'WebHost'`. Make sure to press enter when prompted. +Unless you configured PyCharm to use pytest as a test runner, you may get import failures. To solve this, +edit the run configuration, and set the working directory to the Archipelago directory which contains all the project files. If you only want to run your world's defined tests, repeat the steps for the test directory within your world. Your working directory should be the directory of your world in the worlds directory and the script should be the From 8340371f9c27d59f674369f079844736d75ade91 Mon Sep 17 00:00:00 2001 From: Justus Lind Date: Tue, 13 May 2025 08:47:19 +1000 Subject: [PATCH 130/199] Muse Dash: Update to Otaku Pack Vol 20 (#4924) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/musedash/MuseDashCollection.py | 2 ++ worlds/musedash/MuseDashData.py | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/worlds/musedash/MuseDashCollection.py b/worlds/musedash/MuseDashCollection.py index 96a506f2fa..2a9f56750e 100644 --- a/worlds/musedash/MuseDashCollection.py +++ b/worlds/musedash/MuseDashCollection.py @@ -36,6 +36,8 @@ class MuseDashCollections: "Yume Ou Mono Yo Secret", "Echo over you... Secret", "Tsukuyomi Ni Naru Replaced", + "Heart Message feat. Aoi Tokimori Secret", + "Meow Rock feat. Chun Ge, Yuan Shen", ] song_items = SONG_DATA diff --git a/worlds/musedash/MuseDashData.py b/worlds/musedash/MuseDashData.py index 71d69eecb5..f2bcf1220f 100644 --- a/worlds/musedash/MuseDashData.py +++ b/worlds/musedash/MuseDashData.py @@ -627,10 +627,18 @@ SONG_DATA: Dict[str, SongData] = { "Sharp Bubbles": SongData(2900751, "83-3", "Cosmic Radio 2024", True, 7, 9, 11), "Replay": SongData(2900752, "83-4", "Cosmic Radio 2024", True, 5, 7, 9), "Cosmic Dusty Girl": SongData(2900753, "83-5", "Cosmic Radio 2024", True, 5, 7, 9), - "Meow Rock feat. Chun Ge, Yuan Shen": SongData(2900754, "84-0", "Muse Dash Legend", True, None, None, None), - "Even if you make an old radio song with AI": SongData(2900755, "84-1", "Muse Dash Legend", False, 3, 6, 8), - "Unusual Sketchbook": SongData(2900756, "84-2", "Muse Dash Legend", True, 6, 8, 11), - "TransientTears": SongData(2900757, "84-3", "Muse Dash Legend", True, 6, 8, 11), - "SHOOTING*STAR": SongData(2900758, "84-4", "Muse Dash Legend", False, 5, 7, 9), - "But the Blue Bird is Already Dead": SongData(2900759, "84-5", "Muse Dash Legend", False, 6, 8, 10), + "Meow Rock feat. Chun Ge, Yuan Shen": SongData(2900754, "84-0", "Muse Dash・Legend", True, None, None, None), + "Even if you make an old radio song with AI": SongData(2900755, "84-1", "Muse Dash・Legend", False, 3, 6, 8), + "Unusual Sketchbook": SongData(2900756, "84-2", "Muse Dash・Legend", True, 6, 8, 11), + "TransientTears": SongData(2900757, "84-3", "Muse Dash・Legend", True, 6, 8, 11), + "SHOOTING*STAR": SongData(2900758, "84-4", "Muse Dash・Legend", False, 5, 7, 9), + "But the Blue Bird is Already Dead": SongData(2900759, "84-5", "Muse Dash・Legend", False, 6, 8, 10), + "Heart Message feat. Aoi Tokimori Secret": SongData(2900760, "0-57", "Default Music", True, None, 7, 10), + "Heart Message feat. Aoi Tokimori": SongData(2900761, "0-58", "Default Music", True, 1, 3, 6), + "Aventyr": SongData(2900762, "85-0", "Happy Otaku Pack Vol.20", True, 4, 7, 10), + "Raintain": SongData(2900763, "85-1", "Happy Otaku Pack Vol.20", False, 6, 8, 10), + "Piercing the Clouds and Waves": SongData(2900764, "85-2", "Happy Otaku Pack Vol.20", True, 3, 6, 8), + "Save Yourself": SongData(2900765, "85-3", "Happy Otaku Pack Vol.20", True, 5, 7, 10), + "Menace": SongData(2900766, "85-4", "Happy Otaku Pack Vol.20", True, 7, 9, 11), + "Dangling": SongData(2900767, "85-5", "Happy Otaku Pack Vol.20", True, 6, 8, 10), } From feaed7ea00bcae83bebf0844ca4ee8e1bd1f83a6 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 13 May 2025 07:49:43 +0000 Subject: [PATCH 131/199] Docs: tests: add naming / file naming conventions (#4982) * Docs: tests: add naming / file naming conventions Deprecates putting stuff into `__init__.py`. This may be relevant for test discovery in the future. * Docs: tests: fix class naming * Docs: tests: update examples * Punctuation is hard Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Revert part of one suggestion The first set of () make the sentence make less sense. * Docs: tests: clarify that __init__.py may be empty * Make sentence nicer to read I simply kept the original wording, but I agree that it reads somewhat odd Co-authored-by: Ixrec --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: Ixrec --- docs/tests.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/tests.md b/docs/tests.md index 13d62b0132..78cedbc514 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -11,8 +11,13 @@ found in the [general test directory](/test/general). ## Defining World Tests In order to run tests from your world, you will need to create a `test` package within your world package. This can be -done by creating a `test` directory with a file named `__init__.py` inside it inside your world. By convention, a base -for your world tests can be created in this file that you can then import into other modules. +done by creating a `test` directory inside your world with an (empty) `__init__.py` inside it. By convention, a base +for your world tests can be created in `bases.py` or any file that does not start with `test`, that you can then import +into other modules. All tests should be defined in files named `test_*.py` (all lower case) and be member functions +(named `test_*`) of classes (named `Test*` or `*Test`) that inherit from `unittest.TestCase` or a test base. + +Defining anything inside `test/__init__.py` is deprecated. Defining TestBase there was previously the norm; however, +it complicates test discovery because some worlds also put actual tests into `__init__.py`. ### WorldTestBase @@ -21,7 +26,7 @@ interactions in the world interact as expected, you will want to use the [WorldT comes with the basics for test setup as well as a few preloaded tests that most worlds might want to check on varying options combinations. -Example `/worlds//test/__init__.py`: +Example `/worlds//test/bases.py`: ```python from test.bases import WorldTestBase @@ -49,7 +54,7 @@ with `test_`. Example `/worlds//test/test_chest_access.py`: ```python -from . import MyGameTestBase +from .bases import MyGameTestBase class TestChestAccess(MyGameTestBase): From 7d5693e0fb6c09d185d02850a3c69d3a2508ea6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Tue, 13 May 2025 03:58:03 -0400 Subject: [PATCH 132/199] Stardew Valley: Move BaseTest out of `__init__.py` to comply with future conventions (#4991) * move everything out of init; fix from imports and some typing errors * why is there a change in multiserver * fix some relative shits --- worlds/stardew_valley/test/TestBackpack.py | 2 +- worlds/stardew_valley/test/TestBooksanity.py | 2 +- worlds/stardew_valley/test/TestBundles.py | 3 +- worlds/stardew_valley/test/TestCrops.py | 2 +- .../stardew_valley/test/TestDynamicGoals.py | 2 +- worlds/stardew_valley/test/TestFarmType.py | 4 +- worlds/stardew_valley/test/TestFill.py | 2 +- worlds/stardew_valley/test/TestFishsanity.py | 2 +- .../stardew_valley/test/TestFriendsanity.py | 2 +- worlds/stardew_valley/test/TestGeneration.py | 2 +- worlds/stardew_valley/test/TestItemLink.py | 2 +- worlds/stardew_valley/test/TestItems.py | 2 +- worlds/stardew_valley/test/TestLogic.py | 2 +- .../test/TestMultiplePlayers.py | 2 +- .../test/TestNumberLocations.py | 2 +- worlds/stardew_valley/test/TestOptionFlags.py | 2 +- worlds/stardew_valley/test/TestOptions.py | 2 +- .../stardew_valley/test/TestOptionsPairs.py | 2 +- .../stardew_valley/test/TestRandomWorlds.py | 2 +- worlds/stardew_valley/test/TestRegions.py | 2 +- .../stardew_valley/test/TestStartInventory.py | 2 +- worlds/stardew_valley/test/TestTraps.py | 3 +- .../stardew_valley/test/TestWalnutsanity.py | 2 +- worlds/stardew_valley/test/__init__.py | 308 ------------------ worlds/stardew_valley/test/bases.py | 306 +++++++++++++++++ .../test/content/TestGingerIsland.py | 2 +- .../test/content/mods/TestSVE.py | 2 +- .../stardew_valley/test/long/TestModsLong.py | 2 +- .../test/long/TestOptionsLong.py | 2 +- .../test/long/TestPreRolledRandomness.py | 2 +- .../test/mods/TestBiggerBackpack.py | 2 +- worlds/stardew_valley/test/mods/TestMods.py | 2 +- .../stardew_valley/test/mods/TestModsFill.py | 2 +- worlds/stardew_valley/test/mods/TestSVE.py | 2 +- .../test/options/TestPresets.py | 2 +- .../test/performance/TestPerformance.py | 2 +- .../stardew_valley/test/rules/TestArcades.py | 2 +- worlds/stardew_valley/test/rules/TestBooks.py | 2 +- .../test/rules/TestBuildings.py | 2 +- .../stardew_valley/test/rules/TestBundles.py | 2 +- .../test/rules/TestCookingRecipes.py | 2 +- .../test/rules/TestCraftingRecipes.py | 2 +- .../test/rules/TestDonations.py | 2 +- .../stardew_valley/test/rules/TestFishing.py | 2 +- .../test/rules/TestFriendship.py | 2 +- .../stardew_valley/test/rules/TestMuseum.py | 2 +- .../stardew_valley/test/rules/TestShipping.py | 2 +- .../stardew_valley/test/rules/TestSkills.py | 2 +- .../test/rules/TestStateRules.py | 2 +- worlds/stardew_valley/test/rules/TestTools.py | 2 +- .../stardew_valley/test/rules/TestWeapons.py | 2 +- .../test/script/benchmark_locations.py | 9 +- .../test/stability/StabilityOutputScript.py | 2 +- .../test/stability/TestStability.py | 2 +- .../test/stability/TestUniversalTracker.py | 6 +- 55 files changed, 367 insertions(+), 368 deletions(-) create mode 100644 worlds/stardew_valley/test/bases.py diff --git a/worlds/stardew_valley/test/TestBackpack.py b/worlds/stardew_valley/test/TestBackpack.py index 378c90e40a..bccafd15e5 100644 --- a/worlds/stardew_valley/test/TestBackpack.py +++ b/worlds/stardew_valley/test/TestBackpack.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestBooksanity.py b/worlds/stardew_valley/test/TestBooksanity.py index c25924aa3b..f1678de0db 100644 --- a/worlds/stardew_valley/test/TestBooksanity.py +++ b/worlds/stardew_valley/test/TestBooksanity.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from ..options import ExcludeGingerIsland, Booksanity, Shipsanity from ..strings.book_names import Book, LostBook diff --git a/worlds/stardew_valley/test/TestBundles.py b/worlds/stardew_valley/test/TestBundles.py index 091f39b256..5b70158f5f 100644 --- a/worlds/stardew_valley/test/TestBundles.py +++ b/worlds/stardew_valley/test/TestBundles.py @@ -1,6 +1,6 @@ import unittest -from . import SVTestBase +from .bases import SVTestBase from .. import BundleRandomization from ..data.bundle_data import all_bundle_items_except_money, quality_crops_items_thematic, quality_foraging_items, quality_fish_items from ..options import BundlePlando @@ -87,4 +87,3 @@ class TestRemixedAnywhereBundles(SVTestBase): for bundle_name in self.fish_bundle_names: with self.subTest(f"{bundle_name}"): self.assertIn(bundle_name, location_names) - diff --git a/worlds/stardew_valley/test/TestCrops.py b/worlds/stardew_valley/test/TestCrops.py index 53048259ab..bf8f4f719e 100644 --- a/worlds/stardew_valley/test/TestCrops.py +++ b/worlds/stardew_valley/test/TestCrops.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options from ..strings.ap_names.transport_names import Transportation from ..strings.building_names import Building diff --git a/worlds/stardew_valley/test/TestDynamicGoals.py b/worlds/stardew_valley/test/TestDynamicGoals.py index b0e6d6c626..23f453e9f0 100644 --- a/worlds/stardew_valley/test/TestDynamicGoals.py +++ b/worlds/stardew_valley/test/TestDynamicGoals.py @@ -1,7 +1,7 @@ from typing import List, Tuple -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options, StardewItem from ..strings.ap_names.ap_weapon_names import APWeapon from ..strings.ap_names.transport_names import Transportation diff --git a/worlds/stardew_valley/test/TestFarmType.py b/worlds/stardew_valley/test/TestFarmType.py index 1bb4404ae6..2c4fe4ec36 100644 --- a/worlds/stardew_valley/test/TestFarmType.py +++ b/worlds/stardew_valley/test/TestFarmType.py @@ -1,7 +1,7 @@ from collections import Counter -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options @@ -13,7 +13,7 @@ class TestStartInventoryStandardFarm(WorldAssertMixin, SVTestBase): def test_start_inventory_progressive_coops(self): start_items = Counter((i.name for i in self.multiworld.precollected_items[self.player])) items = Counter((i.name for i in self.multiworld.itempool)) - + self.assertIn("Progressive Coop", items) self.assertEqual(items["Progressive Coop"], 3) self.assertNotIn("Progressive Coop", start_items) diff --git a/worlds/stardew_valley/test/TestFill.py b/worlds/stardew_valley/test/TestFill.py index f8565f4f21..2205c49cdf 100644 --- a/worlds/stardew_valley/test/TestFill.py +++ b/worlds/stardew_valley/test/TestFill.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .options.presets import minimal_locations_maximal_items from .. import options from ..mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/TestFishsanity.py b/worlds/stardew_valley/test/TestFishsanity.py index c5d87c0f8d..953255c4d0 100644 --- a/worlds/stardew_valley/test/TestFishsanity.py +++ b/worlds/stardew_valley/test/TestFishsanity.py @@ -1,8 +1,8 @@ import unittest from typing import ClassVar, Set -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from ..content.feature import fishsanity from ..mods.mod_data import ModNames from ..options import Fishsanity, ExcludeGingerIsland, Mods, SpecialOrderLocations, Goal, QuestLocations diff --git a/worlds/stardew_valley/test/TestFriendsanity.py b/worlds/stardew_valley/test/TestFriendsanity.py index 842c0edd09..a346df7d2a 100644 --- a/worlds/stardew_valley/test/TestFriendsanity.py +++ b/worlds/stardew_valley/test/TestFriendsanity.py @@ -2,7 +2,7 @@ import unittest from collections import Counter from typing import ClassVar, Set -from . import SVTestBase +from .bases import SVTestBase from ..content.feature import friendsanity from ..options import Friendsanity, FriendsanityHeartSize diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 6d0846f8c1..1e843ea690 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -1,7 +1,7 @@ from typing import List from BaseClasses import ItemClassification, Item -from . import SVTestBase +from .bases import SVTestBase from .. import location_table, options, items from ..items import Group, ItemData, item_data from ..locations import LocationTags diff --git a/worlds/stardew_valley/test/TestItemLink.py b/worlds/stardew_valley/test/TestItemLink.py index f1c8346142..c3029b6070 100644 --- a/worlds/stardew_valley/test/TestItemLink.py +++ b/worlds/stardew_valley/test/TestItemLink.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options, item_table, Group max_iterations = 2000 diff --git a/worlds/stardew_valley/test/TestItems.py b/worlds/stardew_valley/test/TestItems.py index 1d6f968955..d4fa9e832a 100644 --- a/worlds/stardew_valley/test/TestItems.py +++ b/worlds/stardew_valley/test/TestItems.py @@ -1,5 +1,5 @@ from BaseClasses import MultiWorld, get_seed, ItemClassification -from . import setup_solo_multiworld, SVTestCase, solo_multiworld +from .bases import SVTestCase, solo_multiworld, setup_solo_multiworld from .options.presets import allsanity_no_mods_6_x_x, get_minsanity_options from .. import StardewValleyWorld from ..items import Group, item_table diff --git a/worlds/stardew_valley/test/TestLogic.py b/worlds/stardew_valley/test/TestLogic.py index 7a6b81ea74..047e0226c6 100644 --- a/worlds/stardew_valley/test/TestLogic.py +++ b/worlds/stardew_valley/test/TestLogic.py @@ -3,8 +3,8 @@ import unittest from unittest import TestCase, SkipTest from BaseClasses import MultiWorld -from . import setup_solo_multiworld from .assertion import RuleAssertMixin +from .bases import setup_solo_multiworld from .options.presets import allsanity_mods_6_x_x, minimal_locations_maximal_items from .. import StardewValleyWorld from ..data.bundle_data import all_bundle_items_except_money diff --git a/worlds/stardew_valley/test/TestMultiplePlayers.py b/worlds/stardew_valley/test/TestMultiplePlayers.py index d8db616f66..3b57105595 100644 --- a/worlds/stardew_valley/test/TestMultiplePlayers.py +++ b/worlds/stardew_valley/test/TestMultiplePlayers.py @@ -1,4 +1,4 @@ -from . import SVTestCase, setup_multiworld +from .bases import SVTestCase, setup_multiworld from .. import True_ from ..options import FestivalLocations, StartingMoney from ..strings.festival_check_names import FestivalCheck diff --git a/worlds/stardew_valley/test/TestNumberLocations.py b/worlds/stardew_valley/test/TestNumberLocations.py index 2ed528086a..dd57a5e39b 100644 --- a/worlds/stardew_valley/test/TestNumberLocations.py +++ b/worlds/stardew_valley/test/TestNumberLocations.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .options.presets import default_6_x_x, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x_exclude_disabled, get_minsanity_options, \ minimal_locations_maximal_items, minimal_locations_maximal_items_with_island from .. import location_table diff --git a/worlds/stardew_valley/test/TestOptionFlags.py b/worlds/stardew_valley/test/TestOptionFlags.py index 2833649e35..d930157564 100644 --- a/worlds/stardew_valley/test/TestOptionFlags.py +++ b/worlds/stardew_valley/test/TestOptionFlags.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import BuildingProgression from ..options import ToolProgression diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 11b0a01415..738753fe83 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -3,8 +3,8 @@ from typing import ClassVar from BaseClasses import ItemClassification from test.param import classvar_matrix -from . import SVTestCase, solo_multiworld, SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestCase, SVTestBase, solo_multiworld from .options.option_names import all_option_choices from .options.presets import allsanity_no_mods_6_x_x, allsanity_mods_6_x_x from .. import items_by_group, Group diff --git a/worlds/stardew_valley/test/TestOptionsPairs.py b/worlds/stardew_valley/test/TestOptionsPairs.py index d489ab1ff2..addd748c42 100644 --- a/worlds/stardew_valley/test/TestOptionsPairs.py +++ b/worlds/stardew_valley/test/TestOptionsPairs.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestRandomWorlds.py b/worlds/stardew_valley/test/TestRandomWorlds.py index 550ae14b55..0c4ad6ae29 100644 --- a/worlds/stardew_valley/test/TestRandomWorlds.py +++ b/worlds/stardew_valley/test/TestRandomWorlds.py @@ -2,8 +2,8 @@ from typing import ClassVar from BaseClasses import MultiWorld, get_seed from test.param import classvar_matrix -from . import SVTestCase, skip_long_tests, solo_multiworld from .assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin +from .bases import skip_long_tests, SVTestCase, solo_multiworld from .options.option_names import generate_random_world_options diff --git a/worlds/stardew_valley/test/TestRegions.py b/worlds/stardew_valley/test/TestRegions.py index bd1b672974..07e3094fb2 100644 --- a/worlds/stardew_valley/test/TestRegions.py +++ b/worlds/stardew_valley/test/TestRegions.py @@ -3,7 +3,7 @@ import unittest from typing import Set from BaseClasses import get_seed -from . import SVTestCase +from .bases import SVTestCase from .options.utils import fill_dataclass_with_default from .. import create_content from ..options import EntranceRandomization, ExcludeGingerIsland, SkillProgression diff --git a/worlds/stardew_valley/test/TestStartInventory.py b/worlds/stardew_valley/test/TestStartInventory.py index dc44a1bb45..43ee0e1329 100644 --- a/worlds/stardew_valley/test/TestStartInventory.py +++ b/worlds/stardew_valley/test/TestStartInventory.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestTraps.py b/worlds/stardew_valley/test/TestTraps.py index 9df07a6d74..130674a35d 100644 --- a/worlds/stardew_valley/test/TestTraps.py +++ b/worlds/stardew_valley/test/TestTraps.py @@ -1,7 +1,7 @@ import unittest -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options, items_by_group, Group from ..options import TrapDistribution @@ -119,4 +119,3 @@ class TestDistributionIsRespectedAllTraps(WorldAssertMixin, SVTestBase): self.assertLess(num_bark, num_debris - threshold_difference) self.assertGreater(num_meow, num_time_flies + threshold_difference) self.assertGreater(num_meow, num_debris + threshold_difference) - diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index 5cc2f79e91..e3411edd02 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from ..options import ExcludeGingerIsland, Walnutsanity, ToolProgression, SkillProgression from ..strings.ap_names.ap_option_names import WalnutsanityOptionName diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index 6a8011a37d..e69de29bb2 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -1,308 +0,0 @@ -import itertools -import logging -import os -import threading -import unittest -from contextlib import contextmanager -from typing import Dict, ClassVar, Iterable, Tuple, Optional, List, Union, Any - -from BaseClasses import MultiWorld, CollectionState, get_seed, Location, Item -from test.bases import WorldTestBase -from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld -from worlds.AutoWorld import call_all -from .assertion import RuleAssertMixin -from .options.utils import fill_namespace_with_default, parse_class_option_keys, fill_dataclass_with_default -from .. import StardewValleyWorld, StardewItem, StardewRule -from ..logic.time_logic import MONTH_COEFFICIENT -from ..options import StardewValleyOption, options - -logger = logging.getLogger(__name__) - -DEFAULT_TEST_SEED = get_seed() -logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") - - -def skip_default_tests() -> bool: - return not bool(os.environ.get("base", False)) - - -def skip_long_tests() -> bool: - return not bool(os.environ.get("long", False)) - - -class SVTestCase(unittest.TestCase): - skip_default_tests: bool = skip_default_tests() - """Set False to not skip the base fill tests""" - skip_long_tests: bool = skip_long_tests() - """Set False to run tests that take long""" - - @contextmanager - def solo_world_sub_test(self, msg: Optional[str] = None, - /, - world_options: Optional[Dict[Union[str, StardewValleyOption], Any]] = None, - *, - seed=DEFAULT_TEST_SEED, - world_caching=True, - **kwargs) -> Tuple[MultiWorld, StardewValleyWorld]: - if msg is not None: - msg += " " - else: - msg = "" - msg += f"[Seed = {seed}]" - - with self.subTest(msg, **kwargs): - with solo_multiworld(world_options, seed=seed, world_caching=world_caching) as (multiworld, world): - yield multiworld, world - - -class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): - game = "Stardew Valley" - world: StardewValleyWorld - player: ClassVar[int] = 1 - - seed = DEFAULT_TEST_SEED - - @classmethod - def setUpClass(cls) -> None: - if cls is SVTestBase: - raise unittest.SkipTest("No running tests on SVTestBase import.") - - super().setUpClass() - - def world_setup(self, *args, **kwargs): - self.options = parse_class_option_keys(self.options) - - self.multiworld = setup_solo_multiworld(self.options, seed=self.seed) - self.multiworld.lock.acquire() - world = self.multiworld.worlds[self.player] - - self.original_state = self.multiworld.state.copy() - self.original_itempool = self.multiworld.itempool.copy() - self.unfilled_locations = self.multiworld.get_unfilled_locations(1) - if self.constructed: - self.world = world # noqa - - def tearDown(self) -> None: - self.multiworld.state = self.original_state - self.multiworld.itempool = self.original_itempool - for location in self.unfilled_locations: - location.item = None - - self.multiworld.lock.release() - - @property - def run_default_tests(self) -> bool: - if self.skip_default_tests: - return False - return super().run_default_tests - - def collect_months(self, months: int) -> None: - real_total_prog_items = self.world.total_progression_items - percent = months * MONTH_COEFFICIENT - self.collect("Stardrop", real_total_prog_items * 100 // percent) - self.world.total_progression_items = real_total_prog_items - - def collect_lots_of_money(self, percent: float = 0.25): - self.collect("Shipping Bin") - real_total_prog_items = self.world.total_progression_items - required_prog_items = int(round(real_total_prog_items * percent)) - self.collect("Stardrop", required_prog_items) - - def collect_all_the_money(self): - self.collect_lots_of_money(0.95) - - def collect_everything(self): - non_event_items = [item for item in self.multiworld.get_items() if item.code] - for item in non_event_items: - self.multiworld.state.collect(item) - - def collect_all_except(self, item_to_not_collect: str): - non_event_items = [item for item in self.multiworld.get_items() if item.code] - for item in non_event_items: - if item.name != item_to_not_collect: - self.multiworld.state.collect(item) - - def get_real_locations(self) -> List[Location]: - return [location for location in self.multiworld.get_locations(self.player) if location.address is not None] - - def get_real_location_names(self) -> List[str]: - return [location.name for location in self.get_real_locations()] - - def collect(self, item: Union[str, Item, Iterable[Item]], count: int = 1) -> Union[None, Item, List[Item]]: - assert count > 0 - - if not isinstance(item, str): - super().collect(item) - return - - if count == 1: - item = self.create_item(item) - self.multiworld.state.collect(item) - return item - - items = [] - for i in range(count): - item = self.create_item(item) - self.multiworld.state.collect(item) - items.append(item) - - return items - - def create_item(self, item: str) -> StardewItem: - return self.world.create_item(item) - - def get_all_created_items(self) -> list[str]: - return [item.name for item in itertools.chain(self.multiworld.get_items(), self.multiworld.precollected_items[self.player])] - - def remove_one_by_name(self, item: str) -> None: - self.remove(self.create_item(item)) - - def reset_collection_state(self) -> None: - self.multiworld.state = self.original_state.copy() - - def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_rule_true(rule, state) - - def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_rule_false(rule, state) - - def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_can_reach_location(location, state) - - def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_cannot_reach_location(location, state) - - -pre_generated_worlds = {} - - -@contextmanager -def solo_multiworld(world_options: Optional[Dict[Union[str, StardewValleyOption], Any]] = None, - *, - seed=DEFAULT_TEST_SEED, - world_caching=True) -> Tuple[MultiWorld, StardewValleyWorld]: - if not world_caching: - multiworld = setup_solo_multiworld(world_options, seed, _cache={}) - yield multiworld, multiworld.worlds[1] - else: - multiworld = setup_solo_multiworld(world_options, seed) - try: - multiworld.lock.acquire() - world = multiworld.worlds[1] - - original_state = multiworld.state.copy() - original_itempool = multiworld.itempool.copy() - unfilled_locations = multiworld.get_unfilled_locations(1) - - yield multiworld, world - - multiworld.state = original_state - multiworld.itempool = original_itempool - for location in unfilled_locations: - location.item = None - finally: - multiworld.lock.release() - - -# Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. -def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOption], str]] = None, - seed=DEFAULT_TEST_SEED, - _cache: Dict[frozenset, MultiWorld] = {}, # noqa - _steps=gen_steps) -> MultiWorld: - test_options = parse_class_option_keys(test_options) - - # Yes I reuse the worlds generated between tests, its speeds the execution by a couple seconds - # If the simple dict caching ends up taking too much memory, we could replace it with some kind of lru cache. - should_cache = should_cache_world(test_options) - if should_cache: - frozen_options = make_hashable(test_options, seed) - cached_multi_world = search_world_cache(_cache, frozen_options) - if cached_multi_world: - print(f"Using cached solo multi world [Seed = {cached_multi_world.seed}] [Cache size = {len(_cache)}]") - return cached_multi_world - - multiworld = setup_base_solo_multiworld(StardewValleyWorld, (), seed=seed) - # print(f"Seed: {multiworld.seed}") # Uncomment to print the seed for every test - - args = fill_namespace_with_default(test_options) - multiworld.set_options(args) - - if "start_inventory" in test_options: - for item, amount in test_options["start_inventory"].items(): - for _ in range(amount): - multiworld.push_precollected(multiworld.create_item(item, 1)) - - for step in _steps: - call_all(multiworld, step) - - if should_cache: - add_to_world_cache(_cache, frozen_options, multiworld) # noqa - - # Lock is needed for multi-threading tests - setattr(multiworld, "lock", threading.Lock()) - - return multiworld - - -def should_cache_world(test_options): - if "start_inventory" in test_options: - return False - - trap_distribution_key = "trap_distribution" - if trap_distribution_key not in test_options: - return True - - trap_distribution = test_options[trap_distribution_key] - for key in trap_distribution: - if trap_distribution[key] != options.TrapDistribution.default_weight: - return False - - return True - - - -def make_hashable(test_options, seed): - return frozenset(test_options.items()).union({("seed", seed)}) - - -def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset) -> Optional[MultiWorld]: - try: - return cache[frozen_options] - except KeyError: - for cached_options, multi_world in cache.items(): - if frozen_options.issubset(cached_options): - return multi_world - return None - - -def add_to_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: - # We could complete the key with all the default options, but that does not seem to improve performances. - cache[frozen_options] = multi_world - - -def setup_multiworld(test_options: Iterable[Dict[str, int]] = None, seed=None) -> MultiWorld: # noqa - if test_options is None: - test_options = [] - - multiworld = MultiWorld(len(test_options)) - multiworld.player_name = {} - multiworld.set_seed(seed) - multiworld.state = CollectionState(multiworld) - for i in range(1, len(test_options) + 1): - multiworld.game[i] = StardewValleyWorld.game - multiworld.player_name.update({i: f"Tester{i}"}) - args = fill_namespace_with_default(test_options) - multiworld.set_options(args) - - for step in gen_steps: - call_all(multiworld, step) - - return multiworld diff --git a/worlds/stardew_valley/test/bases.py b/worlds/stardew_valley/test/bases.py new file mode 100644 index 0000000000..64ada39568 --- /dev/null +++ b/worlds/stardew_valley/test/bases.py @@ -0,0 +1,306 @@ +import itertools +import logging +import os +import threading +import typing +import unittest +from contextlib import contextmanager +from typing import Optional, Dict, Union, Any, List, Iterable + +from BaseClasses import get_seed, MultiWorld, Location, Item, CollectionState +from test.bases import WorldTestBase +from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld +from worlds.AutoWorld import call_all +from .assertion import RuleAssertMixin +from .options.utils import parse_class_option_keys, fill_namespace_with_default +from .. import StardewValleyWorld, StardewItem, StardewRule +from ..logic.time_logic import MONTH_COEFFICIENT +from ..options import StardewValleyOption, options + +logger = logging.getLogger(__name__) +DEFAULT_TEST_SEED = get_seed() +logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") + + +def skip_default_tests() -> bool: + return not bool(os.environ.get("base", False)) + + +def skip_long_tests() -> bool: + return not bool(os.environ.get("long", False)) + + +class SVTestCase(unittest.TestCase): + skip_default_tests: bool = skip_default_tests() + """Set False to not skip the base fill tests""" + skip_long_tests: bool = skip_long_tests() + """Set False to run tests that take long""" + + @contextmanager + def solo_world_sub_test(self, msg: str | None = None, + /, + world_options: dict[str | type[StardewValleyOption], Any] | None = None, + *, + seed=DEFAULT_TEST_SEED, + world_caching=True, + **kwargs) -> Iterable[tuple[MultiWorld, StardewValleyWorld]]: + if msg is not None: + msg += " " + else: + msg = "" + msg += f"[Seed = {seed}]" + + with self.subTest(msg, **kwargs): + with solo_multiworld(world_options, seed=seed, world_caching=world_caching) as (multiworld, world): + yield multiworld, world + + +class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): + game = "Stardew Valley" + world: StardewValleyWorld + + seed = DEFAULT_TEST_SEED + + @classmethod + def setUpClass(cls) -> None: + if cls is SVTestBase: + raise unittest.SkipTest("No running tests on SVTestBase import.") + + super().setUpClass() + + def world_setup(self, *args, **kwargs): + self.options = parse_class_option_keys(self.options) + + self.multiworld = setup_solo_multiworld(self.options, seed=self.seed) + self.multiworld.lock.acquire() + world = self.multiworld.worlds[self.player] + + self.original_state = self.multiworld.state.copy() + self.original_itempool = self.multiworld.itempool.copy() + self.unfilled_locations = self.multiworld.get_unfilled_locations(1) + if self.constructed: + self.world = world # noqa + + def tearDown(self) -> None: + self.multiworld.state = self.original_state + self.multiworld.itempool = self.original_itempool + for location in self.unfilled_locations: + location.item = None + + self.multiworld.lock.release() + + @property + def run_default_tests(self) -> bool: + if self.skip_default_tests: + return False + return super().run_default_tests + + def collect_months(self, months: int) -> None: + real_total_prog_items = self.world.total_progression_items + percent = months * MONTH_COEFFICIENT + self.collect("Stardrop", real_total_prog_items * 100 // percent) + self.world.total_progression_items = real_total_prog_items + + def collect_lots_of_money(self, percent: float = 0.25): + self.collect("Shipping Bin") + real_total_prog_items = self.world.total_progression_items + required_prog_items = int(round(real_total_prog_items * percent)) + self.collect("Stardrop", required_prog_items) + + def collect_all_the_money(self): + self.collect_lots_of_money(0.95) + + def collect_everything(self): + non_event_items = [item for item in self.multiworld.get_items() if item.code] + for item in non_event_items: + self.multiworld.state.collect(item) + + def collect_all_except(self, item_to_not_collect: str): + non_event_items = [item for item in self.multiworld.get_items() if item.code] + for item in non_event_items: + if item.name != item_to_not_collect: + self.multiworld.state.collect(item) + + def get_real_locations(self) -> List[Location]: + return [location for location in self.multiworld.get_locations(self.player) if location.address is not None] + + def get_real_location_names(self) -> List[str]: + return [location.name for location in self.get_real_locations()] + + def collect(self, item: Union[str, Item, Iterable[Item]], count: int = 1) -> Union[None, Item, List[Item]]: + assert count > 0 + + if not isinstance(item, str): + super().collect(item) + return + + if count == 1: + item = self.create_item(item) + self.multiworld.state.collect(item) + return item + + items = [] + for i in range(count): + item = self.create_item(item) + self.multiworld.state.collect(item) + items.append(item) + + return items + + def create_item(self, item: str) -> StardewItem: + return self.world.create_item(item) + + def get_all_created_items(self) -> list[str]: + return [item.name for item in itertools.chain(self.multiworld.get_items(), self.multiworld.precollected_items[self.player])] + + def remove_one_by_name(self, item: str) -> None: + self.remove(self.create_item(item)) + + def reset_collection_state(self) -> None: + self.multiworld.state = self.original_state.copy() + + def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_rule_true(rule, state) + + def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_rule_false(rule, state) + + def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_can_reach_location(location, state) + + def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_cannot_reach_location(location, state) + + +pre_generated_worlds = {} + + +@contextmanager +def solo_multiworld(world_options: dict[str | type[StardewValleyOption], Any] | None = None, + *, + seed=DEFAULT_TEST_SEED, + world_caching=True) -> Iterable[tuple[MultiWorld, StardewValleyWorld]]: + if not world_caching: + multiworld = setup_solo_multiworld(world_options, seed, _cache={}) + yield multiworld, typing.cast(StardewValleyWorld, multiworld.worlds[1]) + else: + multiworld = setup_solo_multiworld(world_options, seed) + try: + multiworld.lock.acquire() + world = multiworld.worlds[1] + + original_state = multiworld.state.copy() + original_itempool = multiworld.itempool.copy() + unfilled_locations = multiworld.get_unfilled_locations(1) + + yield multiworld, typing.cast(StardewValleyWorld, world) + + multiworld.state = original_state + multiworld.itempool = original_itempool + for location in unfilled_locations: + location.item = None + finally: + multiworld.lock.release() + + +# Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. +def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOption], str]] = None, + seed=DEFAULT_TEST_SEED, + _cache: Dict[frozenset, MultiWorld] = {}, # noqa + _steps=gen_steps) -> MultiWorld: + test_options = parse_class_option_keys(test_options) + + # Yes I reuse the worlds generated between tests, its speeds the execution by a couple seconds + # If the simple dict caching ends up taking too much memory, we could replace it with some kind of lru cache. + should_cache = should_cache_world(test_options) + if should_cache: + frozen_options = make_hashable(test_options, seed) + cached_multi_world = search_world_cache(_cache, frozen_options) + if cached_multi_world: + print(f"Using cached solo multi world [Seed = {cached_multi_world.seed}] [Cache size = {len(_cache)}]") + return cached_multi_world + + multiworld = setup_base_solo_multiworld(StardewValleyWorld, (), seed=seed) + # print(f"Seed: {multiworld.seed}") # Uncomment to print the seed for every test + + args = fill_namespace_with_default(test_options) + multiworld.set_options(args) + + if "start_inventory" in test_options: + for item, amount in test_options["start_inventory"].items(): + for _ in range(amount): + multiworld.push_precollected(multiworld.create_item(item, 1)) + + for step in _steps: + call_all(multiworld, step) + + if should_cache: + add_to_world_cache(_cache, frozen_options, multiworld) # noqa + + # Lock is needed for multi-threading tests + setattr(multiworld, "lock", threading.Lock()) + + return multiworld + + +def should_cache_world(test_options): + if "start_inventory" in test_options: + return False + + trap_distribution_key = "trap_distribution" + if trap_distribution_key not in test_options: + return True + + trap_distribution = test_options[trap_distribution_key] + for key in trap_distribution: + if trap_distribution[key] != options.TrapDistribution.default_weight: + return False + + return True + + +def make_hashable(test_options, seed): + return frozenset(test_options.items()).union({("seed", seed)}) + + +def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset) -> Optional[MultiWorld]: + try: + return cache[frozen_options] + except KeyError: + for cached_options, multi_world in cache.items(): + if frozen_options.issubset(cached_options): + return multi_world + return None + + +def add_to_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: + # We could complete the key with all the default options, but that does not seem to improve performances. + cache[frozen_options] = multi_world + + +def setup_multiworld(test_options: Iterable[Dict[str, int]] = None, seed=None) -> MultiWorld: # noqa + if test_options is None: + test_options = [] + + multiworld = MultiWorld(len(test_options)) + multiworld.player_name = {} + multiworld.set_seed(seed) + multiworld.state = CollectionState(multiworld) + for i in range(1, len(test_options) + 1): + multiworld.game[i] = StardewValleyWorld.game + multiworld.player_name.update({i: f"Tester{i}"}) + args = fill_namespace_with_default(test_options) + multiworld.set_options(args) + + for step in gen_steps: + call_all(multiworld, step) + + return multiworld diff --git a/worlds/stardew_valley/test/content/TestGingerIsland.py b/worlds/stardew_valley/test/content/TestGingerIsland.py index 7e7f866dfc..c1f16b48c4 100644 --- a/worlds/stardew_valley/test/content/TestGingerIsland.py +++ b/worlds/stardew_valley/test/content/TestGingerIsland.py @@ -1,5 +1,5 @@ from . import SVContentPackTestBase -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...content import content_packs from ...data.artisan import MachineSource diff --git a/worlds/stardew_valley/test/content/mods/TestSVE.py b/worlds/stardew_valley/test/content/mods/TestSVE.py index 4065498d6b..7cd0a822a1 100644 --- a/worlds/stardew_valley/test/content/mods/TestSVE.py +++ b/worlds/stardew_valley/test/content/mods/TestSVE.py @@ -1,5 +1,5 @@ from .. import SVContentPackTestBase -from ... import SVTestBase +from ...bases import SVTestBase from .... import options from ....content import content_packs from ....mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/long/TestModsLong.py b/worlds/stardew_valley/test/long/TestModsLong.py index bc5e8bfff8..d14af8bc55 100644 --- a/worlds/stardew_valley/test/long/TestModsLong.py +++ b/worlds/stardew_valley/test/long/TestModsLong.py @@ -4,8 +4,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin, ModAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ..options.option_names import all_option_choices from ... import options from ...mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/long/TestOptionsLong.py b/worlds/stardew_valley/test/long/TestOptionsLong.py index db467964e7..3c9690e2e6 100644 --- a/worlds/stardew_valley/test/long/TestOptionsLong.py +++ b/worlds/stardew_valley/test/long/TestOptionsLong.py @@ -4,8 +4,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion.world_assert import WorldAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ..options.option_names import all_option_choices from ... import options diff --git a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py index 3b6f818ec4..3d3e0da13b 100644 --- a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py +++ b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py @@ -3,8 +3,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ... import options if skip_long_tests(): diff --git a/worlds/stardew_valley/test/mods/TestBiggerBackpack.py b/worlds/stardew_valley/test/mods/TestBiggerBackpack.py index f6d312976c..8ec2e539b7 100644 --- a/worlds/stardew_valley/test/mods/TestBiggerBackpack.py +++ b/worlds/stardew_valley/test/mods/TestBiggerBackpack.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ...mods.mod_data import ModNames from ...options import Mods, BackpackProgression diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index bd5d7d626d..be6ce71076 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -3,9 +3,9 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestBase, SVTestCase, solo_multiworld from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin +from ..bases import SVTestCase, SVTestBase, solo_multiworld from ..options.presets import allsanity_mods_6_x_x from ..options.utils import fill_dataclass_with_default from ... import options, Group, create_content diff --git a/worlds/stardew_valley/test/mods/TestModsFill.py b/worlds/stardew_valley/test/mods/TestModsFill.py index a140f5abae..334a4ff9e4 100644 --- a/worlds/stardew_valley/test/mods/TestModsFill.py +++ b/worlds/stardew_valley/test/mods/TestModsFill.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ... import options diff --git a/worlds/stardew_valley/test/mods/TestSVE.py b/worlds/stardew_valley/test/mods/TestSVE.py index ca63dcb351..a6b6f6a3dc 100644 --- a/worlds/stardew_valley/test/mods/TestSVE.py +++ b/worlds/stardew_valley/test/mods/TestSVE.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...mods.mod_data import ModNames from ...strings.ap_names.mods.mod_items import SVEQuestItem diff --git a/worlds/stardew_valley/test/options/TestPresets.py b/worlds/stardew_valley/test/options/TestPresets.py index 5d9e89531c..5c1cee4a58 100644 --- a/worlds/stardew_valley/test/options/TestPresets.py +++ b/worlds/stardew_valley/test/options/TestPresets.py @@ -1,5 +1,5 @@ from Options import PerGameCommonOptions, OptionSet, OptionDict -from .. import SVTestCase +from ..bases import SVTestCase from ...options import StardewValleyOptions, TrapItems from ...options.presets import sv_options_presets diff --git a/worlds/stardew_valley/test/performance/TestPerformance.py b/worlds/stardew_valley/test/performance/TestPerformance.py index ca63ee5e2c..2951e6d00a 100644 --- a/worlds/stardew_valley/test/performance/TestPerformance.py +++ b/worlds/stardew_valley/test/performance/TestPerformance.py @@ -8,7 +8,7 @@ from typing import List from BaseClasses import get_seed from Fill import distribute_items_restrictive, balance_multiworld_progression from worlds import AutoWorld -from .. import SVTestCase, setup_multiworld +from ..bases import SVTestCase, setup_multiworld from ..options.presets import default_6_x_x, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x, minimal_locations_maximal_items assert default_6_x_x diff --git a/worlds/stardew_valley/test/rules/TestArcades.py b/worlds/stardew_valley/test/rules/TestArcades.py index 5fdf7df13d..407f299992 100644 --- a/worlds/stardew_valley/test/rules/TestArcades.py +++ b/worlds/stardew_valley/test/rules/TestArcades.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ... import options -from ...test import SVTestBase class TestArcadeMachinesLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestBooks.py b/worlds/stardew_valley/test/rules/TestBooks.py index 4cd84a77a2..eb26b27444 100644 --- a/worlds/stardew_valley/test/rules/TestBooks.py +++ b/worlds/stardew_valley/test/rules/TestBooks.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ... import options -from ...test import SVTestBase class TestBooksLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestBuildings.py b/worlds/stardew_valley/test/rules/TestBuildings.py index 8eeb9d295a..0b1f41d2c5 100644 --- a/worlds/stardew_valley/test/rules/TestBuildings.py +++ b/worlds/stardew_valley/test/rules/TestBuildings.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ...options import BuildingProgression, FarmType -from ...test import SVTestBase class TestBuildingLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestBundles.py b/worlds/stardew_valley/test/rules/TestBundles.py index 918cb8aba6..357269a25b 100644 --- a/worlds/stardew_valley/test/rules/TestBundles.py +++ b/worlds/stardew_valley/test/rules/TestBundles.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import options from ...options import BundleRandomization from ...strings.bundle_names import BundleName -from ...test import SVTestBase class TestBundlesLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestCookingRecipes.py b/worlds/stardew_valley/test/rules/TestCookingRecipes.py index b3aafdb690..b468a72d41 100644 --- a/worlds/stardew_valley/test/rules/TestCookingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCookingRecipes.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ... import options from ...options import BuildingProgression, ExcludeGingerIsland, Chefsanity -from ...test import SVTestBase class TestRecipeLearnLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py index 94d6bc145a..f875dc539d 100644 --- a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import options from ...data.craftable_data import all_crafting_recipes_by_name from ...options import BuildingProgression, ExcludeGingerIsland, Craftsanity, SeasonRandomization -from ...test import SVTestBase class TestCraftsanityLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestDonations.py b/worlds/stardew_valley/test/rules/TestDonations.py index d50f87d3e9..2cddcad395 100644 --- a/worlds/stardew_valley/test/rules/TestDonations.py +++ b/worlds/stardew_valley/test/rules/TestDonations.py @@ -1,8 +1,8 @@ +from ..bases import SVTestBase from ... import options from ...locations import locations_by_tag, LocationTags, location_table from ...strings.entrance_names import Entrance from ...strings.region_names import Region -from ...test import SVTestBase class TestDonationLogicAll(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestFishing.py b/worlds/stardew_valley/test/rules/TestFishing.py index 6a6a4bb315..3649592301 100644 --- a/worlds/stardew_valley/test/rules/TestFishing.py +++ b/worlds/stardew_valley/test/rules/TestFishing.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ...options import SeasonRandomization, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, ElevatorProgression, SpecialOrderLocations from ...strings.fish_names import Fish -from ...test import SVTestBase class TestNeedRegionToCatchFish(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestFriendship.py b/worlds/stardew_valley/test/rules/TestFriendship.py index 9cd3127aa3..dc5935580a 100644 --- a/worlds/stardew_valley/test/rules/TestFriendship.py +++ b/worlds/stardew_valley/test/rules/TestFriendship.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ...options import SeasonRandomization, Friendsanity, FriendsanityHeartSize -from ...test import SVTestBase class TestFriendsanityDatingRules(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestMuseum.py b/worlds/stardew_valley/test/rules/TestMuseum.py index 35dad8f43e..231bbafe22 100644 --- a/worlds/stardew_valley/test/rules/TestMuseum.py +++ b/worlds/stardew_valley/test/rules/TestMuseum.py @@ -1,7 +1,7 @@ from collections import Counter +from ..bases import SVTestBase from ...options import Museumsanity -from .. import SVTestBase class TestMuseumMilestones(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestShipping.py b/worlds/stardew_valley/test/rules/TestShipping.py index fc61ae8e2a..c1f29d9342 100644 --- a/worlds/stardew_valley/test/rules/TestShipping.py +++ b/worlds/stardew_valley/test/rules/TestShipping.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ...locations import LocationTags, location_table from ...options import BuildingProgression, Shipsanity -from ...test import SVTestBase class TestShipsanityNone(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestSkills.py b/worlds/stardew_valley/test/rules/TestSkills.py index a5957488a1..fd513a1bec 100644 --- a/worlds/stardew_valley/test/rules/TestSkills.py +++ b/worlds/stardew_valley/test/rules/TestSkills.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import HasProgressionPercent, StardewLogic from ...options import ToolProgression, SkillProgression, Mods from ...strings.skill_names import all_skills, all_vanilla_skills, Skill -from ...test import SVTestBase class TestSkillProgressionVanilla(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestStateRules.py b/worlds/stardew_valley/test/rules/TestStateRules.py index db56e8220c..57573c7f8b 100644 --- a/worlds/stardew_valley/test/rules/TestStateRules.py +++ b/worlds/stardew_valley/test/rules/TestStateRules.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ..options.presets import allsanity_mods_6_x_x from ...stardew_rule import HasProgressionPercent diff --git a/worlds/stardew_valley/test/rules/TestTools.py b/worlds/stardew_valley/test/rules/TestTools.py index bda29e3d74..54b9ec8f2f 100644 --- a/worlds/stardew_valley/test/rules/TestTools.py +++ b/worlds/stardew_valley/test/rules/TestTools.py @@ -1,6 +1,6 @@ from collections import Counter -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...options import ToolProgression, SeasonRandomization from ...strings.entrance_names import Entrance diff --git a/worlds/stardew_valley/test/rules/TestWeapons.py b/worlds/stardew_valley/test/rules/TestWeapons.py index 383f26e841..e95e706ded 100644 --- a/worlds/stardew_valley/test/rules/TestWeapons.py +++ b/worlds/stardew_valley/test/rules/TestWeapons.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ... import options from ...options import ToolProgression -from ...test import SVTestBase class TestWeaponsLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/script/benchmark_locations.py b/worlds/stardew_valley/test/script/benchmark_locations.py index 04553e3996..3dcfc4dbeb 100644 --- a/worlds/stardew_valley/test/script/benchmark_locations.py +++ b/worlds/stardew_valley/test/script/benchmark_locations.py @@ -15,8 +15,9 @@ import typing from BaseClasses import CollectionState, Location from Utils import init_logging -from worlds.stardew_valley.stardew_rule.rule_explain import explain -from ... import test +from ..bases import setup_solo_multiworld +from ..options import presets +from ...stardew_rule.rule_explain import explain def run_locations_benchmark(): @@ -56,12 +57,12 @@ def run_locations_benchmark(): parser.add_argument('--state', help="Define the state in which the location will be benchmarked.", type=str, default=None) args = parser.parse_args() options_set = args.options - options = getattr(test, options_set)() + options = getattr(presets, options_set)() seed = args.seed location = args.location state = args.state - multiworld = test.setup_solo_multiworld(options, seed) + multiworld = setup_solo_multiworld(options, seed) gc.collect() if location: diff --git a/worlds/stardew_valley/test/stability/StabilityOutputScript.py b/worlds/stardew_valley/test/stability/StabilityOutputScript.py index 9b4b608d4e..29fd903095 100644 --- a/worlds/stardew_valley/test/stability/StabilityOutputScript.py +++ b/worlds/stardew_valley/test/stability/StabilityOutputScript.py @@ -1,7 +1,7 @@ import argparse import json -from .. import setup_solo_multiworld +from ..bases import setup_solo_multiworld from ..options.presets import allsanity_mods_6_x_x_exclude_disabled from ...options import FarmType, EntranceRandomization diff --git a/worlds/stardew_valley/test/stability/TestStability.py b/worlds/stardew_valley/test/stability/TestStability.py index b4d0f30ea5..f3dfb9fdaa 100644 --- a/worlds/stardew_valley/test/stability/TestStability.py +++ b/worlds/stardew_valley/test/stability/TestStability.py @@ -5,7 +5,7 @@ import sys import unittest from BaseClasses import get_seed -from .. import SVTestCase +from ..bases import SVTestCase # at 0x102ca98a0> lambda_regex = re.compile(r"^ at (.*)>$") diff --git a/worlds/stardew_valley/test/stability/TestUniversalTracker.py b/worlds/stardew_valley/test/stability/TestUniversalTracker.py index 7590635aa1..301abfff22 100644 --- a/worlds/stardew_valley/test/stability/TestUniversalTracker.py +++ b/worlds/stardew_valley/test/stability/TestUniversalTracker.py @@ -1,9 +1,11 @@ import unittest from unittest.mock import Mock -from .. import SVTestBase, fill_namespace_with_default, skip_long_tests +from ..bases import skip_long_tests, SVTestBase from ..options.presets import allsanity_mods_6_x_x -from ... import STARDEW_VALLEY, FarmType, BundleRandomization, EntranceRandomization +from ..options.utils import fill_namespace_with_default +from ... import STARDEW_VALLEY +from ...options import FarmType, BundleRandomization, EntranceRandomization @unittest.skipIf(skip_long_tests(), "Long tests disabled") From 0994afa25bc393b3d68dbaffc2a79b9f9afd8b74 Mon Sep 17 00:00:00 2001 From: Ixrec Date: Tue, 13 May 2025 08:59:41 +0100 Subject: [PATCH 133/199] Tests: actually run tests in __init__.py files (#4969) * demonstrate our pytest/CI configuration missing a __init__ test failure * tell pytest/CI to run tests in __init__.py files * revert the demonstration test failure --------- Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index cd8fd8dfce..4469a7c30d 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] -python_files = test_*.py Test*.py # TODO: remove Test* once all worlds have been ported +python_files = test_*.py Test*.py __init__.py # TODO: remove Test* once all worlds have been ported python_classes = Test python_functions = test testpaths = From b71c8005e7b38e42fa76b27869b7b1862de21886 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Wed, 14 May 2025 05:18:36 -0600 Subject: [PATCH 134/199] AHiT: Fix Client Argument Handling (#4992) --- AHITClient.py | 3 ++- worlds/ahit/Client.py | 4 ++-- worlds/ahit/__init__.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/AHITClient.py b/AHITClient.py index 6ed7d7b49d..edcbbd842e 100644 --- a/AHITClient.py +++ b/AHITClient.py @@ -1,3 +1,4 @@ +import sys from worlds.ahit.Client import launch import Utils import ModuleUpdate @@ -5,4 +6,4 @@ ModuleUpdate.update() if __name__ == "__main__": Utils.init_logging("AHITClient", exception_logger="Client") - launch() + launch(*sys.argv[1:]) diff --git a/worlds/ahit/Client.py b/worlds/ahit/Client.py index 0a9d8d6042..64c1124fa8 100644 --- a/worlds/ahit/Client.py +++ b/worlds/ahit/Client.py @@ -238,10 +238,10 @@ async def proxy_loop(ctx: AHITContext): logger.info("Aborting AHIT Proxy Client due to errors") -def launch(): +def launch(*launch_args: str): async def main(): parser = get_base_parser() - args = parser.parse_args() + args = parser.parse_args(launch_args) ctx = AHITContext(args.connect, args.password) logger.info("Starting A Hat in Time proxy server") diff --git a/worlds/ahit/__init__.py b/worlds/ahit/__init__.py index 16b54064c6..1bcc840ae6 100644 --- a/worlds/ahit/__init__.py +++ b/worlds/ahit/__init__.py @@ -16,9 +16,9 @@ from worlds.LauncherComponents import Component, components, icon_paths, launch from Utils import local_path -def launch_client(): +def launch_client(*args: str): from .Client import launch - launch_component(launch, name="AHITClient") + launch_component(launch, name="AHITClient", args=args) components.append(Component("A Hat in Time Client", "AHITClient", func=launch_client, From 72854cde44dff707109ad66e489fa100e7db18ee Mon Sep 17 00:00:00 2001 From: Ixrec Date: Wed, 14 May 2025 12:21:40 +0100 Subject: [PATCH 135/199] Docs: Add a "Missable Locations" Question to apworld FAQ (#4965) * Docs: add a "missable locations" question to apworld_dev_faq.md Basically turning the conversation at https://discord.com/channels/731205301247803413/1214608557077700720/1368996789260128388 into a FAQ entry. * feedback * qwint feedback * Update docs/apworld_dev_faq.md Co-authored-by: Scipio Wright --------- Co-authored-by: Scipio Wright --- docs/apworld_dev_faq.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 50bee148c6..6e1c102c6a 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -122,3 +122,21 @@ Concrete examples of soft logic include: - Buying expensive shop items might logically require access to a place where you can quickly farm money, or logically require access to enough parts of the game that checking other locations should naturally generate enough money without grinding. Remember that all items referenced by logic (however hard or soft) must be `progression`. Since you typically don't want to turn a ton of `filler` items into `progression` just for this, it's common to e.g. write money logic using only the rare "$100" item, so the dozens of "$1" and "$10" items in your world can remain `filler`. + +--- + +### What if my game has "missable" or "one-time-only" locations or region connections? + +Archipelago logic assumes that once a region or location becomes reachable, it stays reachable forever, no matter what +the player does in-game. Slightly more formally: Receiving an AP item must never cause a region connection or location +to "go out of logic" (become unreachable when it was previously reachable), and receiving AP items is the only kind of +state change that AP logic acknowledges. No other actions or events can change reachability. + +So when the game itself does not follow this assumption, the options are: +- Modify the game to make that location/connection repeatable +- If there are both missable and repeatable ways to check the location/traverse the connection, then write logic for + only the repeatable ways +- Don't generate the missable location/connection at all + - For connections, any logical regions will still need to be reachable through other, *repeatable* connections + - For locations, this may require game changes to remove the vanilla item if it affects logic +- Decide that resetting the save file is part of the game's logic, and warn players about that From 11842d396ab11ca5099a8f071c38e004438eeae7 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Wed, 14 May 2025 04:23:12 -0700 Subject: [PATCH 136/199] DS3: Fix the Name of "Red and White Round Shield" (#4994) This item name is unusual in that it loses the word "round" when it's infused, *and* the only guaranteed drop in the base game is the infused "Blessed Red and White Round Shield +1". But since we're just listing the uninfused version, we should use the uninfused name. --- worlds/dark_souls_3/Items.py | 2 +- worlds/dark_souls_3/Locations.py | 5 +++-- worlds/dark_souls_3/docs/locations_en.md | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/worlds/dark_souls_3/Items.py b/worlds/dark_souls_3/Items.py index 044e3616f7..0980781ae8 100644 --- a/worlds/dark_souls_3/Items.py +++ b/worlds/dark_souls_3/Items.py @@ -511,7 +511,7 @@ _vanilla_items = [ DS3ItemData("Elkhorn Round Shield", 0x0133C510, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Warrior's Round Shield", 0x0133EC20, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Caduceus Round Shield", 0x01341330, DS3ItemCategory.SHIELD_INFUSIBLE), - DS3ItemData("Red and White Shield", 0x01343A40, DS3ItemCategory.SHIELD_INFUSIBLE), + DS3ItemData("Red and White Round Shield", 0x01343A40, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Blessed Red and White Shield+1", 0x01343FB9, DS3ItemCategory.SHIELD), DS3ItemData("Plank Shield", 0x01346150, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Leather Shield", 0x01348860, DS3ItemCategory.SHIELD_INFUSIBLE), diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index 7b30997581..c84d91e516 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -732,8 +732,9 @@ location_tables: Dict[str, List[DS3LocationData]] = { missable=True), # requires projectile DS3LocationData("US: Flame Stoneplate Ring - hanging corpse by Mound-Maker transport", "Flame Stoneplate Ring"), - DS3LocationData("US: Red and White Shield - chasm, hanging corpse", "Red and White Shield", - static="02,0:53100740::", missable=True), # requires projectile + DS3LocationData("US: Red and White Round Shield - chasm, hanging corpse", + "Red and White Round Shield", static="02,0:53100740::", + missable=True), # requires projectile DS3LocationData("US: Small Leather Shield - first building, hanging corpse by entrance", "Small Leather Shield"), DS3LocationData("US: Pale Tongue - tower village, hanging corpse", "Pale Tongue"), diff --git a/worlds/dark_souls_3/docs/locations_en.md b/worlds/dark_souls_3/docs/locations_en.md index 8411b8c42a..4f0160a96d 100644 --- a/worlds/dark_souls_3/docs/locations_en.md +++ b/worlds/dark_souls_3/docs/locations_en.md @@ -2239,7 +2239,7 @@ static _Dark Souls III_ randomizer]. US: Pyromancy Flame - CornyxGiven by Cornyx in Firelink Shrine or dropped. US: Red Bug Pellet - tower village building, basementOn the floor of the building after the Fire Demon encounter US: Red Hilted Halberd - chasm cryptIn the skeleton area accessible from Grave Key or dropping down from near Eygon -US: Red and White Shield - chasm, hanging corpseOn a hanging corpse in the ravine accessible with the Grave Key or dropping down near Eygon, to the entrance of Irina's prison. Must be shot down with an arrow or projective. +US: Red and White Round Shield - chasm, hanging corpseOn a hanging corpse in the ravine accessible with the Grave Key or dropping down near Eygon, to the entrance of Irina's prison. Must be shot down with an arrow or projective. US: Reinforced Club - by white treeNear the Birch Tree where giant shoots arrows US: Repair Powder - first building, balconyOn the balcony of the first Undead Settlement building US: Rusted Coin - awning above Dilapidated BridgeOn a wooden ledge near the Dilapidated Bridge bonfire. Must be jumped to from near Cathedral Evangelist enemy From a87fec0cbd682148b7ee1aad84bea2552070af14 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Wed, 14 May 2025 07:27:15 -0400 Subject: [PATCH 137/199] SDV: Add Missing Marriage Requirement for Spouse Stardrop (#4988) --- worlds/stardew_valley/rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 51f69a1af8..ba71c05874 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -864,7 +864,7 @@ def set_friendsanity_rules(logic: StardewLogic, multiworld: MultiWorld, player: if not content.features.friendsanity.is_enabled: return set_rule(multiworld.get_location("Spouse Stardrop", player), - logic.relationship.has_hearts_with_any_bachelor(13)) + logic.relationship.has_hearts_with_any_bachelor(13) & logic.relationship.can_get_married()) set_rule(multiworld.get_location("Have a Baby", player), logic.relationship.can_reproduce(1)) set_rule(multiworld.get_location("Have Another Baby", player), From 02fd75c018b7172ddad306a2851af482a753cfef Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Wed, 14 May 2025 07:40:38 -0400 Subject: [PATCH 138/199] Core: Update Some Outdated Typing (#4986) --- Generate.py | 14 +++++----- Launcher.py | 13 +++++----- Main.py | 21 ++++++++------- settings.py | 59 ++++++++++++++++++++++--------------------- setup.py | 46 ++++++++++++++++----------------- test/hosting/world.py | 3 +-- 6 files changed, 77 insertions(+), 79 deletions(-) diff --git a/Generate.py b/Generate.py index e72887c26c..9bc8d1066f 100644 --- a/Generate.py +++ b/Generate.py @@ -10,8 +10,8 @@ import sys import urllib.parse import urllib.request from collections import Counter -from typing import Any, Dict, Tuple, Union from itertools import chain +from typing import Any import ModuleUpdate @@ -77,7 +77,7 @@ def get_seed_name(random_source) -> str: return f"{random_source.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits) -def main(args=None) -> Tuple[argparse.Namespace, int]: +def main(args=None) -> tuple[argparse.Namespace, int]: # __name__ == "__main__" check so unittests that already imported worlds don't trip this. if __name__ == "__main__" and "worlds" in sys.modules: raise Exception("Worlds system should not be loaded before logging init.") @@ -95,7 +95,7 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: logging.info("Race mode enabled. Using non-deterministic random source.") random.seed() # reset to time-based random source - weights_cache: Dict[str, Tuple[Any, ...]] = {} + weights_cache: dict[str, tuple[Any, ...]] = {} if args.weights_file_path and os.path.exists(args.weights_file_path): try: weights_cache[args.weights_file_path] = read_weights_yamls(args.weights_file_path) @@ -180,7 +180,7 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: erargs.name = {} erargs.csv_output = args.csv_output - settings_cache: Dict[str, Tuple[argparse.Namespace, ...]] = \ + settings_cache: dict[str, tuple[argparse.Namespace, ...]] = \ {fname: (tuple(roll_settings(yaml, args.plando) for yaml in yamls) if args.sameoptions else None) for fname, yamls in weights_cache.items()} @@ -212,7 +212,7 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: path = player_path_cache[player] if path: try: - settings: Tuple[argparse.Namespace, ...] = settings_cache[path] if settings_cache[path] else \ + settings: tuple[argparse.Namespace, ...] = settings_cache[path] if settings_cache[path] else \ tuple(roll_settings(yaml, args.plando) for yaml in weights_cache[path]) for settingsObject in settings: for k, v in vars(settingsObject).items(): @@ -242,7 +242,7 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: return erargs, seed -def read_weights_yamls(path) -> Tuple[Any, ...]: +def read_weights_yamls(path) -> tuple[Any, ...]: try: if urllib.parse.urlparse(path).scheme in ('https', 'file'): yaml = str(urllib.request.urlopen(path).read(), "utf-8-sig") @@ -378,7 +378,7 @@ def update_weights(weights: dict, new_weights: dict, update_type: str, name: str return weights -def roll_meta_option(option_key, game: str, category_dict: Dict) -> Any: +def roll_meta_option(option_key, game: str, category_dict: dict) -> Any: from worlds import AutoWorldRegister if not game: diff --git a/Launcher.py b/Launcher.py index 594286fac5..503490243d 100644 --- a/Launcher.py +++ b/Launcher.py @@ -16,9 +16,10 @@ import subprocess import sys import urllib.parse import webbrowser +from collections.abc import Callable, Sequence from os.path import isfile from shutil import which -from typing import Callable, Optional, Sequence, Tuple, Union, Any +from typing import Any if __name__ == "__main__": import ModuleUpdate @@ -114,7 +115,7 @@ components.extend([ ]) -def handle_uri(path: str, launch_args: Tuple[str, ...]) -> None: +def handle_uri(path: str, launch_args: tuple[str, ...]) -> None: url = urllib.parse.urlparse(path) queries = urllib.parse.parse_qs(url.query) launch_args = (path, *launch_args) @@ -162,7 +163,7 @@ def handle_uri(path: str, launch_args: Tuple[str, ...]) -> None: ).open() -def identify(path: Union[None, str]) -> Tuple[Union[None, str], Union[None, Component]]: +def identify(path: None | str) -> tuple[None | str, None | Component]: if path is None: return None, None for component in components: @@ -173,7 +174,7 @@ def identify(path: Union[None, str]) -> Tuple[Union[None, str], Union[None, Comp return None, None -def get_exe(component: Union[str, Component]) -> Optional[Sequence[str]]: +def get_exe(component: str | Component) -> Sequence[str] | None: if isinstance(component, str): name = component component = None @@ -226,7 +227,7 @@ def create_shortcut(button: Any, component: Component) -> None: button.menu.dismiss() -refresh_components: Optional[Callable[[], None]] = None +refresh_components: Callable[[], None] | None = None def run_gui(path: str, args: Any) -> None: @@ -451,7 +452,7 @@ def run_component(component: Component, *args): logging.warning(f"Component {component} does not appear to be executable.") -def main(args: Optional[Union[argparse.Namespace, dict]] = None): +def main(args: argparse.Namespace | dict | None = None): if isinstance(args, argparse.Namespace): args = {k: v for k, v in args._get_kwargs()} elif not args: diff --git a/Main.py b/Main.py index 147fa382e2..442c2ff404 100644 --- a/Main.py +++ b/Main.py @@ -7,14 +7,13 @@ import tempfile import time import zipfile import zlib -from typing import Dict, List, Optional, Set, Tuple, Union import worlds -from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld, Region +from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld from Fill import FillError, balance_multiworld_progression, distribute_items_restrictive, flood_items, \ parse_planned_blocks, distribute_planned_blocks, resolve_early_locations_for_planned from Options import StartInventoryPool -from Utils import __version__, output_path, version_tuple, get_settings +from Utils import __version__, output_path, version_tuple from settings import get_settings from worlds import AutoWorld from worlds.generic.Rules import exclusion_rules, locality_rules @@ -22,7 +21,7 @@ from worlds.generic.Rules import exclusion_rules, locality_rules __all__ = ["main"] -def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = None): +def main(args, seed=None, baked_server_options: dict[str, object] | None = None): if not baked_server_options: baked_server_options = get_settings().server_options.as_dict() assert isinstance(baked_server_options, dict) @@ -140,7 +139,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No # remove starting inventory from pool items. # Because some worlds don't actually create items during create_items this has to be as late as possible. fallback_inventory = StartInventoryPool({}) - depletion_pool: Dict[int, Dict[str, int]] = { + depletion_pool: dict[int, dict[str, int]] = { player: getattr(multiworld.worlds[player].options, "start_inventory_from_pool", fallback_inventory).value.copy() for player in multiworld.player_ids } @@ -149,7 +148,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No } if target_per_player: - new_itempool: List[Item] = [] + new_itempool: list[Item] = [] # Make new itempool with start_inventory_from_pool items removed for item in multiworld.itempool: @@ -233,7 +232,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No pool.submit(AutoWorld.call_single, multiworld, "generate_output", player, temp_dir)) # collect ER hint info - er_hint_data: Dict[int, Dict[int, str]] = {} + er_hint_data: dict[int, dict[int, str]] = {} AutoWorld.call_all(multiworld, 'extend_hint_information', er_hint_data) def write_multidata(): @@ -274,7 +273,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No for player in multiworld.groups[location.item.player]["players"]: precollected_hints[player].add(hint) - locations_data: Dict[int, Dict[int, Tuple[int, int, int]]] = {player: {} for player in multiworld.player_ids} + locations_data: dict[int, dict[int, tuple[int, int, int]]] = {player: {} for player in multiworld.player_ids} for location in multiworld.get_filled_locations(): if type(location.address) == int: assert location.item.code is not None, "item code None should be event, " \ @@ -303,12 +302,12 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No } data_package["Archipelago"] = worlds.network_data_package["games"]["Archipelago"] - checks_in_area: Dict[int, Dict[str, Union[int, List[int]]]] = {} + checks_in_area: dict[int, dict[str, int | list[int]]] = {} # get spheres -> filter address==None -> skip empty - spheres: List[Dict[int, Set[int]]] = [] + spheres: list[dict[int, set[int]]] = [] for sphere in multiworld.get_sendable_spheres(): - current_sphere: Dict[int, Set[int]] = collections.defaultdict(set) + current_sphere: dict[int, set[int]] = collections.defaultdict(set) for sphere_location in sphere: current_sphere[sphere_location.player].add(sphere_location.address) diff --git a/settings.py b/settings.py index 255c537fe0..ef1ea9adf7 100644 --- a/settings.py +++ b/settings.py @@ -10,9 +10,10 @@ import sys import types import typing import warnings +from collections.abc import Iterator, Sequence from enum import IntEnum from threading import Lock -from typing import cast, Any, BinaryIO, ClassVar, Dict, Iterator, List, Optional, TextIO, Tuple, Union, TypeVar +from typing import cast, Any, BinaryIO, ClassVar, TextIO, TypeVar, Union __all__ = [ "get_settings", "fmt_doc", "no_gui", @@ -23,7 +24,7 @@ __all__ = [ no_gui = False skip_autosave = False -_world_settings_name_cache: Dict[str, str] = {} # TODO: cache on disk and update when worlds change +_world_settings_name_cache: dict[str, str] = {} # TODO: cache on disk and update when worlds change _world_settings_name_cache_updated = False _lock = Lock() @@ -53,7 +54,7 @@ def fmt_doc(cls: type, level: int) -> str: class Group: - _type_cache: ClassVar[Optional[Dict[str, Any]]] = None + _type_cache: ClassVar[dict[str, Any] | None] = None _dumping: bool = False _has_attr: bool = False _changed: bool = False @@ -106,7 +107,7 @@ class Group: self.__dict__.values())) @classmethod - def get_type_hints(cls) -> Dict[str, Any]: + def get_type_hints(cls) -> dict[str, Any]: """Returns resolved type hints for the class""" if cls._type_cache is None: if not cls.__annotations__ or not isinstance(next(iter(cls.__annotations__.values())), str): @@ -124,10 +125,10 @@ class Group: return self[key] return default - def items(self) -> List[Tuple[str, Any]]: + def items(self) -> list[tuple[str, Any]]: return [(key, getattr(self, key)) for key in self] - def update(self, dct: Dict[str, Any]) -> None: + def update(self, dct: dict[str, Any]) -> None: assert isinstance(dct, dict), f"{self.__class__.__name__}.update called with " \ f"{dct.__class__.__name__} instead of dict." @@ -196,7 +197,7 @@ class Group: warnings.warn(f"{self.__class__.__name__}.{k} " f"assigned from incompatible type {type(v).__name__}") - def as_dict(self, *args: str, downcast: bool = True) -> Dict[str, Any]: + def as_dict(self, *args: str, downcast: bool = True) -> dict[str, Any]: return { name: _to_builtin(cast(object, getattr(self, name))) if downcast else getattr(self, name) for name in self if not args or name in args @@ -211,7 +212,7 @@ class Group: f.write(f"{indent}{yaml_line}") @classmethod - def _dump_item(cls, name: Optional[str], attr: object, f: TextIO, level: int) -> None: + def _dump_item(cls, name: str | None, attr: object, f: TextIO, level: int) -> None: """Write a group, dict or sequence item to f, where attr can be a scalar or a collection""" # lazy construction of yaml Dumper to avoid loading Utils early @@ -223,7 +224,7 @@ class Group: def represent_mapping(self, tag: str, mapping: Any, flow_style: Any = None) -> MappingNode: from yaml import ScalarNode res: MappingNode = super().represent_mapping(tag, mapping, flow_style) - pairs = cast(List[Tuple[ScalarNode, Any]], res.value) + pairs = cast(list[tuple[ScalarNode, Any]], res.value) for k, v in pairs: k.style = None # remove quotes from keys return res @@ -329,9 +330,9 @@ class Path(str): """Marks the file as required and opens a file browser when missing""" is_exe: bool = False """Special cross-platform handling for executables""" - description: Optional[str] = None + description: str | None = None """Title to display when browsing for the file""" - copy_to: Optional[str] = None + copy_to: str | None = None """If not None, copy to AP folder instead of linking it""" @classmethod @@ -339,7 +340,7 @@ class Path(str): """Overload and raise to validate input files from browse""" pass - def browse(self: T, **kwargs: Any) -> Optional[T]: + def browse(self: T, **kwargs: Any) -> T | None: """Opens a file browser to search for the file""" raise NotImplementedError(f"Please use a subclass of Path for {self.__class__.__name__}") @@ -369,12 +370,12 @@ class _LocalPath(str): class FilePath(Path): # path to a file - md5s: ClassVar[List[Union[str, bytes]]] = [] + md5s: ClassVar[list[str | bytes]] = [] """MD5 hashes for default validator.""" def browse(self: T, - filetypes: Optional[typing.Sequence[typing.Tuple[str, typing.Sequence[str]]]] = None, **kwargs: Any)\ - -> Optional[T]: + filetypes: Sequence[tuple[str, Sequence[str]]] | None = None, **kwargs: Any)\ + -> T | None: from Utils import open_filename, is_windows if not filetypes: if self.is_exe: @@ -439,7 +440,7 @@ class FilePath(Path): class FolderPath(Path): # path to a folder - def browse(self: T, **kwargs: Any) -> Optional[T]: + def browse(self: T, **kwargs: Any) -> T | None: from Utils import open_directory res = open_directory(f"Select {self.description or self.__class__.__name__}", self) if res: @@ -597,16 +598,16 @@ class ServerOptions(Group): OFF = 0 ON = 1 - host: Optional[str] = None + host: str | None = None port: int = 38281 - password: Optional[str] = None - multidata: Optional[str] = None - savefile: Optional[str] = None + password: str | None = None + multidata: str | None = None + savefile: str | None = None disable_save: bool = False loglevel: str = "info" logtime: bool = False - server_password: Optional[ServerPassword] = None - disable_item_cheat: Union[DisableItemCheat, bool] = False + server_password: ServerPassword | None = None + disable_item_cheat: DisableItemCheat | bool = False location_check_points: LocationCheckPoints = LocationCheckPoints(1) hint_cost: HintCost = HintCost(10) release_mode: ReleaseMode = ReleaseMode("auto") @@ -702,7 +703,7 @@ does nothing if not found """ sni_path: SNIPath = SNIPath("SNI") - snes_rom_start: Union[SnesRomStart, bool] = True + snes_rom_start: SnesRomStart | bool = True class BizHawkClientOptions(Group): @@ -721,7 +722,7 @@ class BizHawkClientOptions(Group): """ emuhawk_path: EmuHawkPath = EmuHawkPath(None) - rom_start: Union[RomStart, bool] = True + rom_start: RomStart | bool = True # Top-level group with lazy loading of worlds @@ -733,7 +734,7 @@ class Settings(Group): sni_options: SNIOptions = SNIOptions() bizhawkclient_options: BizHawkClientOptions = BizHawkClientOptions() - _filename: Optional[str] = None + _filename: str | None = None def __getattribute__(self, key: str) -> Any: if key.startswith("_") or key in self.__class__.__dict__: @@ -787,7 +788,7 @@ class Settings(Group): return super().__getattribute__(key) - def __init__(self, location: Optional[str]): # change to PathLike[str] once we drop 3.8? + def __init__(self, location: str | None): # change to PathLike[str] once we drop 3.8? super().__init__() if location: from Utils import parse_yaml @@ -821,7 +822,7 @@ class Settings(Group): import atexit atexit.register(autosave) - def save(self, location: Optional[str] = None) -> None: # as above + def save(self, location: str | None = None) -> None: # as above from Utils import parse_yaml location = location or self._filename assert location, "No file specified" @@ -854,7 +855,7 @@ class Settings(Group): super().dump(f, level) @property - def filename(self) -> Optional[str]: + def filename(self) -> str | None: return self._filename @@ -867,7 +868,7 @@ def get_settings() -> Settings: if not res: from Utils import user_path, local_path filenames = ("options.yaml", "host.yaml") - locations: List[str] = [] + locations: list[str] = [] if os.path.join(os.getcwd()) != local_path(): locations += filenames # use files from cwd only if it's not the local_path locations += [user_path(filename) for filename in filenames] diff --git a/setup.py b/setup.py index 8d415932d0..2654cc69da 100644 --- a/setup.py +++ b/setup.py @@ -1,22 +1,20 @@ import base64 import datetime +import io +import json import os import platform import shutil +import subprocess import sys import sysconfig +import threading +import urllib.request import warnings import zipfile -import urllib.request -import io -import json -import threading -import subprocess - +from collections.abc import Iterable, Sequence from hashlib import sha3_512 from pathlib import Path -from typing import Dict, Iterable, List, Optional, Sequence, Set, Tuple, Union - # This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it requirement = 'cx-Freeze==8.0.0' @@ -60,7 +58,7 @@ from Cython.Build import cythonize # On Python < 3.10 LogicMixin is not currently supported. -non_apworlds: Set[str] = { +non_apworlds: set[str] = { "A Link to the Past", "Adventure", "ArchipIDLE", @@ -147,7 +145,7 @@ def download_SNI() -> None: print(f"No SNI found for system spec {platform_name} {machine_name}") -signtool: Optional[str] +signtool: str | None if os.path.exists("X:/pw.txt"): print("Using signtool") with open("X:/pw.txt", encoding="utf-8-sig") as f: @@ -205,7 +203,7 @@ def remove_sprites_from_folder(folder: Path) -> None: os.remove(folder / file) -def _threaded_hash(filepath: Union[str, Path]) -> str: +def _threaded_hash(filepath: str | Path) -> str: hasher = sha3_512() hasher.update(open(filepath, "rb").read()) return base64.b85encode(hasher.digest()).decode() @@ -255,7 +253,7 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): self.libfolder = Path(self.buildfolder, "lib") self.library = Path(self.libfolder, "library.zip") - def installfile(self, path: Path, subpath: Optional[Union[str, Path]] = None, keep_content: bool = False) -> None: + def installfile(self, path: Path, subpath: str | Path | None = None, keep_content: bool = False) -> None: folder = self.buildfolder if subpath: folder /= subpath @@ -374,7 +372,7 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): from worlds.AutoWorld import AutoWorldRegister assert not non_apworlds - set(AutoWorldRegister.world_types), \ f"Unknown world {non_apworlds - set(AutoWorldRegister.world_types)} designated for .apworld" - folders_to_remove: List[str] = [] + folders_to_remove: list[str] = [] disabled_worlds_folder = "worlds_disabled" for entry in os.listdir(disabled_worlds_folder): if os.path.isdir(os.path.join(disabled_worlds_folder, entry)): @@ -446,12 +444,12 @@ class AppImageCommand(setuptools.Command): ("app-exec=", None, "The application to run inside the image."), ("yes", "y", 'Answer "yes" to all questions.'), ] - build_folder: Optional[Path] - dist_file: Optional[Path] - app_dir: Optional[Path] + build_folder: Path | None + dist_file: Path | None + app_dir: Path | None app_name: str - app_exec: Optional[Path] - app_icon: Optional[Path] # source file + app_exec: Path | None + app_icon: Path | None # source file app_id: str # lower case name, used for icon and .desktop yes: bool @@ -493,7 +491,7 @@ $APPDIR/$exe "$@" """) launcher_filename.chmod(0o755) - def install_icon(self, src: Path, name: Optional[str] = None, symlink: Optional[Path] = None) -> None: + def install_icon(self, src: Path, name: str | None = None, symlink: Path | None = None) -> None: assert self.app_dir, "Invalid app_dir" try: from PIL import Image @@ -556,7 +554,7 @@ $APPDIR/$exe "$@" subprocess.call(f'ARCH={build_arch} ./appimagetool -n "{self.app_dir}" "{self.dist_file}"', shell=True) -def find_libs(*args: str) -> Sequence[Tuple[str, str]]: +def find_libs(*args: str) -> Sequence[tuple[str, str]]: """Try to find system libraries to be included.""" if not args: return [] @@ -564,7 +562,7 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: arch = build_arch.replace('_', '-') libc = 'libc6' # we currently don't support musl - def parse(line: str) -> Tuple[Tuple[str, str, str], str]: + def parse(line: str) -> tuple[tuple[str, str, str], str]: lib, path = line.strip().split(' => ') lib, typ = lib.split(' ', 1) for test_arch in ('x86-64', 'i386', 'aarch64'): @@ -589,8 +587,8 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: k: v for k, v in (parse(line) for line in data if "=>" in line) } - def find_lib(lib: str, arch: str, libc: str) -> Optional[str]: - cache: Dict[Tuple[str, str, str], str] = getattr(find_libs, "cache") + def find_lib(lib: str, arch: str, libc: str) -> str | None: + cache: dict[tuple[str, str, str], str] = getattr(find_libs, "cache") for k, v in cache.items(): if k == (lib, arch, libc): return v @@ -599,7 +597,7 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: return v return None - res: List[Tuple[str, str]] = [] + res: list[tuple[str, str]] = [] for arg in args: # try exact match, empty libc, empty arch, empty arch and libc file = find_lib(arg, arch, libc) diff --git a/test/hosting/world.py b/test/hosting/world.py index e083e027fe..7412641201 100644 --- a/test/hosting/world.py +++ b/test/hosting/world.py @@ -1,13 +1,12 @@ import re import shutil from pathlib import Path -from typing import Dict __all__ = ["copy", "delete"] -_new_worlds: Dict[str, str] = {} +_new_worlds: dict[str, str] = {} def copy(src: str, dst: str) -> None: From 2a0d0b4224eb818f83d0426f7c042a334608b41b Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Wed, 14 May 2025 07:55:45 -0400 Subject: [PATCH 139/199] Noita: Modernization Refactor (#4980) --- worlds/noita/__init__.py | 2 +- worlds/noita/events.py | 10 +++---- worlds/noita/items.py | 42 ++++++++++------------------ worlds/noita/locations.py | 10 +++---- worlds/noita/regions.py | 23 ++++++--------- worlds/noita/rules.py | 59 +++++++++++++++++---------------------- 6 files changed, 59 insertions(+), 87 deletions(-) diff --git a/worlds/noita/__init__.py b/worlds/noita/__init__.py index af2921768d..a0b94458c2 100644 --- a/worlds/noita/__init__.py +++ b/worlds/noita/__init__.py @@ -38,7 +38,7 @@ class NoitaWorld(World): web = NoitaWeb() def generate_early(self) -> None: - if not self.multiworld.get_player_name(self.player).isascii(): + if not self.player_name.isascii(): raise Exception("Noita yaml's slot name has invalid character(s).") # Returned items will be sent over to the client diff --git a/worlds/noita/events.py b/worlds/noita/events.py index 4ec04e98b4..2ae524d9ec 100644 --- a/worlds/noita/events.py +++ b/worlds/noita/events.py @@ -1,4 +1,4 @@ -from typing import Dict, TYPE_CHECKING +from typing import TYPE_CHECKING from BaseClasses import Item, ItemClassification, Location, Region from . import items, locations @@ -6,7 +6,7 @@ if TYPE_CHECKING: from . import NoitaWorld -def create_event(player: int, name: str) -> Item: +def create_event_item(player: int, name: str) -> Item: return items.NoitaItem(name, ItemClassification.progression, None, player) @@ -16,13 +16,13 @@ def create_location(player: int, name: str, region: Region) -> Location: def create_locked_location_event(player: int, region: Region, item: str) -> Location: new_location = create_location(player, item, region) - new_location.place_locked_item(create_event(player, item)) + new_location.place_locked_item(create_event_item(player, item)) region.locations.append(new_location) return new_location -def create_all_events(world: "NoitaWorld", created_regions: Dict[str, Region]) -> None: +def create_all_events(world: "NoitaWorld", created_regions: dict[str, Region]) -> None: for region_name, event in event_locks.items(): region = created_regions[region_name] create_locked_location_event(world.player, region, event) @@ -31,7 +31,7 @@ def create_all_events(world: "NoitaWorld", created_regions: Dict[str, Region]) - # Maps region names to event names -event_locks: Dict[str, str] = { +event_locks: dict[str, str] = { "The Work": "Victory", "Mines": "Portal to Holy Mountain 1", "Coal Pits": "Portal to Holy Mountain 2", diff --git a/worlds/noita/items.py b/worlds/noita/items.py index 20d9ff1930..4cd0b5ef87 100644 --- a/worlds/noita/items.py +++ b/worlds/noita/items.py @@ -1,6 +1,6 @@ import itertools from collections import Counter -from typing import Dict, List, NamedTuple, Set, TYPE_CHECKING +from typing import NamedTuple, TYPE_CHECKING from BaseClasses import Item, ItemClassification from .options import BossesAsChecks, VictoryCondition, ExtraOrbs @@ -27,12 +27,12 @@ def create_item(player: int, name: str) -> Item: return NoitaItem(name, item_data.classification, item_data.code, player) -def create_fixed_item_pool() -> List[str]: - required_items: Dict[str, int] = {name: data.required_num for name, data in item_table.items()} +def create_fixed_item_pool() -> list[str]: + required_items: dict[str, int] = {name: data.required_num for name, data in item_table.items()} return list(Counter(required_items).elements()) -def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) -> List[str]: +def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) -> list[str]: orb_count = extra_orbs.value if victory_condition == VictoryCondition.option_pure_ending: orb_count = orb_count + 11 @@ -41,15 +41,15 @@ def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) return ["Orb" for _ in range(orb_count)] -def create_spatial_awareness_item(bosses_as_checks: BossesAsChecks) -> List[str]: +def create_spatial_awareness_item(bosses_as_checks: BossesAsChecks) -> list[str]: return ["Spatial Awareness Perk"] if bosses_as_checks.value >= BossesAsChecks.option_all_bosses else [] -def create_kantele(victory_condition: VictoryCondition) -> List[str]: +def create_kantele(victory_condition: VictoryCondition) -> list[str]: return ["Kantele"] if victory_condition.value >= VictoryCondition.option_pure_ending else [] -def create_random_items(world: NoitaWorld, weights: Dict[str, int], count: int) -> List[str]: +def create_random_items(world: NoitaWorld, weights: dict[str, int], count: int) -> list[str]: filler_pool = weights.copy() if not world.options.bad_effects: filler_pool["Trap"] = 0 @@ -87,7 +87,7 @@ def create_all_items(world: NoitaWorld) -> None: # 110000 - 110032 -item_table: Dict[str, ItemData] = { +item_table: dict[str, ItemData] = { "Trap": ItemData(110000, "Traps", ItemClassification.trap), "Extra Max HP": ItemData(110001, "Pickups", ItemClassification.useful), "Spell Refresher": ItemData(110002, "Pickups", ItemClassification.filler), @@ -122,7 +122,7 @@ item_table: Dict[str, ItemData] = { "Broken Wand": ItemData(110031, "Items", ItemClassification.filler), } -shop_only_filler_weights: Dict[str, int] = { +shop_only_filler_weights: dict[str, int] = { "Trap": 15, "Extra Max HP": 25, "Spell Refresher": 20, @@ -135,7 +135,7 @@ shop_only_filler_weights: Dict[str, int] = { "Extra Life Perk": 10, } -filler_weights: Dict[str, int] = { +filler_weights: dict[str, int] = { **shop_only_filler_weights, "Gold (200)": 15, "Gold (1000)": 6, @@ -152,22 +152,10 @@ filler_weights: Dict[str, int] = { } -# These helper functions make the comprehensions below more readable -def get_item_group(item_name: str) -> str: - return item_table[item_name].group +filler_items: list[str] = list(filter(lambda item: item_table[item].classification == ItemClassification.filler, + item_table.keys())) +item_name_to_id: dict[str, int] = {name: data.code for name, data in item_table.items()} - -def item_is_filler(item_name: str) -> bool: - return item_table[item_name].classification == ItemClassification.filler - - -def item_is_perk(item_name: str) -> bool: - return item_table[item_name].group == "Perks" - - -filler_items: List[str] = list(filter(item_is_filler, item_table.keys())) -item_name_to_id: Dict[str, int] = {name: data.code for name, data in item_table.items()} - -item_name_groups: Dict[str, Set[str]] = { - group: set(item_names) for group, item_names in itertools.groupby(item_table, get_item_group) +item_name_groups: dict[str, set[str]] = { + group: set(item_names) for group, item_names in itertools.groupby(item_table, lambda item: item_table[item].group) } diff --git a/worlds/noita/locations.py b/worlds/noita/locations.py index 5dd87b5b03..319955769a 100644 --- a/worlds/noita/locations.py +++ b/worlds/noita/locations.py @@ -1,6 +1,6 @@ # Locations are specific points that you would obtain an item at. from enum import IntEnum -from typing import Dict, NamedTuple, Optional, Set +from typing import NamedTuple from BaseClasses import Location @@ -27,7 +27,7 @@ class LocationFlag(IntEnum): # Only the first Hidden Chest and Pedestal are mapped here, the others are created in Regions. # ltype key: "Chest" = Hidden Chests, "Pedestal" = Pedestals, "Boss" = Boss, "Orb" = Orb. # 110000-110671 -location_region_mapping: Dict[str, Dict[str, LocationData]] = { +location_region_mapping: dict[str, dict[str, LocationData]] = { "Coal Pits Holy Mountain": { "Coal Pits Holy Mountain Shop Item 1": LocationData(110000), "Coal Pits Holy Mountain Shop Item 2": LocationData(110001), @@ -207,15 +207,15 @@ location_region_mapping: Dict[str, Dict[str, LocationData]] = { } -def make_location_range(location_name: str, base_id: int, amt: int) -> Dict[str, int]: +def make_location_range(location_name: str, base_id: int, amt: int) -> dict[str, int]: if amt == 1: return {location_name: base_id} return {f"{location_name} {i+1}": base_id + i for i in range(amt)} -location_name_groups: Dict[str, Set[str]] = {"Shop": set(), "Orb": set(), "Boss": set(), "Chest": set(), +location_name_groups: dict[str, set[str]] = {"Shop": set(), "Orb": set(), "Boss": set(), "Chest": set(), "Pedestal": set()} -location_name_to_id: Dict[str, int] = {} +location_name_to_id: dict[str, int] = {} for region_name, location_group in location_region_mapping.items(): diff --git a/worlds/noita/regions.py b/worlds/noita/regions.py index 184cd96018..55a0ad1fc8 100644 --- a/worlds/noita/regions.py +++ b/worlds/noita/regions.py @@ -1,5 +1,5 @@ # Regions are areas in your game that you travel to. -from typing import Dict, List, TYPE_CHECKING +from typing import TYPE_CHECKING from BaseClasses import Entrance, Region from . import locations @@ -36,28 +36,21 @@ def create_region(world: "NoitaWorld", region_name: str) -> Region: return new_region -def create_regions(world: "NoitaWorld") -> Dict[str, Region]: +def create_regions(world: "NoitaWorld") -> dict[str, Region]: return {name: create_region(world, name) for name in noita_regions} -# An "Entrance" is really just a connection between two regions -def create_entrance(player: int, source: str, destination: str, regions: Dict[str, Region]) -> Entrance: - entrance = Entrance(player, f"From {source} To {destination}", regions[source]) - entrance.connect(regions[destination]) - return entrance - - # Creates connections based on our access mapping in `noita_connections`. -def create_connections(player: int, regions: Dict[str, Region]) -> None: +def create_connections(regions: dict[str, Region]) -> None: for source, destinations in noita_connections.items(): - new_entrances = [create_entrance(player, source, destination, regions) for destination in destinations] - regions[source].exits = new_entrances + for destination in destinations: + regions[source].connect(regions[destination]) # Creates all regions and connections. Called from NoitaWorld. def create_all_regions_and_connections(world: "NoitaWorld") -> None: created_regions = create_regions(world) - create_connections(world.player, created_regions) + create_connections(created_regions) create_all_events(world, created_regions) world.multiworld.regions += created_regions.values() @@ -75,7 +68,7 @@ def create_all_regions_and_connections(world: "NoitaWorld") -> None: # - Lake is connected to The Laboratory, since the bosses are hard without specific set-ups (which means late game) # - Snowy Depths connects to Lava Lake orb since you need digging for it, so fairly early is acceptable # - Ancient Laboratory is connected to the Coal Pits, so that Ylialkemisti isn't sphere 1 -noita_connections: Dict[str, List[str]] = { +noita_connections: dict[str, list[str]] = { "Menu": ["Forest"], "Forest": ["Mines", "Floating Island", "Desert", "Snowy Wasteland"], "Frozen Vault": ["The Vault"], @@ -117,4 +110,4 @@ noita_connections: Dict[str, List[str]] = { ### } -noita_regions: List[str] = sorted(set(noita_connections.keys()).union(*noita_connections.values())) +noita_regions: list[str] = sorted(set(noita_connections.keys()).union(*noita_connections.values())) diff --git a/worlds/noita/rules.py b/worlds/noita/rules.py index 65871a804e..c2c4832488 100644 --- a/worlds/noita/rules.py +++ b/worlds/noita/rules.py @@ -1,6 +1,5 @@ -from typing import List, NamedTuple, Set, TYPE_CHECKING +from typing import NamedTuple, TYPE_CHECKING -from BaseClasses import CollectionState from . import items, locations from .options import BossesAsChecks, VictoryCondition from worlds.generic import Rules as GenericRules @@ -16,7 +15,7 @@ class EntranceLock(NamedTuple): items_needed: int -entrance_locks: List[EntranceLock] = [ +entrance_locks: list[EntranceLock] = [ EntranceLock("Mines", "Coal Pits Holy Mountain", "Portal to Holy Mountain 1", 1), EntranceLock("Coal Pits", "Snowy Depths Holy Mountain", "Portal to Holy Mountain 2", 2), EntranceLock("Snowy Depths", "Hiisi Base Holy Mountain", "Portal to Holy Mountain 3", 3), @@ -27,7 +26,7 @@ entrance_locks: List[EntranceLock] = [ ] -holy_mountain_regions: List[str] = [ +holy_mountain_regions: list[str] = [ "Coal Pits Holy Mountain", "Snowy Depths Holy Mountain", "Hiisi Base Holy Mountain", @@ -38,7 +37,7 @@ holy_mountain_regions: List[str] = [ ] -wand_tiers: List[str] = [ +wand_tiers: list[str] = [ "Wand (Tier 1)", # Coal Pits "Wand (Tier 2)", # Snowy Depths "Wand (Tier 3)", # Hiisi Base @@ -48,29 +47,21 @@ wand_tiers: List[str] = [ ] -items_hidden_from_shops: Set[str] = {"Gold (200)", "Gold (1000)", "Potion", "Random Potion", "Secret Potion", +items_hidden_from_shops: set[str] = {"Gold (200)", "Gold (1000)", "Potion", "Random Potion", "Secret Potion", "Chaos Die", "Greed Die", "Kammi", "Refreshing Gourd", "Sädekivi", "Broken Wand", "Powder Pouch"} -perk_list: List[str] = list(filter(items.item_is_perk, items.item_table.keys())) +perk_list: list[str] = list(filter(lambda item: items.item_table[item].group == "Perks", items.item_table.keys())) # ---------------- -# Helper Functions +# Helper Function # ---------------- -def has_perk_count(state: CollectionState, player: int, amount: int) -> bool: - return sum(state.count(perk, player) for perk in perk_list) >= amount - - -def has_orb_count(state: CollectionState, player: int, amount: int) -> bool: - return state.count("Orb", player) >= amount - - -def forbid_items_at_locations(world: "NoitaWorld", shop_locations: Set[str], forbidden_items: Set[str]) -> None: +def forbid_items_at_locations(world: "NoitaWorld", shop_locations: set[str], forbidden_items: set[str]) -> None: for shop_location in shop_locations: - location = world.multiworld.get_location(shop_location, world.player) + location = world.get_location(shop_location) GenericRules.forbid_items_for_player(location, forbidden_items, world.player) @@ -104,38 +95,38 @@ def ban_early_high_tier_wands(world: "NoitaWorld") -> None: def lock_holy_mountains_into_spheres(world: "NoitaWorld") -> None: for lock in entrance_locks: - location = world.multiworld.get_entrance(f"From {lock.source} To {lock.destination}", world.player) + location = world.get_entrance(f"{lock.source} -> {lock.destination}") GenericRules.set_rule(location, lambda state, evt=lock.event: state.has(evt, world.player)) def holy_mountain_unlock_conditions(world: "NoitaWorld") -> None: victory_condition = world.options.victory_condition.value for lock in entrance_locks: - location = world.multiworld.get_location(lock.event, world.player) + location = world.get_location(lock.event) if victory_condition == VictoryCondition.option_greed_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) + state.has_group_unique("Perks", world.player, items_needed // 2) ) elif victory_condition == VictoryCondition.option_pure_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) and - has_orb_count(state, world.player, items_needed) + state.has_group_unique("Perks", world.player, items_needed // 2) and + state.has("Orb", world.player, items_needed) ) elif victory_condition == VictoryCondition.option_peaceful_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) and - has_orb_count(state, world.player, items_needed * 3) + state.has_group_unique("Perks", world.player, items_needed // 2) and + state.has("Orb", world.player, items_needed * 3) ) def biome_unlock_conditions(world: "NoitaWorld") -> None: - lukki_entrances = world.multiworld.get_region("Lukki Lair", world.player).entrances - magical_entrances = world.multiworld.get_region("Magical Temple", world.player).entrances - wizard_entrances = world.multiworld.get_region("Wizards' Den", world.player).entrances + lukki_entrances = world.get_region("Lukki Lair").entrances + magical_entrances = world.get_region("Magical Temple").entrances + wizard_entrances = world.get_region("Wizards' Den").entrances for entrance in lukki_entrances: - entrance.access_rule = lambda state: state.has("Melee Immunity Perk", world.player) and\ - state.has("All-Seeing Eye Perk", world.player) + entrance.access_rule = lambda state: ( + state.has_all(("Melee Immunity Perk", "All-Seeing Eye Perk"), world.player)) for entrance in magical_entrances: entrance.access_rule = lambda state: state.has("All-Seeing Eye Perk", world.player) for entrance in wizard_entrances: @@ -144,12 +135,12 @@ def biome_unlock_conditions(world: "NoitaWorld") -> None: def victory_unlock_conditions(world: "NoitaWorld") -> None: victory_condition = world.options.victory_condition.value - victory_location = world.multiworld.get_location("Victory", world.player) + victory_location = world.get_location("Victory") if victory_condition == VictoryCondition.option_pure_ending: - victory_location.access_rule = lambda state: has_orb_count(state, world.player, 11) + victory_location.access_rule = lambda state: state.has("Orb", world.player, 11) elif victory_condition == VictoryCondition.option_peaceful_ending: - victory_location.access_rule = lambda state: has_orb_count(state, world.player, 33) + victory_location.access_rule = lambda state: state.has("Orb", world.player, 33) # ---------------- @@ -168,5 +159,5 @@ def create_all_rules(world: "NoitaWorld") -> None: # Prevent the Map perk (used to find Toveri) from being on Toveri (boss) if world.options.bosses_as_checks.value >= BossesAsChecks.option_all_bosses: - toveri = world.multiworld.get_location("Toveri", world.player) + toveri = world.get_location("Toveri") GenericRules.forbid_items_for_player(toveri, {"Spatial Awareness Perk"}, world.player) From 15e6383aadc27eba861ab5391e3facb2f953881b Mon Sep 17 00:00:00 2001 From: el-u <109771707+el-u@users.noreply.github.com> Date: Thu, 15 May 2025 19:58:10 +0200 Subject: [PATCH 140/199] lufia2ac: rearrange tests to comply with new conventions (#5001) --- worlds/lufia2ac/test/__init__.py | 5 ----- worlds/lufia2ac/test/bases.py | 5 +++++ .../test/{TestCustomItemPool.py => test_custom_item_pool.py} | 2 +- worlds/lufia2ac/test/{TestGoal.py => test_goal.py} | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 worlds/lufia2ac/test/bases.py rename worlds/lufia2ac/test/{TestCustomItemPool.py => test_custom_item_pool.py} (98%) rename worlds/lufia2ac/test/{TestGoal.py => test_goal.py} (98%) diff --git a/worlds/lufia2ac/test/__init__.py b/worlds/lufia2ac/test/__init__.py index 306ffa7716..e69de29bb2 100644 --- a/worlds/lufia2ac/test/__init__.py +++ b/worlds/lufia2ac/test/__init__.py @@ -1,5 +0,0 @@ -from test.bases import WorldTestBase - - -class L2ACTestBase(WorldTestBase): - game = "Lufia II Ancient Cave" diff --git a/worlds/lufia2ac/test/bases.py b/worlds/lufia2ac/test/bases.py new file mode 100644 index 0000000000..306ffa7716 --- /dev/null +++ b/worlds/lufia2ac/test/bases.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class L2ACTestBase(WorldTestBase): + game = "Lufia II Ancient Cave" diff --git a/worlds/lufia2ac/test/TestCustomItemPool.py b/worlds/lufia2ac/test/test_custom_item_pool.py similarity index 98% rename from worlds/lufia2ac/test/TestCustomItemPool.py rename to worlds/lufia2ac/test/test_custom_item_pool.py index 33f72273da..2244b03f29 100644 --- a/worlds/lufia2ac/test/TestCustomItemPool.py +++ b/worlds/lufia2ac/test/test_custom_item_pool.py @@ -2,7 +2,7 @@ from argparse import Namespace from BaseClasses import PlandoOptions from Generate import handle_option -from . import L2ACTestBase +from .bases import L2ACTestBase from ..Options import CustomItemPool diff --git a/worlds/lufia2ac/test/TestGoal.py b/worlds/lufia2ac/test/test_goal.py similarity index 98% rename from worlds/lufia2ac/test/TestGoal.py rename to worlds/lufia2ac/test/test_goal.py index 1eaf5a1515..deb98ccac9 100644 --- a/worlds/lufia2ac/test/TestGoal.py +++ b/worlds/lufia2ac/test/test_goal.py @@ -1,4 +1,4 @@ -from . import L2ACTestBase +from .bases import L2ACTestBase class TestDefault(L2ACTestBase): From 90ee9ffe367a8766bea9b685ac5bdf6e43ee1f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 17 May 2025 09:20:53 -0400 Subject: [PATCH 141/199] Stardew Valley: Remove Crab Pot Requirement for Help Wanted Fishing (#4985) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/stardew_valley/logic/fishing_logic.py | 12 ++---------- worlds/stardew_valley/logic/skill_logic.py | 5 +++-- worlds/stardew_valley/regions.py | 5 +++-- worlds/stardew_valley/rules.py | 4 ++-- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/worlds/stardew_valley/logic/fishing_logic.py b/worlds/stardew_valley/logic/fishing_logic.py index c8f9e0a340..544f322057 100644 --- a/worlds/stardew_valley/logic/fishing_logic.py +++ b/worlds/stardew_valley/logic/fishing_logic.py @@ -117,7 +117,7 @@ class FishingLogic(BaseLogic): @cached_property def can_crab_pot_anywhere(self) -> StardewRule: - return self.logic.fishing.can_fish() & self.logic.region.can_reach_any(fishing_regions) + return self.logic.fishing.can_crab_pot & self.logic.region.can_reach_any(fishing_regions) @cache_self1 def can_crab_pot_at(self, region: str) -> StardewRule: @@ -125,12 +125,4 @@ class FishingLogic(BaseLogic): @cached_property def can_crab_pot(self) -> StardewRule: - crab_pot_rule = self.logic.has(Fishing.bait) - - # We can't use the same rule if skills are vanilla, because fishing levels are required to crab pot, which is required to get fishing levels... - if self.content.features.skill_progression.is_progressive: - crab_pot_rule = crab_pot_rule & self.logic.has(Machine.crab_pot) - else: - crab_pot_rule = crab_pot_rule & self.logic.skill.can_get_fishing_xp - - return crab_pot_rule + return self.logic.has(Machine.crab_pot) & self.logic.has(Fishing.bait) diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index 7582e5240f..b582eb3613 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -34,7 +34,8 @@ class SkillLogic(BaseLogic): previous_level_rule = self.logic.skill.has_previous_level(skill, level) if skill == Skill.fishing: - xp_rule = self.logic.tool.has_fishing_rod(max(tool_level, 3)) + # Not checking crab pot as this is used for not randomized skills logic, for which players need a fishing rod to start gaining xp. + xp_rule = self.logic.tool.has_fishing_rod(max(tool_level, 3)) & self.logic.fishing.can_fish_anywhere() elif skill == Skill.farming: xp_rule = self.can_get_farming_xp & self.logic.tool.has_tool(Tool.hoe, tool_material) & self.logic.tool.can_water(tool_level) elif skill == Skill.foraging: @@ -134,7 +135,7 @@ class SkillLogic(BaseLogic): @cached_property def can_get_fishing_xp(self) -> StardewRule: if self.content.features.skill_progression.is_progressive: - return self.logic.fishing.can_fish_anywhere() | self.logic.fishing.can_crab_pot + return self.logic.fishing.can_fish_anywhere() | self.logic.fishing.can_crab_pot_anywhere return self.logic.fishing.can_fish_anywhere() diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index d5be53ba86..4d06d598d3 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -24,7 +24,8 @@ vanilla_regions = [ RegionData(RegionName.farm, [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, - LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping]), + LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping, + LogicEntrance.fishing, ]), RegionData(RegionName.backwoods, [Entrance.backwoods_to_mountain]), RegionData(RegionName.bus_stop, [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]), @@ -54,7 +55,7 @@ vanilla_regions = [ Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]), RegionData(RegionName.beach, - [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.fishing, LogicEntrance.attend_luau, + [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.attend_luau, LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]), RegionData(RegionName.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]), RegionData(RegionName.ranch), diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index ba71c05874..e5d7e8863e 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -284,7 +284,7 @@ def set_skull_cavern_floor_entrance_rules(logic, multiworld, player): set_entrance_rule(multiworld, player, dig_to_skull_floor(floor), rule) -def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewValleyOptions): +def set_skill_entrance_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): set_entrance_rule(multiworld, player, LogicEntrance.grow_spring_crops, logic.farming.has_farming_tools & logic.season.has_spring) set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_crops, logic.farming.has_farming_tools & logic.season.has_summer) set_entrance_rule(multiworld, player, LogicEntrance.grow_fall_crops, logic.farming.has_farming_tools & logic.season.has_fall) @@ -299,7 +299,7 @@ def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewVa set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_fall_crops_in_summer, true_) set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_fall_crops_in_fall, true_) - set_entrance_rule(multiworld, player, LogicEntrance.fishing, logic.skill.can_get_fishing_xp) + set_entrance_rule(multiworld, player, LogicEntrance.fishing, logic.fishing.can_fish_anywhere()) def set_blacksmith_entrance_rules(logic, multiworld, player): From d3dbdb4491fa2c6b03c6ba45f6a893478b9c3f8a Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Sun, 18 May 2025 18:08:39 -0500 Subject: [PATCH 142/199] Kivy: Add a button prompt box (#3470) * Kivy: Add a button prompt box * auto format the buttons to display 2 per row to look nicer * update to kivymd * have the uri popup use the new API * have messenger use the new API * make the buttonprompt import even more lazy * messenger needs to be lazy too * make the buttons take up the full dialog width --------- Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- Launcher.py | 40 +++----- data/client.kv | 5 + kvui.py | 54 +++++++++-- worlds/messenger/client_setup.py | 154 +++++++++++++++++++------------ 4 files changed, 160 insertions(+), 93 deletions(-) diff --git a/Launcher.py b/Launcher.py index 503490243d..2520fd6b5f 100644 --- a/Launcher.py +++ b/Launcher.py @@ -121,46 +121,28 @@ def handle_uri(path: str, launch_args: tuple[str, ...]) -> None: launch_args = (path, *launch_args) client_component = [] text_client_component = None - if "game" in queries: - game = queries["game"][0] - else: # TODO around 0.6.0 - this is for pre this change webhost uri's - game = "Archipelago" + game = queries["game"][0] for component in components: if component.supports_uri and component.game_name == game: client_component.append(component) elif component.display_name == "Text Client": text_client_component = component - from kvui import MDButton, MDButtonText - from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogContentContainer, MDDialogSupportingText - from kivymd.uix.divider import MDDivider if not client_component: run_component(text_client_component, *launch_args) return else: - popup_text = MDDialogSupportingText(text="Select client to open and connect with.") - component_buttons = [MDDivider()] - for component in [text_client_component, *client_component]: - component_buttons.append(MDButton( - MDButtonText(text=component.display_name), - on_release=lambda *args, comp=component: run_component(comp, *launch_args), - style="text" - )) - component_buttons.append(MDDivider()) - - MDDialog( - # Headline - MDDialogHeadlineText(text="Connect to Multiworld"), - # Text - popup_text, - # Content - MDDialogContentContainer( - *component_buttons, - orientation="vertical" - ), - - ).open() + from kvui import ButtonsPrompt + component_options = { + text_client_component.display_name: text_client_component, + **{component.display_name: component for component in client_component} + } + popup = ButtonsPrompt("Connect to Multiworld", + "Select client to open and connect with.", + lambda component_name: run_component(component_options[component_name], *launch_args), + *component_options.keys()) + popup.open() def identify(path: None | str) -> tuple[None | str, None | Component]: diff --git a/data/client.kv b/data/client.kv index 562986cd17..53000dfe41 100644 --- a/data/client.kv +++ b/data/client.kv @@ -222,3 +222,8 @@ spacing: 10 size_hint_y: None height: self.minimum_height +: + valign: "middle" + halign: "center" + text_size: self.width, None + height: self.texture_size[1] diff --git a/kvui.py b/kvui.py index d0d965c30b..172b7e5543 100644 --- a/kvui.py +++ b/kvui.py @@ -6,7 +6,6 @@ import re import io import pkgutil from collections import deque - assert "kivy" not in sys.modules, "kvui should be imported before kivy for frozen compatibility" if sys.platform == "win32": @@ -57,6 +56,7 @@ from kivy.animation import Animation from kivy.uix.popup import Popup from kivy.uix.image import AsyncImage from kivymd.app import MDApp +from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogSupportingText, MDDialogButtonContainer from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.boxlayout import MDBoxLayout @@ -710,20 +710,62 @@ class CommandPromptTextInput(ResizableTextField): self.text = self._command_history[self._command_history_index] +class MessageBoxLabel(MDLabel): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._label.refresh() + + class MessageBox(Popup): - class MessageBoxLabel(MDLabel): - def __init__(self, **kwargs): - super().__init__(**kwargs) - self._label.refresh() def __init__(self, title, text, error=False, **kwargs): - label = MessageBox.MessageBoxLabel(text=text) + label = MessageBoxLabel(text=text) separator_color = [217 / 255, 129 / 255, 122 / 255, 1.] if error else [47 / 255., 167 / 255., 212 / 255, 1.] super().__init__(title=title, content=label, size_hint=(0.5, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) self.height += max(0, label.height - 18) +class ButtonsPrompt(MDDialog): + def __init__(self, title: str, text: str, response: typing.Callable[[str], None], + *prompts: str, **kwargs) -> None: + """ + Customizable popup box that lets you create any number of buttons. The text of the pressed button is returned to + the callback. + + :param title: The title of the popup. + :param text: The message prompt in the popup. + :param response: A callable that will get called when the user presses a button. The prompt will not close + itself so should be done here if you want to close it when certain buttons are pressed. + :param prompts: Any number of strings to be used for the buttons. + """ + layout = MDBoxLayout(orientation="vertical") + label = MessageBoxLabel(text=text) + layout.add_widget(label) + + def on_release(button: MDButton, *args) -> None: + response(button.text) + + buttons = [MDDivider()] + for prompt in prompts: + button = MDButton( + MDButtonText(text=prompt, pos_hint={"center_x": 0.5, "center_y": 0.5}), + on_release=on_release, + style="text", + theme_width="Custom", + size_hint_x=1, + ) + button.text = prompt + buttons.extend([button, MDDivider()]) + + super().__init__( + MDDialogHeadlineText(text=title), + MDDialogSupportingText(text=text), + MDDialogButtonContainer(*buttons, orientation="vertical"), + **kwargs, + ) + + class ClientTabs(MDTabsSecondary): carousel: MDTabsCarousel lock_swiping = True diff --git a/worlds/messenger/client_setup.py b/worlds/messenger/client_setup.py index 6b98a1b440..3ef1df75cc 100644 --- a/worlds/messenger/client_setup.py +++ b/worlds/messenger/client_setup.py @@ -2,35 +2,28 @@ import argparse import io import logging import os.path +import requests import subprocess import urllib.request from shutil import which -from typing import Any +from typing import Any, Callable, TYPE_CHECKING from zipfile import ZipFile -from Utils import open_file +from Utils import is_windows, messagebox, open_file, tuplize_version -import requests - -from Utils import is_windows, messagebox, tuplize_version +if TYPE_CHECKING: + from kvui import ButtonsPrompt MOD_URL = "https://api.github.com/repos/alwaysintreble/TheMessengerRandomizerModAP/releases/latest" -def ask_yes_no_cancel(title: str, text: str) -> bool | None: - """ - Wrapper for tkinter.messagebox.askyesnocancel, that creates a popup dialog box with yes, no, and cancel buttons. +def create_yes_no_popup(title: str, text: str, callback: Callable[[str], None]) -> "ButtonsPrompt": + from kvui import ButtonsPrompt + buttons = ["Yes", "No", "Cancel"] - :param title: Title to be displayed at the top of the message box. - :param text: Text to be displayed inside the message box. - :return: Returns True if yes, False if no, None if cancel. - """ - from tkinter import Tk, messagebox - root = Tk() - root.withdraw() - ret = messagebox.askyesnocancel(title, text) - root.update() - return ret + prompt = ButtonsPrompt(title, text, callback, *buttons) + prompt.open() + return prompt def launch_game(*args) -> None: @@ -151,6 +144,76 @@ def launch_game(*args) -> None: # one of the alpha builds return "alpha" in latest_version or tuplize_version(latest_version) > tuplize_version(installed_version) + def after_courier_install_popup(answer: str) -> None: + """Gets called if the user doesn't have courier installed. Handle the button they pressed.""" + nonlocal prompt + + prompt.dismiss() + if answer in ("No", "Cancel"): + return + logging.info("Installing Courier") + install_courier() + prompt = create_yes_no_popup("Install Mod", + "No randomizer mod detected. Would you like to install now?", + after_mod_install_popup) + + def after_mod_install_popup(answer: str) -> None: + """Gets called if the user has courier but mod isn't installed, or there's an available update.""" + nonlocal prompt + + prompt.dismiss() + if answer in ("No", "Cancel"): + return + logging.info("Installing Mod") + install_mod() + prompt = create_yes_no_popup("Launch Game", + "Courier and Game mod installed successfully. Launch game now?", + launch) + + def after_mod_update_popup(answer: str) -> None: + """Gets called if there's an available update.""" + nonlocal prompt + + prompt.dismiss() + if answer == "Cancel": + return + if answer == "Yes": + logging.info("Updating Mod") + install_mod() + prompt = create_yes_no_popup("Launch Game", + "Courier and Game mod installed successfully. Launch game now?", + launch) + else: + prompt = create_yes_no_popup("Launch Game", + "Game Mod not updated. Launch game now?", + launch) + + def launch(answer: str | None = None) -> None: + """Launch the game.""" + nonlocal args + + if prompt: + prompt.dismiss() + if answer and answer in ("No", "Cancel"): + return + + parser = argparse.ArgumentParser(description="Messenger Client Launcher") + parser.add_argument("url", type=str, nargs="?", help="Archipelago Webhost uri to auto connect to.") + args = parser.parse_args(args) + + if not is_windows: + if args.url: + open_file(f"steam://rungameid/764790//{args.url}/") + else: + open_file("steam://rungameid/764790") + else: + os.chdir(game_folder) + if args.url: + subprocess.Popen([MessengerWorld.settings.game_path, str(args.url)]) + else: + subprocess.Popen(MessengerWorld.settings.game_path) + os.chdir(working_directory) + from . import MessengerWorld try: game_folder = os.path.dirname(MessengerWorld.settings.game_path) @@ -172,49 +235,24 @@ def launch_game(*args) -> None: except ImportError: pass if not courier_installed(): - should_install = ask_yes_no_cancel("Install Courier", - "No Courier installation detected. Would you like to install now?") - if not should_install: - return - logging.info("Installing Courier") - install_courier() + prompt = create_yes_no_popup("Install Courier", + "No Courier installation detected. Would you like to install now?", + after_courier_install_popup) + return if not mod_installed(): - should_install = ask_yes_no_cancel("Install Mod", - "No randomizer mod detected. Would you like to install now?") - if not should_install: - return - logging.info("Installing Mod") - install_mod() + prompt = create_yes_no_popup("Install Mod", + "No randomizer mod detected. Would you like to install now?", + after_mod_install_popup) + return else: latest = request_data(MOD_URL)["tag_name"] if available_mod_update(latest): - should_update = ask_yes_no_cancel("Update Mod", - f"New mod version detected. Would you like to update to {latest} now?") - if should_update: - logging.info("Updating mod") - install_mod() - elif should_update is None: - return - - if not args: - should_launch = ask_yes_no_cancel("Launch Game", - "Mod installed and up to date. Would you like to launch the game now?") - if not should_launch: + prompt = create_yes_no_popup("Update Mod", + f"New mod version detected. Would you like to update to {latest} now?", + after_mod_update_popup) return - parser = argparse.ArgumentParser(description="Messenger Client Launcher") - parser.add_argument("url", type=str, nargs="?", help="Archipelago Webhost uri to auto connect to.") - args = parser.parse_args(args) - - if not is_windows: - if args.url: - open_file(f"steam://rungameid/764790//{args.url}/") - else: - open_file("steam://rungameid/764790") - else: - os.chdir(game_folder) - if args.url: - subprocess.Popen([MessengerWorld.settings.game_path, str(args.url)]) - else: - subprocess.Popen(MessengerWorld.settings.game_path) - os.chdir(working_directory) + if not args: + prompt = create_yes_no_popup("Launch Game", + "Mod installed and up to date. Would you like to launch the game now?", + launch) From 07664c4d543431676ce24844a0abd44b9e6bf31b Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Mon, 19 May 2025 18:48:31 -0400 Subject: [PATCH 143/199] SA2B: Logic Fixes (#5009) - Fixes Shadow's mission count being set by Sonic's mission count option - Fixes one small logic error on `Security Hall - 5` on Hard Logic difficulty - Removes stray character that was probably harmless --- worlds/sa2b/Missions.py | 2 +- worlds/sa2b/Rules.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/sa2b/Missions.py b/worlds/sa2b/Missions.py index 0c43834fb1..a5aac267a2 100644 --- a/worlds/sa2b/Missions.py +++ b/worlds/sa2b/Missions.py @@ -241,7 +241,7 @@ def get_mission_count_table(multiworld: MultiWorld, world: World, player: int): sonic_active_missions = min(sonic_active_missions, world.options.sonic_mission_count.value) tails_active_missions = min(tails_active_missions, world.options.tails_mission_count.value) knuckles_active_missions = min(knuckles_active_missions, world.options.knuckles_mission_count.value) - shadow_active_missions = min(shadow_active_missions, world.options.sonic_mission_count.value) + shadow_active_missions = min(shadow_active_missions, world.options.shadow_mission_count.value) eggman_active_missions = min(eggman_active_missions, world.options.eggman_mission_count.value) rouge_active_missions = min(rouge_active_missions, world.options.rouge_mission_count.value) kart_active_missions = min(kart_active_missions, world.options.kart_mission_count.value) diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py index 53edc686b6..9019a5b033 100644 --- a/worlds/sa2b/Rules.py +++ b/worlds/sa2b/Rules.py @@ -2257,7 +2257,7 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: add_rule_safe(multiworld, LocationName.weapons_bed_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule_safe(multiworld, LocationName.security_hall_5, player, - lambda state: state.has(ItemName.rouge_treasure_scope, player)) + lambda state: state.has(ItemName.rouge_pick_nails, player)) add_rule_safe(multiworld, LocationName.cosmic_wall_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) @@ -2971,7 +2971,7 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: add_rule(multiworld.get_location(LocationName.mission_street_lifebox_2, player), lambda state: (state.has(ItemName.tails_booster, player) and -- state.has(ItemName.tails_mystic_melody, player))) + state.has(ItemName.tails_mystic_melody, player))) add_rule(multiworld.get_location(LocationName.eternal_engine_lifebox_2, player), lambda state: state.has(ItemName.tails_booster, player)) From 9ac628f020bfa5999ce03208d8dcaa0528e4137c Mon Sep 17 00:00:00 2001 From: Seldom <38388947+Seldom-SE@users.noreply.github.com> Date: Tue, 20 May 2025 11:11:44 -0700 Subject: [PATCH 144/199] Terraria: remove 1.4.3-specific docs #5013 --- worlds/terraria/docs/setup_en.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/worlds/terraria/docs/setup_en.md b/worlds/terraria/docs/setup_en.md index 55a4df1df3..b415955337 100644 --- a/worlds/terraria/docs/setup_en.md +++ b/worlds/terraria/docs/setup_en.md @@ -10,13 +10,6 @@ and [tModLoader](https://store.steampowered.com/app/1281930/tModLoader/) on Stea 1. Subscribe to [the mod](https://steamcommunity.com/sharedfiles/filedetails/?id=2922217554) on Steam 2. Open tModLoader 3. Go to **Workshop -> Manage Mods** and enable the Archipelago mod - - If tModLoader states that you need version 1.4.3, follow the following steps - 1. Close tModLoader - 2. Right-Click tModLoader in Steam and select **Properties** - 3. Navigate to **Betas -> Beta Participation** - 4. Select **1.4.3-legacy - Legacy - Stable tModLoader for Terraria 1.4.3** - 5. Update tModLoader through Steam - 6. Open tModLoader and navigate back to the **Manage Mods** menu 4. tModLoader will say that it needs to refresh; exit this menu, and it will do this automatically 5. Once tModLoader finishes loading, the Archipelago mod is finished installing; you can now [connect to an Archipelago game](#joining-an-archipelago-game-in-terraria). From 485387ebbe93daa2bb8435568bcb8f7145a6d5ac Mon Sep 17 00:00:00 2001 From: SunCat Date: Tue, 20 May 2025 21:12:13 +0300 Subject: [PATCH 145/199] ChecksFinder: Update setup guide (#4973) * Update setup_en.md * Update worlds/checksfinder/docs/setup_en.md Co-authored-by: Scipio Wright * Update worlds/checksfinder/docs/setup_en.md Co-authored-by: Scipio Wright * Update worlds/checksfinder/docs/setup_en.md Co-authored-by: Scipio Wright --------- Co-authored-by: Scipio Wright --- worlds/checksfinder/docs/setup_en.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/worlds/checksfinder/docs/setup_en.md b/worlds/checksfinder/docs/setup_en.md index e15763ab31..fc1fb51848 100644 --- a/worlds/checksfinder/docs/setup_en.md +++ b/worlds/checksfinder/docs/setup_en.md @@ -3,7 +3,8 @@ ## Required Software - ChecksFinder from - the [Github releases Page for the game](https://github.com/jonloveslegos/ChecksFinder/releases) (latest version) + the [Github releases Page for the game](https://github.com/jonloveslegos/ChecksFinder/releases) (latest version), or + from the [itch.io Page for the game](https://suncat0.itch.io/checksfinder) (including web version) ## Configuring your YAML file @@ -18,13 +19,13 @@ You can customize your options by visiting the [ChecksFinder Player Options Page ## Joining a MultiWorld Game -1. Start ChecksFinder -2. Enter the following information: - - Enter the server url (starting from `wss://` for https connection like archipelago.gg, and starting from `ws://` for http connection and local multiserver) - - Enter server port - - Enter the name of the slot you wish to connect to - - Enter the room password (optional) - - Press `Play Online` to connect -3. Start playing! - -Game options and controls are described in the readme on the github repository for the game +1. Start ChecksFinder and press `Play Online` +2. Switch to the console window/tab +3. Enter the following information: + - Server url + - Server port + - The name of the slot you wish to connect to + - The room password (optional) +4. Press `Connect` to connect +5. Switch to the game window/tab +6. Start playing! From e0d31010664cc03e24900ccd7f4216c69647feac Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Tue, 20 May 2025 20:23:44 +0100 Subject: [PATCH 146/199] Core: Remove redundant reachable location counting in swap (#4990) `prev_state` starts off as a copy of `swap_state` and then `swap_state` collects `item_to_place`. Collecting an item must never reduce accessibility (otherwise generation breaks horribly), so it is guaranteed that `swap_state` will always be able to reach at least as many locations as `prev_state`, so `new_loc_count >= prev_loc_count` is always `True`. As a sideeffect of this change, this fixes generation of Pokemon Emerald with locally shuffled Badges/HMs when there are worlds with unconnected entrances present in the multiworld e.g. KH1. This is because this location counting did not respect `single_player_placement=True` and counted reachable locations across the entire multiworld. Fixes #4834 as a sideeffect of removing the redundant code. --- Fill.py | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/Fill.py b/Fill.py index ff59aa22cb..d0a42c07eb 100644 --- a/Fill.py +++ b/Fill.py @@ -138,32 +138,21 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati # to clean that up later, so there is a chance generation fails. if (not single_player_placement or location.player == item_to_place.player) \ and location.can_fill(swap_state, item_to_place, perform_access_check): + # Add this item to the existing placement, and + # add the old item to the back of the queue + spot_to_fill = placements.pop(i) - # Verify placing this item won't reduce available locations, which would be a useless swap. - prev_state = swap_state.copy() - prev_loc_count = len( - multiworld.get_reachable_locations(prev_state)) + swap_count += 1 + swapped_items[placed_item.player, placed_item.name, unsafe] = swap_count - swap_state.collect(item_to_place, True) - new_loc_count = len( - multiworld.get_reachable_locations(swap_state)) + reachable_items[placed_item.player].appendleft( + placed_item) + item_pool.append(placed_item) - if new_loc_count >= prev_loc_count: - # Add this item to the existing placement, and - # add the old item to the back of the queue - spot_to_fill = placements.pop(i) + # cleanup at the end to hopefully get better errors + cleanup_required = True - swap_count += 1 - swapped_items[placed_item.player, placed_item.name, unsafe] = swap_count - - reachable_items[placed_item.player].appendleft( - placed_item) - item_pool.append(placed_item) - - # cleanup at the end to hopefully get better errors - cleanup_required = True - - break + break # Item can't be placed here, restore original item location.item = placed_item From 9adbd4031f74ab5066e2993bdc317b0466cc8c25 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 20 May 2025 23:55:16 +0200 Subject: [PATCH 147/199] Core: prepare worlds.Files for APWorldContainer (#4331) Co-authored-by: Doug Hoskisson --- worlds/Files.py | 66 +++++++++++++++++++++++++++--------------- worlds/factorio/Mod.py | 2 +- worlds/kh2/OpenKH.py | 4 +-- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/worlds/Files.py b/worlds/Files.py index 69a88218ef..e451d08cd9 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -78,24 +78,15 @@ class InvalidDataError(Exception): class APContainer: - """A zipfile containing at least archipelago.json""" - version: int = container_version - compression_level: int = 9 - compression_method: int = zipfile.ZIP_DEFLATED - game: Optional[str] = None + """A zipfile containing at least archipelago.json, which contains a manifest json payload.""" + version: ClassVar[int] = container_version + compression_level: ClassVar[int] = 9 + compression_method: ClassVar[int] = zipfile.ZIP_DEFLATED - # instance attributes: path: Optional[str] - player: Optional[int] - player_name: str - server: str - def __init__(self, path: Optional[str] = None, player: Optional[int] = None, - player_name: str = "", server: str = ""): + def __init__(self, path: Optional[str] = None): self.path = path - self.player = player - self.player_name = player_name - self.server = server def write(self, file: Optional[Union[str, BinaryIO]] = None) -> None: zip_file = file if file else self.path @@ -135,31 +126,58 @@ class APContainer: message = f"{arg0} - " raise InvalidDataError(f"{message}This might be the incorrect world version for this file") from e - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: with opened_zipfile.open("archipelago.json", "r") as f: manifest = json.load(f) if manifest["compatible_version"] > self.version: raise Exception(f"File (version: {manifest['compatible_version']}) too new " f"for this handler (version: {self.version})") - self.player = manifest["player"] - self.server = manifest["server"] - self.player_name = manifest["player_name"] + return manifest def get_manifest(self) -> Dict[str, Any]: return { - "server": self.server, # allow immediate connection to server in multiworld. Empty string otherwise - "player": self.player, - "player_name": self.player_name, - "game": self.game, # minimum version of patch system expected for patching to be successful "compatible_version": 5, "version": container_version, } -class APPatch(APContainer): +class APPlayerContainer(APContainer): + """A zipfile containing at least archipelago.json meant for a player""" + game: ClassVar[Optional[str]] = None + + player: Optional[int] + player_name: str + server: str + + def __init__(self, path: Optional[str] = None, player: Optional[int] = None, + player_name: str = "", server: str = ""): + super().__init__(path) + self.player = player + self.player_name = player_name + self.server = server + + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + manifest = super().read_contents(opened_zipfile) + self.player = manifest["player"] + self.server = manifest["server"] + self.player_name = manifest["player_name"] + return manifest + + def get_manifest(self) -> Dict[str, Any]: + manifest = super().get_manifest() + manifest.update({ + "server": self.server, # allow immediate connection to server in multiworld. Empty string otherwise + "player": self.player, + "player_name": self.player_name, + "game": self.game, + }) + return manifest + + +class APPatch(APPlayerContainer): """ - An `APContainer` that represents a patch file. + An `APPlayerContainer` that represents a patch file. It includes the `procedure` key in the manifest to indicate that it is a patch. Your implementation should inherit from this if your output file diff --git a/worlds/factorio/Mod.py b/worlds/factorio/Mod.py index 8ea0b24c3d..eb305897f4 100644 --- a/worlds/factorio/Mod.py +++ b/worlds/factorio/Mod.py @@ -63,7 +63,7 @@ recipe_time_ranges = { } -class FactorioModFile(worlds.Files.APContainer): +class FactorioModFile(worlds.Files.APPlayerContainer): game = "Factorio" compression_method = zipfile.ZIP_DEFLATED # Factorio can't load LZMA archives writing_tasks: List[Callable[[], Tuple[str, Union[str, bytes]]]] diff --git a/worlds/kh2/OpenKH.py b/worlds/kh2/OpenKH.py index 7226525d0c..985c9913ab 100644 --- a/worlds/kh2/OpenKH.py +++ b/worlds/kh2/OpenKH.py @@ -8,10 +8,10 @@ import zipfile from .Items import item_dictionary_table from .Locations import all_locations, SoraLevels, exclusion_table from .XPValues import lvlStats, formExp, soraExp -from worlds.Files import APContainer +from worlds.Files import APPlayerContainer -class KH2Container(APContainer): +class KH2Container(APPlayerContainer): game: str = 'Kingdom Hearts 2' def __init__(self, patch_data: dict, base_path: str, output_directory: str, From feef0f484d2c5851bbbcabfe9e8a1a3cb2965aef Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 21 May 2025 00:52:00 +0200 Subject: [PATCH 148/199] Core: disable worlds_disabled (#5014) --- .github/labeler.yml | 1 - docs/CODEOWNERS | 11 +- docs/world maintainer.md | 4 +- setup.py | 4 - worlds_disabled/README.md | 13 -- worlds_disabled/oribf/Items.py | 10 -- worlds_disabled/oribf/Locations.py | 262 ----------------------------- worlds_disabled/oribf/Options.py | 12 -- worlds_disabled/oribf/README.md | 7 - worlds_disabled/oribf/Regions.py | 251 --------------------------- worlds_disabled/oribf/Rules.py | 59 ------- worlds_disabled/oribf/RulesData.py | 6 - worlds_disabled/oribf/Types.py | 5 - worlds_disabled/oribf/__init__.py | 71 -------- 14 files changed, 3 insertions(+), 713 deletions(-) delete mode 100644 worlds_disabled/README.md delete mode 100644 worlds_disabled/oribf/Items.py delete mode 100644 worlds_disabled/oribf/Locations.py delete mode 100644 worlds_disabled/oribf/Options.py delete mode 100644 worlds_disabled/oribf/README.md delete mode 100644 worlds_disabled/oribf/Regions.py delete mode 100644 worlds_disabled/oribf/Rules.py delete mode 100644 worlds_disabled/oribf/RulesData.py delete mode 100644 worlds_disabled/oribf/Types.py delete mode 100644 worlds_disabled/oribf/__init__.py diff --git a/.github/labeler.yml b/.github/labeler.yml index 2743104f41..d0aa61c8cf 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -21,7 +21,6 @@ - '!data/**' - '!.run/**' - '!.github/**' - - '!worlds_disabled/**' - '!worlds/**' - '!WebHost.py' - '!WebHostLib/**' diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index dee8a6fd25..b89f668c04 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -232,7 +232,7 @@ ## Active Unmaintained Worlds # The following worlds in this repo are currently unmaintained, but currently still work in core. If any update breaks -# compatibility, these worlds may be moved to `worlds_disabled`. If you are interested in stepping up as maintainer for +# compatibility, these worlds may be deleted. If you are interested in stepping up as maintainer for # any of these worlds, please review `/docs/world maintainer.md` documentation. # Final Fantasy (1) @@ -241,15 +241,6 @@ # Ocarina of Time # /worlds/oot/ -## Disabled Unmaintained Worlds - -# The following worlds in this repo are currently unmaintained and disabled as they do not work in core. If you are -# interested in stepping up as maintainer for any of these worlds, please review `/docs/world maintainer.md` -# documentation. - -# Ori and the Blind Forest -# /worlds_disabled/oribf/ - ################### ## Documentation ## ################### diff --git a/docs/world maintainer.md b/docs/world maintainer.md index 17aacdf8c2..6971a98227 100644 --- a/docs/world maintainer.md +++ b/docs/world maintainer.md @@ -65,5 +65,5 @@ date, voting members and final result in the commit message. ## Handling of Unmaintained Worlds -As long as worlds are known to work for the most part, they can stay included. Once a world becomes broken it shall be -moved from `worlds/` to `worlds_disabled/`. +As long as worlds are known to work for the most part, they can stay included. Once the world becomes broken, it shall +be deleted. diff --git a/setup.py b/setup.py index 2654cc69da..ccca46390b 100644 --- a/setup.py +++ b/setup.py @@ -373,10 +373,6 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): assert not non_apworlds - set(AutoWorldRegister.world_types), \ f"Unknown world {non_apworlds - set(AutoWorldRegister.world_types)} designated for .apworld" folders_to_remove: list[str] = [] - disabled_worlds_folder = "worlds_disabled" - for entry in os.listdir(disabled_worlds_folder): - if os.path.isdir(os.path.join(disabled_worlds_folder, entry)): - folders_to_remove.append(entry) generate_yaml_templates(self.buildfolder / "Players" / "Templates", False) for worldname, worldtype in AutoWorldRegister.world_types.items(): if worldname not in non_apworlds: diff --git a/worlds_disabled/README.md b/worlds_disabled/README.md deleted file mode 100644 index a7bffe222b..0000000000 --- a/worlds_disabled/README.md +++ /dev/null @@ -1,13 +0,0 @@ -## Folder Purpose - -This folder is for already merged worlds that are unmaintained and currently broken. If you are interested in fixing and -stepping up as maintainer for any of these worlds, please review the [world maintainer](/docs/world%20maintainer.md) -documentation. - -## Information for Disabled Worlds - -For each disabled world, a README file can be found detailing when the world was disabled and the reasons that it -was disabled. In order to be considered for reactivation, these concerns should be handled at a bare minimum. However, -each world may have additional issues that also need to be handled, such as deprecated API calls or missing components. - - diff --git a/worlds_disabled/oribf/Items.py b/worlds_disabled/oribf/Items.py deleted file mode 100644 index 788b802de3..0000000000 --- a/worlds_disabled/oribf/Items.py +++ /dev/null @@ -1,10 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -from typing import Dict - -item_table: Dict[str, int] = \ - {'EX100': 262144, 'AC': 262145, 'Bash': 262146, 'HC': 262147, 'Plant': 262148, 'MapStone': 262149, 'ChargeFlame': 262150, 'ChargeJump': 262151, 'Climb': 262152, 'MS': 262153, 'Dash': 262154, 'EC': 262155, 'EX200': 262156, 'DoubleJump': 262157, 'EX15': 262158, 'Wind': 262159, 'KS': 262160, 'Water': 262161, 'Glide': 262162, 'Grenade': 262163, 'ForlornKey': 262164, 'CS': 262165, 'Stomp': 262166, 'HoruKey': 262167, 'WallJump': 262168, 'GinsoKey': 262169} - -default_pool: Dict[str, int] = \ - {'EX100': 53, 'AC': 33, 'Bash': 1, 'HC': 12, 'Plant': 24, 'MapStone': 9, 'ChargeFlame': 1, 'ChargeJump': 1, 'Climb': 1, 'MS': 9, 'Dash': 1, 'EC': 14, 'EX200': 29, 'DoubleJump': 1, 'EX15': 6, 'Wind': 1, 'KS': 40, 'Water': 1, 'Glide': 1, 'Grenade': 1, 'ForlornKey': 1, 'CS': 8, 'Stomp': 1, 'HoruKey': 1, 'WallJump': 1, 'GinsoKey': 1} \ No newline at end of file diff --git a/worlds_disabled/oribf/Locations.py b/worlds_disabled/oribf/Locations.py deleted file mode 100644 index 1522fb557e..0000000000 --- a/worlds_disabled/oribf/Locations.py +++ /dev/null @@ -1,262 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -from .Types import * - -locations_data = \ - {'AboveChargeFlameTreeExp': Location(code=262144, vanilla_item='EX100'), - 'AboveChargeJumpAbilityCell': Location(code=262145, vanilla_item='AC'), - 'AboveFourthHealth': Location(code=262146, vanilla_item='AC'), - 'AboveGrottoTeleporterExp': Location(code=262147, vanilla_item='EX100'), - 'BashAreaExp': Location(code=262148, vanilla_item='EX100'), - 'BashSkillTree': Location(code=262149, vanilla_item='SKBash'), - 'BelowGrottoTeleporterHealthCell': Location(code=262150, vanilla_item='HC'), - 'BelowGrottoTeleporterPlant': Location(code=262151, vanilla_item='Plant'), - 'BlackrootBoulderExp': Location(code=262152, vanilla_item='EX100'), - 'BlackrootMap': Location(code=262153, vanilla_item='MapStone'), - 'BlackrootTeleporterHealthCell': Location(code=262154, vanilla_item='HC'), - 'ChargeFlameAreaExp': Location(code=262155, vanilla_item='EX100'), - 'ChargeFlameAreaPlant': Location(code=262156, vanilla_item='Plant'), - 'ChargeFlameSkillTree': Location(code=262157, vanilla_item='SKChargeFlame'), - 'ChargeJumpSkillTree': Location(code=262158, vanilla_item='SKChargeJump'), - 'ClimbSkillTree': Location(code=262159, vanilla_item='SKClimb'), - 'DashAreaAbilityCell': Location(code=262160, vanilla_item='AC'), - 'DashAreaMapstone': Location(code=262161, vanilla_item='MS'), - 'DashAreaOrbRoomExp': Location(code=262162, vanilla_item='EX100'), - 'DashAreaPlant': Location(code=262163, vanilla_item='Plant'), - 'DashAreaRoofExp': Location(code=262164, vanilla_item='EX100'), - 'DashSkillTree': Location(code=262165, vanilla_item='SKDash'), - 'DeathGauntletEnergyCell': Location(code=262166, vanilla_item='EC'), - 'DeathGauntletExp': Location(code=262167, vanilla_item='EX100'), - 'DeathGauntletRoofHealthCell': Location(code=262168, vanilla_item='HC'), - 'DeathGauntletRoofPlant': Location(code=262169, vanilla_item='Plant'), - 'DeathGauntletStompSwim': Location(code=262170, vanilla_item='EX200'), - 'DeathGauntletSwimEnergyDoor': Location(code=262171, vanilla_item='AC'), - 'DoorWarpExp': Location(code=262172, vanilla_item='EX200'), - 'DoubleJumpAreaExp': Location(code=262173, vanilla_item='EX100'), - 'DoubleJumpSkillTree': Location(code=262174, vanilla_item='SKDoubleJump'), - 'FarLeftGumoHideoutExp': Location(code=262175, vanilla_item='EX100'), - 'FirstPickup': Location(code=262176, vanilla_item='EX15'), - 'ForlornEntranceExp': Location(code=262177, vanilla_item='EX200'), - 'ForlornEscape': Location(code=262178, vanilla_item='EVWind'), - 'ForlornHiddenSpiderExp': Location(code=262179, vanilla_item='EX100'), - 'ForlornKeystone1': Location(code=262180, vanilla_item='KS'), - 'ForlornKeystone2': Location(code=262181, vanilla_item='KS'), - 'ForlornKeystone3': Location(code=262182, vanilla_item='KS'), - 'ForlornKeystone4': Location(code=262183, vanilla_item='KS'), - 'ForlornMap': Location(code=262184, vanilla_item='MapStone'), - 'ForlornPlant': Location(code=262185, vanilla_item='Plant'), - 'FourthHealthCell': Location(code=262186, vanilla_item='HC'), - 'FronkeyFight': Location(code=262187, vanilla_item='EX15'), - 'FronkeyWalkRoof': Location(code=262188, vanilla_item='EX200'), - 'GinsoEscapeExit': Location(code=262189, vanilla_item='EVWater'), - 'GinsoEscapeHangingExp': Location(code=262190, vanilla_item='EX100'), - 'GinsoEscapeJumpPadExp': Location(code=262191, vanilla_item='EX100'), - 'GinsoEscapeProjectileExp': Location(code=262192, vanilla_item='EX100'), - 'GinsoEscapeSpiderExp': Location(code=262193, vanilla_item='EX200'), - 'GladesGrenadePool': Location(code=262194, vanilla_item='EX200'), - 'GladesGrenadeTree': Location(code=262195, vanilla_item='AC'), - 'GladesKeystone1': Location(code=262196, vanilla_item='KS'), - 'GladesKeystone2': Location(code=262197, vanilla_item='KS'), - 'GladesLaser': Location(code=262198, vanilla_item='EC'), - 'GladesLaserGrenade': Location(code=262199, vanilla_item='AC'), - 'GladesMainPool': Location(code=262200, vanilla_item='EX100'), - 'GladesMainPoolDeep': Location(code=262201, vanilla_item='EC'), - 'GladesMap': Location(code=262202, vanilla_item='MapStone'), - 'GladesMapKeystone': Location(code=262203, vanilla_item='KS'), - 'GlideSkillFeather': Location(code=262204, vanilla_item='SKGlide'), - 'GrenadeAreaAbilityCell': Location(code=262205, vanilla_item='AC'), - 'GrenadeAreaExp': Location(code=262206, vanilla_item='EX100'), - 'GrenadeSkillTree': Location(code=262207, vanilla_item='SKGrenade'), - 'GrottoEnergyDoorHealthCell': Location(code=262208, vanilla_item='HC'), - 'GrottoEnergyDoorSwim': Location(code=262209, vanilla_item='EX100'), - 'GrottoHideoutFallAbilityCell': Location(code=262210, vanilla_item='AC'), - 'GrottoLasersRoofExp': Location(code=262211, vanilla_item='EX100'), - 'GrottoSwampDrainAccessExp': Location(code=262212, vanilla_item='EX100'), - 'GrottoSwampDrainAccessPlant': Location(code=262213, vanilla_item='Plant'), - 'GroveAboveSpiderWaterEnergyCell': Location(code=262214, vanilla_item='EC'), - 'GroveAboveSpiderWaterExp': Location(code=262215, vanilla_item='EX200'), - 'GroveAboveSpiderWaterHealthCell': Location(code=262216, vanilla_item='HC'), - 'GroveSpiderWaterSwim': Location(code=262217, vanilla_item='EX100'), - 'GroveWaterStompAbilityCell': Location(code=262218, vanilla_item='AC'), - 'GumoHideoutCrusherExp': Location(code=262219, vanilla_item='EX100'), - 'GumoHideoutCrusherKeystone': Location(code=262220, vanilla_item='KS'), - 'GumoHideoutEnergyCell': Location(code=262221, vanilla_item='EC'), - 'GumoHideoutLeftHangingExp': Location(code=262222, vanilla_item='EX15'), - 'GumoHideoutMap': Location(code=262223, vanilla_item='MapStone'), - 'GumoHideoutMapstone': Location(code=262224, vanilla_item='MS'), - 'GumoHideoutMiniboss': Location(code=262225, vanilla_item='KS'), - 'GumoHideoutRedirectAbilityCell': Location(code=262226, vanilla_item='AC'), - 'GumoHideoutRedirectEnergyCell': Location(code=262227, vanilla_item='EC'), - 'GumoHideoutRedirectExp': Location(code=262228, vanilla_item='EX200'), - 'GumoHideoutRedirectPlant': Location(code=262229, vanilla_item='Plant'), - 'GumoHideoutRightHangingExp': Location(code=262230, vanilla_item='EX15'), - 'GumoHideoutRockfallExp': Location(code=262231, vanilla_item='EX100'), - 'GumonSeal': Location(code=262232, vanilla_item='EVForlornKey'), - 'HollowGroveMap': Location(code=262233, vanilla_item='MapStone'), - 'HollowGroveMapPlant': Location(code=262234, vanilla_item='Plant'), - 'HollowGroveMapstone': Location(code=262235, vanilla_item='MS'), - 'HollowGroveTreeAbilityCell': Location(code=262236, vanilla_item='AC'), - 'HollowGroveTreePlant': Location(code=262237, vanilla_item='Plant'), - 'HoruFieldsAbilityCell': Location(code=262238, vanilla_item='AC'), - 'HoruFieldsEnergyCell': Location(code=262239, vanilla_item='EC'), - 'HoruFieldsHealthCell': Location(code=262240, vanilla_item='HC'), - 'HoruFieldsHiddenExp': Location(code=262241, vanilla_item='EX200'), - 'HoruFieldsPlant': Location(code=262242, vanilla_item='Plant'), - 'HoruL1': Location(code=262243, vanilla_item='CS'), - 'HoruL2': Location(code=262244, vanilla_item='CS'), - 'HoruL3': Location(code=262245, vanilla_item='CS'), - 'HoruL4': Location(code=262246, vanilla_item='CS'), - 'HoruL4ChaseExp': Location(code=262247, vanilla_item='EX200'), - 'HoruL4LowerExp': Location(code=262248, vanilla_item='EX200'), - 'HoruLavaDrainedLeftExp': Location(code=262249, vanilla_item='EX200'), - 'HoruLavaDrainedRightExp': Location(code=262250, vanilla_item='EX200'), - 'HoruMap': Location(code=262251, vanilla_item='MapStone'), - 'HoruR1': Location(code=262252, vanilla_item='CS'), - 'HoruR1EnergyCell': Location(code=262253, vanilla_item='EC'), - 'HoruR1HangingExp': Location(code=262254, vanilla_item='EX100'), - 'HoruR1Mapstone': Location(code=262255, vanilla_item='MS'), - 'HoruR2': Location(code=262256, vanilla_item='CS'), - 'HoruR3': Location(code=262257, vanilla_item='CS'), - 'HoruR3Plant': Location(code=262258, vanilla_item='Plant'), - 'HoruR4': Location(code=262259, vanilla_item='CS'), - 'HoruR4DrainedExp': Location(code=262260, vanilla_item='EX200'), - 'HoruR4LaserExp': Location(code=262261, vanilla_item='EX200'), - 'HoruR4StompExp': Location(code=262262, vanilla_item='EX200'), - 'HoruTeleporterExp': Location(code=262263, vanilla_item='EX200'), - 'IcelessExp': Location(code=262264, vanilla_item='EX100'), - 'InnerSwampDrainExp': Location(code=262265, vanilla_item='EX100'), - 'InnerSwampEnergyCell': Location(code=262266, vanilla_item='EC'), - 'InnerSwampHiddenSwimExp': Location(code=262267, vanilla_item='EX100'), - 'InnerSwampStompExp': Location(code=262268, vanilla_item='EX100'), - 'InnerSwampSwimLeftKeystone': Location(code=262269, vanilla_item='KS'), - 'InnerSwampSwimMapstone': Location(code=262270, vanilla_item='MS'), - 'InnerSwampSwimRightKeystone': Location(code=262271, vanilla_item='KS'), - 'KuroPerchExp': Location(code=262272, vanilla_item='EX200'), - 'LeftGladesExp': Location(code=262273, vanilla_item='EX15'), - 'LeftGladesHiddenExp': Location(code=262274, vanilla_item='EX15'), - 'LeftGladesKeystone': Location(code=262275, vanilla_item='KS'), - 'LeftGladesMapstone': Location(code=262276, vanilla_item='MS'), - 'LeftGrottoTeleporterExp': Location(code=262277, vanilla_item='EX200'), - 'LeftGumoHideoutExp': Location(code=262278, vanilla_item='EX100'), - 'LeftGumoHideoutHealthCell': Location(code=262279, vanilla_item='HC'), - 'LeftGumoHideoutLowerPlant': Location(code=262280, vanilla_item='Plant'), - 'LeftGumoHideoutSwim': Location(code=262281, vanilla_item='EX100'), - 'LeftGumoHideoutUpperPlant': Location(code=262282, vanilla_item='Plant'), - 'LeftSorrowAbilityCell': Location(code=262283, vanilla_item='AC'), - 'LeftSorrowEnergyCell': Location(code=262284, vanilla_item='EC'), - 'LeftSorrowGrenade': Location(code=262285, vanilla_item='EX200'), - 'LeftSorrowKeystone1': Location(code=262286, vanilla_item='KS'), - 'LeftSorrowKeystone2': Location(code=262287, vanilla_item='KS'), - 'LeftSorrowKeystone3': Location(code=262288, vanilla_item='KS'), - 'LeftSorrowKeystone4': Location(code=262289, vanilla_item='KS'), - 'LeftSorrowPlant': Location(code=262290, vanilla_item='Plant'), - 'LostGroveAbilityCell': Location(code=262291, vanilla_item='AC'), - 'LostGroveHiddenExp': Location(code=262292, vanilla_item='EX100'), - 'LostGroveLongSwim': Location(code=262293, vanilla_item='AC'), - 'LostGroveTeleporter': Location(code=262294, vanilla_item='EX100'), - 'LowerBlackrootAbilityCell': Location(code=262295, vanilla_item='AC'), - 'LowerBlackrootGrenadeThrow': Location(code=262296, vanilla_item='AC'), - 'LowerBlackrootLaserAbilityCell': Location(code=262297, vanilla_item='AC'), - 'LowerBlackrootLaserExp': Location(code=262298, vanilla_item='EX100'), - 'LowerGinsoHiddenExp': Location(code=262299, vanilla_item='EX100'), - 'LowerGinsoKeystone1': Location(code=262300, vanilla_item='KS'), - 'LowerGinsoKeystone2': Location(code=262301, vanilla_item='KS'), - 'LowerGinsoKeystone3': Location(code=262302, vanilla_item='KS'), - 'LowerGinsoKeystone4': Location(code=262303, vanilla_item='KS'), - 'LowerGinsoPlant': Location(code=262304, vanilla_item='Plant'), - 'LowerValleyExp': Location(code=262305, vanilla_item='EX100'), - 'LowerValleyMapstone': Location(code=262306, vanilla_item='MS'), - 'MistyAbilityCell': Location(code=262307, vanilla_item='AC'), - 'MistyEntranceStompExp': Location(code=262308, vanilla_item='EX100'), - 'MistyEntranceTreeExp': Location(code=262309, vanilla_item='EX100'), - 'MistyFrogNookExp': Location(code=262310, vanilla_item='EX100'), - 'MistyGrenade': Location(code=262311, vanilla_item='EX200'), - 'MistyKeystone1': Location(code=262312, vanilla_item='KS'), - 'MistyKeystone2': Location(code=262313, vanilla_item='KS'), - 'MistyKeystone3': Location(code=262314, vanilla_item='KS'), - 'MistyKeystone4': Location(code=262315, vanilla_item='KS'), - 'MistyMortarCorridorHiddenExp': Location(code=262316, vanilla_item='EX100'), - 'MistyMortarCorridorUpperExp': Location(code=262317, vanilla_item='EX100'), - 'MistyPlant': Location(code=262318, vanilla_item='Plant'), - 'MistyPostClimbAboveSpikePit': Location(code=262319, vanilla_item='EX200'), - 'MistyPostClimbSpikeCave': Location(code=262320, vanilla_item='EX100'), - 'MoonGrottoStompPlant': Location(code=262321, vanilla_item='Plant'), - 'OuterSwampAbilityCell': Location(code=262322, vanilla_item='AC'), - 'OuterSwampGrenadeExp': Location(code=262323, vanilla_item='EX200'), - 'OuterSwampHealthCell': Location(code=262324, vanilla_item='HC'), - 'OuterSwampMortarAbilityCell': Location(code=262325, vanilla_item='AC'), - 'OuterSwampMortarPlant': Location(code=262326, vanilla_item='Plant'), - 'OuterSwampStompExp': Location(code=262327, vanilla_item='EX100'), - 'OutsideForlornCliffExp': Location(code=262328, vanilla_item='EX200'), - 'OutsideForlornTreeExp': Location(code=262329, vanilla_item='EX100'), - 'OutsideForlornWaterExp': Location(code=262330, vanilla_item='EX100'), - 'RazielNo': Location(code=262331, vanilla_item='EX100'), - 'RightForlornHealthCell': Location(code=262332, vanilla_item='HC'), - 'RightForlornPlant': Location(code=262333, vanilla_item='Plant'), - 'SorrowEntranceAbilityCell': Location(code=262334, vanilla_item='AC'), - 'SorrowHealthCell': Location(code=262335, vanilla_item='HC'), - 'SorrowHiddenKeystone': Location(code=262336, vanilla_item='KS'), - 'SorrowLowerLeftKeystone': Location(code=262337, vanilla_item='KS'), - 'SorrowMainShaftKeystone': Location(code=262338, vanilla_item='KS'), - 'SorrowMap': Location(code=262339, vanilla_item='MapStone'), - 'SorrowMapstone': Location(code=262340, vanilla_item='MS'), - 'SorrowSpikeKeystone': Location(code=262341, vanilla_item='KS'), - 'SpiderSacEnergyCell': Location(code=262342, vanilla_item='EC'), - 'SpiderSacEnergyDoor': Location(code=262343, vanilla_item='AC'), - 'SpiderSacGrenadeDoor': Location(code=262344, vanilla_item='AC'), - 'SpiderSacHealthCell': Location(code=262345, vanilla_item='HC'), - 'SpiritCavernsAbilityCell': Location(code=262346, vanilla_item='AC'), - 'SpiritCavernsKeystone1': Location(code=262347, vanilla_item='KS'), - 'SpiritCavernsKeystone2': Location(code=262348, vanilla_item='KS'), - 'SpiritCavernsTopLeftKeystone': Location(code=262349, vanilla_item='KS'), - 'SpiritCavernsTopRightKeystone': Location(code=262350, vanilla_item='KS'), - 'StompAreaExp': Location(code=262351, vanilla_item='EX100'), - 'StompAreaGrenadeExp': Location(code=262352, vanilla_item='EX200'), - 'StompAreaRoofExp': Location(code=262353, vanilla_item='EX200'), - 'StompSkillTree': Location(code=262354, vanilla_item='SKStomp'), - 'Sunstone': Location(code=262355, vanilla_item='EVHoruKey'), - 'SunstonePlant': Location(code=262356, vanilla_item='Plant'), - 'SwampEntranceAbilityCell': Location(code=262357, vanilla_item='AC'), - 'SwampEntrancePlant': Location(code=262358, vanilla_item='Plant'), - 'SwampEntranceSwim': Location(code=262359, vanilla_item='EX200'), - 'SwampMap': Location(code=262360, vanilla_item='MapStone'), - 'SwampTeleporterAbilityCell': Location(code=262361, vanilla_item='AC'), - 'TopGinsoLeftLowerExp': Location(code=262362, vanilla_item='EX100'), - 'TopGinsoLeftUpperExp': Location(code=262363, vanilla_item='EX100'), - 'TopGinsoRightPlant': Location(code=262364, vanilla_item='Plant'), - 'UpperGinsoEnergyCell': Location(code=262365, vanilla_item='EC'), - 'UpperGinsoLowerKeystone': Location(code=262366, vanilla_item='KS'), - 'UpperGinsoRedirectLowerExp': Location(code=262367, vanilla_item='EX100'), - 'UpperGinsoRedirectUpperExp': Location(code=262368, vanilla_item='EX100'), - 'UpperGinsoRightKeystone': Location(code=262369, vanilla_item='KS'), - 'UpperGinsoUpperLeftKeystone': Location(code=262370, vanilla_item='KS'), - 'UpperGinsoUpperRightKeystone': Location(code=262371, vanilla_item='KS'), - 'UpperSorrowFarLeftKeystone': Location(code=262372, vanilla_item='KS'), - 'UpperSorrowFarRightKeystone': Location(code=262373, vanilla_item='KS'), - 'UpperSorrowLeftKeystone': Location(code=262374, vanilla_item='KS'), - 'UpperSorrowRightKeystone': Location(code=262375, vanilla_item='KS'), - 'UpperSorrowSpikeExp': Location(code=262376, vanilla_item='EX100'), - 'ValleyEntryAbilityCell': Location(code=262377, vanilla_item='AC'), - 'ValleyEntryGrenadeLongSwim': Location(code=262378, vanilla_item='EC'), - 'ValleyEntryTreeExp': Location(code=262379, vanilla_item='EX100'), - 'ValleyEntryTreePlant': Location(code=262380, vanilla_item='Plant'), - 'ValleyForlornApproachGrenade': Location(code=262381, vanilla_item='AC'), - 'ValleyForlornApproachMapstone': Location(code=262382, vanilla_item='MS'), - 'ValleyMainFACS': Location(code=262383, vanilla_item='AC'), - 'ValleyMainPlant': Location(code=262384, vanilla_item='Plant'), - 'ValleyMap': Location(code=262385, vanilla_item='MapStone'), - 'ValleyRightBirdStompCell': Location(code=262386, vanilla_item='AC'), - 'ValleyRightExp': Location(code=262387, vanilla_item='EX100'), - 'ValleyRightFastStomplessCell': Location(code=262388, vanilla_item='AC'), - 'ValleyRightSwimExp': Location(code=262389, vanilla_item='EX100'), - 'ValleyThreeBirdAbilityCell': Location(code=262390, vanilla_item='AC'), - 'WallJumpAreaEnergyCell': Location(code=262391, vanilla_item='EC'), - 'WallJumpAreaExp': Location(code=262392, vanilla_item='EX200'), - 'WallJumpSkillTree': Location(code=262393, vanilla_item='SKWallJump'), - 'WaterVein': Location(code=262394, vanilla_item='EVGinsoKey'), - 'WilhelmExp': Location(code=262395, vanilla_item='EX200')} - - - -lookup_name_to_id = {location_name: location_data.code for location_name, location_data in locations_data.items()} \ No newline at end of file diff --git a/worlds_disabled/oribf/Options.py b/worlds_disabled/oribf/Options.py deleted file mode 100644 index ac6808aa8d..0000000000 --- a/worlds_disabled/oribf/Options.py +++ /dev/null @@ -1,12 +0,0 @@ -from .RulesData import location_rules -from Options import Toggle - - -options = { - "open" : Toggle, - "openworld": Toggle -} - -for logic_set in location_rules: - if logic_set != "casual-core": - options[logic_set.replace("-", "_")] = Toggle diff --git a/worlds_disabled/oribf/README.md b/worlds_disabled/oribf/README.md deleted file mode 100644 index 0c78c23bea..0000000000 --- a/worlds_disabled/oribf/README.md +++ /dev/null @@ -1,7 +0,0 @@ -### Ori and the Blind Forest - -This world was disabled for the following reasons: - -* Missing client -* Unmaintained -* Outdated, fails tests as of Jun 29, 2023 diff --git a/worlds_disabled/oribf/Regions.py b/worlds_disabled/oribf/Regions.py deleted file mode 100644 index c86608732c..0000000000 --- a/worlds_disabled/oribf/Regions.py +++ /dev/null @@ -1,251 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -locations_by_region = \ - {'AboveChargeJumpArea': {'AboveChargeJumpAbilityCell'}, 'BashTree': {'BashAreaExp', 'BashSkillTree'}, - 'BashTreeDoorClosed': set(), 'BashTreeDoorOpened': set(), 'BelowSunstoneArea': set(), - 'BlackrootDarknessRoom': {'DashAreaOrbRoomExp', 'DashAreaAbilityCell', 'DashAreaRoofExp'}, - 'BlackrootGrottoConnection': {'BlackrootBoulderExp', 'BlackrootMap', 'BlackrootTeleporterHealthCell'}, - 'ChargeFlameAreaPlantAccess': {'ChargeFlameAreaPlant'}, 'ChargeFlameAreaStump': set(), - 'ChargeFlameSkillTreeChamber': {'ChargeFlameSkillTree'}, 'ChargeJumpArea': {'ChargeJumpSkillTree'}, - 'ChargeJumpDoor': set(), 'ChargeJumpDoorOpen': set(), - 'ChargeJumpDoorOpenLeft': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone', - 'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'}, - 'DashArea': {'DashAreaMapstone', 'DashSkillTree'}, 'DashPlantAccess': {'DashAreaPlant'}, - 'DeathGauntlet': {'DeathGauntletEnergyCell', 'DeathGauntletStompSwim', 'DeathGauntletExp'}, - 'DeathGauntletDoor': set(), 'DeathGauntletDoorOpened': set(), 'DeathGauntletMoat': {'DeathGauntletSwimEnergyDoor'}, - 'DeathGauntletRoof': {'DeathGauntletRoofHealthCell'}, 'DeathGauntletRoofPlantAccess': {'DeathGauntletRoofPlant'}, - 'DoubleJumpKeyDoor': set(), 'DoubleJumpKeyDoorOpened': {'DoubleJumpSkillTree', 'DoubleJumpAreaExp'}, - 'ForlornGravityRoom': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1'}, - 'ForlornInnerDoor': {'ForlornEntranceExp'}, 'ForlornKeyDoor': set(), 'ForlornLaserRoom': {'ForlornEscape'}, - 'ForlornMapArea': {'ForlornMap', 'ForlornKeystone4'}, - 'ForlornOrbPossession': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1', 'ForlornKeystone4', - 'ForlornKeystone3'}, 'ForlornOuterDoor': set(), 'ForlornPlantAccess': {'ForlornPlant'}, - 'ForlornStompDoor': set(), 'ForlornTeleporter': {'ForlornKeystone3'}, 'GinsoEscape': set(), - 'GinsoEscapeComplete': {'GinsoEscapeExit', 'GinsoEscapeSpiderExp', 'GinsoEscapeProjectileExp', - 'GinsoEscapeJumpPadExp', 'GinsoEscapeHangingExp'}, 'GinsoInnerDoor': set(), - 'GinsoMiniBossDoor': {'LowerGinsoKeystone2', 'LowerGinsoKeystone1', 'LowerGinsoKeystone3', 'LowerGinsoKeystone4'}, - 'GinsoOuterDoor': set(), 'GinsoTeleporter': set(), 'GladesLaserArea': {'GladesLaserGrenade', 'GladesLaser'}, - 'GladesMain': {'FourthHealthCell', 'GladesMap', 'GladesMapKeystone'}, 'GladesMainAttic': {'AboveFourthHealth'}, - 'GrenadeArea': {'GrenadeAreaAbilityCell', 'GrenadeAreaExp', 'GrenadeSkillTree'}, 'GrenadeAreaAccess': set(), - 'GumoHideout': {'GumoHideoutMapstone', 'GumoHideoutCrusherExp', 'GumoHideoutRightHangingExp', - 'GumoHideoutEnergyCell', 'GumoHideoutCrusherKeystone', 'GumoHideoutMap', 'GumoHideoutMiniboss'}, - 'GumoHideoutRedirectArea': {'GumoHideoutRedirectAbilityCell', 'GumoHideoutRedirectPlant'}, - 'GumoHideoutRedirectEnergyVault': {'GumoHideoutRedirectExp', 'GumoHideoutRedirectEnergyCell'}, - 'HollowGrove': {'GroveWaterStompAbilityCell', 'HollowGroveTreeAbilityCell', 'HollowGroveMapPlant', - 'HoruFieldsHealthCell', 'HollowGroveMap', 'SwampTeleporterAbilityCell', 'HollowGroveMapstone', - 'HollowGroveTreePlant'}, 'HoruBasement': {'DoorWarpExp'}, 'HoruEscapeInnerDoor': set(), - 'HoruEscapeOuterDoor': set(), 'HoruFields': set(), - 'HoruFieldsPushBlock': {'HoruFieldsEnergyCell', 'HoruFieldsPlant', 'HoruFieldsHiddenExp', 'HoruFieldsAbilityCell'}, - 'HoruInnerDoor': {'HoruLavaDrainedLeftExp', 'HoruLavaDrainedRightExp'}, - 'HoruL4CutscenePeg': {'HoruL4', 'HoruL4LowerExp'}, 'HoruL4LavaChasePeg': {'HoruL4ChaseExp'}, - 'HoruMapLedge': {'HoruMap'}, 'HoruOuterDoor': set(), 'HoruR1CutsceneTrigger': {'HoruR1EnergyCell', 'HoruR1'}, - 'HoruR1MapstoneSecret': {'HoruR1Mapstone'}, 'HoruR3CutsceneTrigger': {'HoruR3'}, 'HoruR3ElevatorLever': set(), - 'HoruR3PlantCove': {'HoruR3Plant'}, 'HoruR4CutsceneTrigger': {'HoruR4DrainedExp', 'HoruR4'}, - 'HoruR4PuzzleEntrance': {'HoruR4LaserExp'}, 'HoruR4StompHideout': {'HoruR4StompExp'}, - 'HoruTeleporter': {'HoruTeleporterExp'}, 'Iceless': {'IcelessExp'}, 'InnerSwampAboveDrainArea': set(), - 'InnerSwampDrainBroken': {'InnerSwampDrainExp'}, 'InnerSwampSkyArea': {'InnerSwampEnergyCell'}, 'L1': {'HoruL1'}, - 'L1InnerDoor': set(), 'L1OuterDoor': set(), 'L2': {'HoruL2'}, 'L2InnerDoor': set(), 'L2OuterDoor': set(), - 'L3': {'HoruL3'}, 'L3InnerDoor': set(), 'L3OuterDoor': set(), 'L4': set(), 'L4InnerDoor': set(), - 'L4OuterDoor': {'HoruLavaDrainedLeftExp'}, - 'LeftGlades': {'WallJumpAreaEnergyCell', 'LeftGladesHiddenExp', 'WallJumpAreaExp', 'WallJumpSkillTree'}, - 'LeftGumoHideout': {'FarLeftGumoHideoutExp', 'LeftGumoHideoutUpperPlant'}, - 'LeftSorrow': {'LeftSorrowAbilityCell', 'LeftSorrowPlant', 'LeftSorrowGrenade'}, - 'LeftSorrowKeystones': {'LeftSorrowEnergyCell', 'LeftSorrowKeystone1', 'LeftSorrowKeystone2', - 'LeftSorrowKeystone4', 'LeftSorrowKeystone3'}, 'LeftSorrowLowerDoor': set(), - 'LeftSorrowMiddleDoor': set(), 'LostGrove': {'LostGroveLongSwim'}, - 'LostGroveExit': {'LostGroveTeleporter', 'LostGroveAbilityCell', 'LostGroveHiddenExp'}, - 'LowerBlackroot': {'LowerBlackrootAbilityCell', 'LowerBlackrootLaserAbilityCell', 'LowerBlackrootGrenadeThrow', - 'LowerBlackrootLaserExp'}, 'LowerChargeFlameArea': {'ChargeFlameAreaExp'}, - 'LowerGinsoTree': {'LowerGinsoPlant', 'LowerGinsoHiddenExp'}, - 'LowerLeftGumoHideout': {'LeftGumoHideoutSwim', 'LeftGumoHideoutHealthCell', 'LeftGumoHideoutExp', - 'GumoHideoutLeftHangingExp', 'GumoHideoutRightHangingExp', 'LeftGumoHideoutLowerPlant'}, - 'LowerSorrow': {'SorrowLowerLeftKeystone', 'SorrowHiddenKeystone', 'SorrowEntranceAbilityCell', 'SorrowHealthCell', - 'SorrowSpikeKeystone'}, - 'LowerSpiritCaverns': {'SpiritCavernsKeystone1', 'SpiritCavernsAbilityCell', 'SpiritCavernsKeystone2'}, - 'LowerValley': {'LowerValleyExp', 'LowerValleyMapstone', 'KuroPerchExp'}, - 'LowerValleyPlantApproach': {'ValleyMainPlant'}, 'MidSpiritCaverns': set(), 'MiddleSorrow': set(), - 'MistyAbove200xp': {'MistyGrenade'}, 'MistyBeforeDocks': set(), 'MistyBeforeMiniBoss': set(), - 'MistyEntrance': {'MistyEntranceStompExp', 'MistyEntranceTreeExp'}, 'MistyKeystone3Ledge': {'MistyKeystone3'}, - 'MistyKeystone4Ledge': {'MistyKeystone4'}, 'MistyMortarSpikeCave': {'MistyPostClimbAboveSpikePit'}, - 'MistyOrbRoom': {'GumonSeal'}, 'MistyPostClimb': set(), - 'MistyPostFeatherTutorial': {'MistyFrogNookExp', 'MistyKeystone1'}, 'MistyPostKeystone1': set(), - 'MistyPostLasers': {'MistyPostClimbSpikeCave'}, 'MistyPostMortarCorridor': set(), - 'MistyPreClimb': {'ClimbSkillTree'}, 'MistyPreKeystone2': {'MistyKeystone2', 'MistyAbilityCell'}, - 'MistyPreLasers': set(), 'MistyPreMortarCorridor': {'MistyMortarCorridorUpperExp', 'MistyMortarCorridorHiddenExp'}, - 'MistyPrePlantLedge': {'MistyPlant'}, 'MistySpikeCave': set(), - 'MoonGrotto': {'GrottoEnergyDoorHealthCell', 'GrottoEnergyDoorSwim'}, - 'MoonGrottoAboveTeleporter': {'LeftGrottoTeleporterExp', 'AboveGrottoTeleporterExp'}, - 'MoonGrottoBelowTeleporter': {'BelowGrottoTeleporterPlant', 'BelowGrottoTeleporterHealthCell'}, - 'MoonGrottoStompPlantAccess': {'MoonGrottoStompPlant'}, - 'MoonGrottoSwampAccessArea': {'GrottoSwampDrainAccessExp', 'GrottoSwampDrainAccessPlant'}, - 'OuterSwampAbilityCellNook': {'OuterSwampAbilityCell'}, - 'OuterSwampLowerArea': {'OuterSwampHealthCell', 'OuterSwampStompExp'}, - 'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarAbilityCell'}, - 'OuterSwampMortarPlantAccess': {'OuterSwampMortarPlant'}, 'OuterSwampUpperArea': {'OuterSwampGrenadeExp'}, - 'OutsideForlorn': {'OutsideForlornTreeExp', 'OutsideForlornWaterExp'}, - 'OutsideForlornCliff': {'OutsideForlornCliffExp'}, 'R1': {'HoruR1HangingExp'}, 'R1InnerDoor': set(), - 'R1OuterDoor': set(), 'R2': {'HoruR2'}, 'R2InnerDoor': set(), 'R2OuterDoor': set(), 'R3': set(), - 'R3InnerDoor': set(), 'R3OuterDoor': set(), 'R4': {'HoruR4DrainedExp'}, 'R4InnerDoor': set(), - 'R4OuterDoor': {'HoruLavaDrainedRightExp'}, 'RazielNoArea': {'RazielNo'}, - 'RightForlorn': {'RightForlornPlant', 'RightForlornHealthCell'}, - 'RightSwamp': {'StompAreaGrenadeExp', 'StompSkillTree', 'StompAreaExp', 'StompAreaRoofExp'}, - 'SideFallCell': {'GrottoHideoutFallAbilityCell'}, 'SorrowBashLedge': set(), - 'SorrowMainShaftKeystoneArea': {'SorrowMainShaftKeystone'}, 'SorrowMapstoneArea': {'SorrowMap', 'SorrowMapstone'}, - 'SorrowTeleporter': set(), 'SpiderSacArea': {'AboveChargeFlameTreeExp'}, - 'SpiderSacEnergyNook': {'SpiderSacEnergyCell'}, - 'SpiderSacTetherArea': {'SpiderSacGrenadeDoor', 'SpiderSacEnergyDoor', 'SpiderSacHealthCell'}, - 'SpiderWaterArea': {'GroveSpiderWaterSwim', 'GroveAboveSpiderWaterEnergyCell', 'GroveAboveSpiderWaterExp', - 'GroveAboveSpiderWaterHealthCell'}, 'SpiritCavernsDoor': set(), - 'SpiritCavernsDoorOpened': set(), 'SpiritTreeDoor': set(), 'SpiritTreeDoorOpened': set(), - 'SpiritTreeRefined': {'AboveChargeFlameTreeExp'}, - 'SunkenGladesRunaway': {'FronkeyWalkRoof', 'GladesGrenadePool', 'GladesMainPoolDeep', 'FirstPickup', - 'FronkeyFight', 'GladesMainPool', 'GladesKeystone1', 'GladesGrenadeTree', - 'GladesKeystone2'}, 'SunstoneArea': {'Sunstone', 'SunstonePlant'}, - 'Swamp': {'InnerSwampDrainExp', 'SwampMap'}, 'SwampDrainlessArea': {'SwampEntranceAbilityCell'}, - 'SwampEntryArea': {'SwampEntrancePlant', 'SwampEntranceSwim'}, 'SwampKeyDoorOpened': set(), - 'SwampKeyDoorPlatform': {'InnerSwampStompExp'}, 'SwampTeleporter': set(), - 'SwampWater': {'InnerSwampSwimRightKeystone', 'InnerSwampSwimMapstone', 'InnerSwampHiddenSwimExp', - 'InnerSwampSwimLeftKeystone'}, - 'TopGinsoTree': {'TopGinsoLeftLowerExp', 'TopGinsoLeftUpperExp', 'TopGinsoRightPlant'}, - 'UpperGinsoDoorClosed': set(), 'UpperGinsoDoorOpened': set(), - 'UpperGinsoRedirectArea': {'BashAreaExp', 'UpperGinsoRedirectUpperExp', 'UpperGinsoRedirectLowerExp'}, - 'UpperGinsoTree': {'UpperGinsoUpperLeftKeystone', 'UpperGinsoLowerKeystone', 'UpperGinsoRightKeystone', - 'UpperGinsoUpperRightKeystone', 'UpperGinsoEnergyCell'}, 'UpperGrotto': {'GrottoLasersRoofExp'}, - 'UpperLeftGlades': {'LeftGladesKeystone', 'LeftGladesExp', 'LeftGladesMapstone'}, - 'UpperSorrow': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone', - 'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'}, - 'UpperSpiritCaverns': {'SpiritCavernsTopRightKeystone', 'SpiritCavernsTopLeftKeystone'}, - 'ValleyEntry': {'ValleyEntryAbilityCell', 'ValleyThreeBirdAbilityCell'}, - 'ValleyEntryTree': {'ValleyEntryTreeExp', 'ValleyEntryGrenadeLongSwim'}, - 'ValleyEntryTreePlantAccess': {'ValleyEntryTreePlant'}, - 'ValleyForlornApproach': {'ValleyMap', 'ValleyForlornApproachGrenade', 'ValleyForlornApproachMapstone'}, - 'ValleyMain': {'GlideSkillFeather', 'KuroPerchExp'}, 'ValleyPostStompDoor': {'ValleyRightSwimExp'}, - 'ValleyRight': set(), 'ValleyStompFloor': set(), 'ValleyStompless': {'KuroPerchExp'}, - 'ValleyStomplessApproach': {'ValleyRightFastStomplessCell', 'ValleyRightBirdStompCell', 'ValleyRightExp'}, - 'ValleyTeleporter': set(), 'ValleyThreeBirdLever': {'ValleyThreeBirdAbilityCell', 'ValleyMainFACS'}, - 'WaterVeinArea': {'WaterVein', 'GumoHideoutRockfallExp'}, 'WilhelmLedge': {'WilhelmExp', 'KuroPerchExp'}} - -connectors = \ - {'AboveChargeJumpArea': {'SorrowTeleporter', 'ChargeJumpArea'}, - 'BashTree': {'BashTreeDoorClosed', 'UpperGinsoRedirectArea'}, 'BashTreeDoorClosed': {'BashTreeDoorOpened'}, - 'BashTreeDoorOpened': {'GinsoMiniBossDoor', 'BashTree'}, 'BelowSunstoneArea': {'SunstoneArea', 'UpperSorrow'}, - 'BlackrootDarknessRoom': {'DashArea'}, 'BlackrootGrottoConnection': {'SideFallCell'}, - 'ChargeFlameAreaStump': {'LowerChargeFlameArea', 'ChargeFlameSkillTreeChamber', 'ChargeFlameAreaPlantAccess'}, - 'ChargeFlameSkillTreeChamber': {'SpiritTreeRefined', 'ChargeFlameAreaStump'}, - 'ChargeJumpArea': {'AboveChargeJumpArea', 'ChargeJumpDoor'}, 'ChargeJumpDoor': {'ChargeJumpDoorOpen'}, - 'ChargeJumpDoorOpen': {'ChargeJumpDoorOpenLeft', 'ChargeJumpArea'}, 'ChargeJumpDoorOpenLeft': {'UpperSorrow'}, - 'DashArea': {'RazielNoArea', 'GrenadeAreaAccess', 'DashPlantAccess'}, - 'DeathGauntlet': {'DeathGauntletRoofPlantAccess', 'MoonGrotto', 'DeathGauntletMoat', 'MoonGrottoAboveTeleporter', - 'DeathGauntletRoof', 'DeathGauntletDoor'}, 'DeathGauntletDoor': {'DeathGauntletDoorOpened'}, - 'DeathGauntletDoorOpened': {'SunkenGladesRunaway', 'DeathGauntlet', 'DeathGauntletMoat'}, - 'DeathGauntletRoof': {'DeathGauntlet', 'DeathGauntletRoofPlantAccess'}, - 'DoubleJumpKeyDoor': {'DoubleJumpKeyDoorOpened'}, 'ForlornGravityRoom': {'ForlornMapArea', 'ForlornInnerDoor'}, - 'ForlornInnerDoor': {'ForlornGravityRoom', 'ForlornOrbPossession', 'ForlornOuterDoor'}, - 'ForlornKeyDoor': {'ForlornLaserRoom'}, 'ForlornLaserRoom': {'ForlornStompDoor'}, - 'ForlornMapArea': {'ForlornGravityRoom', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornTeleporter'}, - 'ForlornOrbPossession': {'ForlornMapArea', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornInnerDoor'}, - 'ForlornOuterDoor': {'OutsideForlorn', 'ForlornInnerDoor'}, 'ForlornStompDoor': {'RightForlorn'}, - 'ForlornTeleporter': {'ForlornMapArea', 'ForlornGravityRoom', 'ForlornOrbPossession'}, - 'GinsoEscape': {'GinsoEscapeComplete'}, 'GinsoEscapeComplete': {'Swamp'}, 'GinsoInnerDoor': {'LowerGinsoTree'}, - 'GinsoMiniBossDoor': {'BashTreeDoorClosed'}, 'GinsoOuterDoor': {'GinsoInnerDoor'}, - 'GinsoTeleporter': {'UpperGinsoDoorClosed', 'TopGinsoTree'}, 'GladesLaserArea': {'MidSpiritCaverns', 'GladesMain'}, - 'GladesMain': {'LeftGlades', 'SpiritCavernsDoor', 'LowerChargeFlameArea', 'GladesMainAttic', 'GladesLaserArea'}, - 'GladesMainAttic': {'LowerChargeFlameArea', 'GladesMain'}, 'GrenadeAreaAccess': {'LowerBlackroot', 'GrenadeArea'}, - 'GumoHideout': {'SideFallCell', 'LeftGumoHideout', 'LowerLeftGumoHideout', 'DoubleJumpKeyDoor'}, - 'GumoHideoutRedirectArea': {'GumoHideoutRedirectEnergyVault'}, - 'HollowGrove': {'MoonGrottoStompPlantAccess', 'Iceless', 'SwampTeleporter', 'SpiderWaterArea', 'HoruFields', - 'OuterSwampUpperArea'}, 'HoruBasement': {'HoruEscapeOuterDoor'}, - 'HoruEscapeOuterDoor': {'HoruEscapeInnerDoor'}, 'HoruFields': {'HoruOuterDoor', 'HoruFieldsPushBlock'}, - 'HoruFieldsPushBlock': {'HollowGrove'}, - 'HoruInnerDoor': {'HoruBasement', 'R2OuterDoor', 'HoruMapLedge', 'L1OuterDoor', 'L2OuterDoor', 'HoruTeleporter', - 'L3OuterDoor', 'R1OuterDoor', 'R4OuterDoor', 'HoruOuterDoor', 'L4OuterDoor', 'R3OuterDoor'}, - 'HoruL4LavaChasePeg': {'HoruL4CutscenePeg'}, 'HoruOuterDoor': {'HoruFieldsPushBlock', 'HoruInnerDoor'}, - 'HoruR1CutsceneTrigger': {'LowerGinsoTree'}, 'HoruR1MapstoneSecret': {'HoruR1CutsceneTrigger'}, - 'HoruR3CutsceneTrigger': {'HoruR3PlantCove'}, 'HoruR3ElevatorLever': {'HoruR3PlantCove', 'HoruR3CutsceneTrigger'}, - 'HoruR4PuzzleEntrance': {'HoruR4CutsceneTrigger'}, - 'HoruR4StompHideout': {'HoruR4CutsceneTrigger', 'HoruR4PuzzleEntrance'}, 'HoruTeleporter': {'HoruInnerDoor'}, - 'Iceless': {'HollowGrove', 'UpperGrotto'}, 'InnerSwampAboveDrainArea': {'InnerSwampDrainBroken'}, - 'InnerSwampDrainBroken': {'Swamp'}, 'InnerSwampSkyArea': {'SwampKeyDoorPlatform', 'Swamp'}, 'L1InnerDoor': {'L1'}, - 'L1OuterDoor': {'L1InnerDoor', 'HoruInnerDoor'}, 'L2InnerDoor': {'L2'}, - 'L2OuterDoor': {'L2InnerDoor', 'HoruInnerDoor'}, 'L3InnerDoor': {'L3'}, - 'L3OuterDoor': {'L3InnerDoor', 'HoruInnerDoor'}, 'L4': {'HoruL4CutscenePeg', 'HoruL4LavaChasePeg'}, - 'L4InnerDoor': {'L4'}, 'L4OuterDoor': {'L4InnerDoor', 'HoruInnerDoor'}, - 'LeftGlades': {'UpperLeftGlades', 'GladesMain'}, 'LeftGumoHideout': {'WaterVeinArea', 'LowerLeftGumoHideout'}, - 'LeftSorrow': {'LeftSorrowKeystones'}, 'LeftSorrowKeystones': {'LeftSorrowMiddleDoor', 'MiddleSorrow'}, - 'LeftSorrowLowerDoor': {'LeftSorrow'}, 'LeftSorrowMiddleDoor': {'MiddleSorrow'}, 'LostGrove': {'LostGroveExit'}, - 'LowerBlackroot': {'LostGrove'}, 'LowerChargeFlameArea': {'ChargeFlameAreaStump', 'GladesMain'}, - 'LowerGinsoTree': {'R4InnerDoor', 'GinsoMiniBossDoor'}, - 'LowerLeftGumoHideout': {'LowerBlackroot', 'GumoHideoutRedirectArea'}, - 'LowerSorrow': {'SorrowMainShaftKeystoneArea', 'SorrowMapstoneArea', 'LeftSorrowLowerDoor', 'LeftSorrow', - 'SunstoneArea', 'WilhelmLedge', 'MiddleSorrow'}, - 'LowerSpiritCaverns': {'SpiritCavernsDoor', 'MidSpiritCaverns', 'GladesLaserArea'}, - 'LowerValley': {'ValleyThreeBirdLever', 'LowerValleyPlantApproach', 'ValleyTeleporter', 'MistyEntrance'}, - 'MidSpiritCaverns': {'UpperSpiritCaverns', 'LowerSpiritCaverns', 'GladesLaserArea'}, - 'MiddleSorrow': {'SorrowMainShaftKeystoneArea', 'LeftSorrowKeystones', 'LeftSorrow', 'LowerSorrow', 'UpperSorrow', - 'SunstoneArea'}, 'MistyAbove200xp': {'MistyBeforeMiniBoss'}, - 'MistyBeforeDocks': {'MistyAbove200xp'}, 'MistyBeforeMiniBoss': {'MistyOrbRoom'}, - 'MistyEntrance': {'MistyPostFeatherTutorial'}, 'MistyKeystone3Ledge': {'MistyPreLasers'}, - 'MistyKeystone4Ledge': {'MistyBeforeDocks'}, 'MistyMortarSpikeCave': {'MistyKeystone4Ledge'}, - 'MistyOrbRoom': {'MistyPreKeystone2'}, 'MistyPostClimb': {'MistySpikeCave'}, - 'MistyPostFeatherTutorial': {'MistyPostKeystone1'}, 'MistyPostKeystone1': {'MistyPreMortarCorridor'}, - 'MistyPostLasers': {'MistyMortarSpikeCave'}, 'MistyPostMortarCorridor': {'MistyPrePlantLedge'}, - 'MistyPreClimb': {'MistyPostClimb', 'ForlornTeleporter', 'RightForlorn'}, 'MistyPreLasers': {'MistyPostLasers'}, - 'MistyPreMortarCorridor': {'MistyPostMortarCorridor', 'RightForlorn'}, 'MistyPrePlantLedge': {'MistyPreClimb'}, - 'MistySpikeCave': {'MistyKeystone3Ledge'}, - 'MoonGrotto': {'MoonGrottoBelowTeleporter', 'MoonGrottoAboveTeleporter', 'WaterVeinArea', 'DeathGauntlet', - 'GumoHideout'}, - 'MoonGrottoAboveTeleporter': {'MoonGrottoSwampAccessArea', 'MoonGrottoBelowTeleporter', - 'MoonGrottoStompPlantAccess', 'MoonGrotto', 'DeathGauntletRoof', 'UpperGrotto'}, - 'MoonGrottoSwampAccessArea': {'InnerSwampAboveDrainArea'}, 'OuterSwampAbilityCellNook': {'InnerSwampSkyArea'}, - 'OuterSwampLowerArea': {'OuterSwampAbilityCellNook', 'OuterSwampMortarPlantAccess', 'SwampEntryArea', - 'OuterSwampMortarAbilityCellLedge', 'UpperGrotto', 'OuterSwampUpperArea'}, - 'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarPlantAccess', 'UpperGrotto'}, - 'OuterSwampUpperArea': {'OuterSwampLowerArea', 'OuterSwampAbilityCellNook', 'GinsoOuterDoor'}, - 'OutsideForlorn': {'OutsideForlornCliff', 'RightForlorn', 'ForlornOuterDoor'}, - 'OutsideForlornCliff': {'OutsideForlorn', 'ValleyForlornApproach'}, 'R1': {'HoruR1MapstoneSecret'}, - 'R1InnerDoor': {'R1'}, 'R1OuterDoor': {'R1InnerDoor', 'L1OuterDoor'}, 'R2InnerDoor': {'R2'}, - 'R2OuterDoor': {'R2InnerDoor', 'HoruInnerDoor'}, 'R3': {'HoruR3ElevatorLever'}, 'R3InnerDoor': {'R3'}, - 'R3OuterDoor': {'R3InnerDoor', 'HoruInnerDoor'}, 'R4': {'HoruR4StompHideout'}, 'R4InnerDoor': {'R4'}, - 'R4OuterDoor': {'R4InnerDoor', 'HoruInnerDoor'}, 'RazielNoArea': {'GumoHideout', 'BlackrootGrottoConnection'}, - 'SideFallCell': {'LeftGumoHideout', 'GumoHideout'}, 'SorrowBashLedge': {'LowerSorrow'}, - 'SorrowMainShaftKeystoneArea': {'LowerSorrow'}, 'SorrowMapstoneArea': {'HoruInnerDoor'}, - 'SorrowTeleporter': {'AboveChargeJumpArea', 'BelowSunstoneArea'}, - 'SpiderSacArea': {'SpiritTreeRefined', 'SpiderWaterArea', 'SpiderSacTetherArea', 'SpiderSacEnergyNook'}, - 'SpiderSacEnergyNook': {'ChargeFlameAreaPlantAccess'}, - 'SpiderSacTetherArea': {'SpiderWaterArea', 'SpiderSacEnergyNook'}, - 'SpiderWaterArea': {'HollowGrove', 'DeathGauntletRoof', 'SpiderSacEnergyNook', 'SpiderSacArea'}, - 'SpiritCavernsDoor': {'SpiritCavernsDoorOpened'}, 'SpiritCavernsDoorOpened': {'LowerSpiritCaverns', 'GladesMain'}, - 'SpiritTreeDoor': {'SpiritTreeDoorOpened'}, 'SpiritTreeDoorOpened': {'SpiritTreeRefined', 'UpperSpiritCaverns'}, - 'SpiritTreeRefined': {'ChargeFlameAreaStump', 'SpiritTreeDoor', 'ChargeFlameSkillTreeChamber', 'ValleyEntry', - 'SpiderSacArea'}, - 'SunkenGladesRunaway': {'MoonGrotto', 'LowerChargeFlameArea', 'ValleyTeleporter', 'SorrowTeleporter', - 'HoruTeleporter', 'GladesMain', 'GinsoTeleporter', 'SwampTeleporter', 'SpiritTreeRefined', - 'BlackrootDarknessRoom', 'DeathGauntletDoor', 'ForlornTeleporter'}, - 'SunstoneArea': {'SorrowTeleporter', 'UpperSorrow'}, - 'Swamp': {'SwampKeyDoorPlatform', 'SwampDrainlessArea', 'SwampWater'}, - 'SwampEntryArea': {'SwampDrainlessArea', 'Swamp'}, 'SwampKeyDoorOpened': {'RightSwamp'}, - 'SwampKeyDoorPlatform': {'SwampKeyDoorOpened', 'InnerSwampSkyArea'}, - 'SwampTeleporter': {'HollowGrove', 'OuterSwampMortarAbilityCellLedge'}, 'TopGinsoTree': {'GinsoEscape'}, - 'UpperGinsoDoorClosed': {'UpperGinsoDoorOpened'}, 'UpperGinsoDoorOpened': {'GinsoTeleporter', 'UpperGinsoTree'}, - 'UpperGinsoRedirectArea': {'UpperGinsoTree', 'BashTree'}, - 'UpperGinsoTree': {'UpperGinsoDoorClosed', 'UpperGinsoRedirectArea'}, - 'UpperGrotto': {'MoonGrottoStompPlantAccess', 'Iceless', 'MoonGrottoAboveTeleporter', - 'OuterSwampMortarAbilityCellLedge', 'OuterSwampLowerArea'}, 'UpperLeftGlades': {'LeftGlades'}, - 'UpperSorrow': {'SunstoneArea', 'MiddleSorrow', 'SorrowTeleporter', 'ChargeJumpDoor'}, - 'UpperSpiritCaverns': {'SpiritTreeDoor', 'MidSpiritCaverns'}, - 'ValleyEntry': {'ValleyThreeBirdLever', 'ValleyStompFloor', 'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess', - 'ValleyEntryTree', 'SpiritTreeRefined'}, - 'ValleyEntryTree': {'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess'}, - 'ValleyForlornApproach': {'ValleyStompFloor', 'OutsideForlornCliff'}, - 'ValleyMain': {'LowerValleyPlantApproach', 'LowerValley', 'MistyEntrance', 'WilhelmLedge', 'ValleyStompless'}, - 'ValleyPostStompDoor': {'ValleyEntry', 'ValleyRight', 'ValleyEntryTree'}, - 'ValleyRight': {'ValleyPostStompDoor', 'ValleyStomplessApproach'}, - 'ValleyStompFloor': {'ValleyThreeBirdLever', 'ValleyEntry', 'ValleyForlornApproach'}, - 'ValleyStompless': {'LowerValleyPlantApproach', 'ValleyMain', 'LowerValley', 'WilhelmLedge', 'MistyEntrance', - 'ValleyStomplessApproach'}, 'ValleyStomplessApproach': {'ValleyRight', 'ValleyStompless'}, - 'ValleyTeleporter': {'LowerValleyPlantApproach', 'ValleyRight', 'ValleyPostStompDoor', 'LowerValley', - 'MistyEntrance', 'ValleyStompless'}, - 'ValleyThreeBirdLever': {'ValleyStompFloor', 'ValleyEntry', 'LowerValley'}, - 'WaterVeinArea': {'MoonGrotto', 'LeftGumoHideout', 'LowerLeftGumoHideout'}, - 'WilhelmLedge': {'ValleyMain', 'SorrowBashLedge', 'ValleyStompless'}} diff --git a/worlds_disabled/oribf/Rules.py b/worlds_disabled/oribf/Rules.py deleted file mode 100644 index e59bc6412f..0000000000 --- a/worlds_disabled/oribf/Rules.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import Set - -from .RulesData import location_rules -from worlds.generic.Rules import set_rule -from BaseClasses import Location, CollectionState - - -# TODO: implement Mapstone counting, Open, OpenWorld, connection rules - -def oribf_has_all(state: CollectionState, items: Set[str], player:int) -> bool: - return all(state.prog_items[item, player] if type(item) == str - else state.prog_items[item[0], player] >= item[1] for item in items) - -def set_rules(world): - temp_base_rule(world.multiworld, world.player) - for logicset in world.logic_sets: - apply_or_ruleset(world.multiworld, world.player, logicset) - - -def tautology(state): - return True - - -def add_or_rule_check_first(world, location: str, player: int, conditionsets): - location = world.get_location(location, player) - for set in conditionsets: - if "Free" in set: - location.access_rule = tautology - return - rule = lambda state, conditionsets=conditionsets: any( - oribf_has_all(state, conditionset, player) for conditionset in conditionsets) - if location.access_rule is Location.access_rule: - location.access_rule = rule - else: - old_rule = location.access_rule - location.access_rule = lambda state: rule(state) or old_rule(state) - - -def temp_base_rule(world, player): - world.completion_condition[player] = lambda state: oribf_has_all(state, - {"Bash", "ChargeFlame", "ChargeJump", "Climb", "Dash", "DoubleJump", "Glide", "Grenade", "Stomp", "WallJump"}, - player) - - -def base_rule(world, player): - if world.logic[player] != 'nologic': - # Victory gets placed on Escaped Horu Event - world.completion_condition[player] = lambda state: state.has('Victory', player) - # Events - # Also add: can complete goal - set_rule(world.get_location("Escaped Horu", player), - lambda state: state.can_reach("HoruEscapeInnerDoor", player) - and state.has_any({"Dash", "Stomp", "ChargeJump", "ChargeFlame"}, player)) - - -def apply_or_ruleset(world, player, rulesetname): - rules = location_rules[rulesetname] - for location, conditionsets in rules.items(): - add_or_rule_check_first(world, location, player, conditionsets) diff --git a/worlds_disabled/oribf/RulesData.py b/worlds_disabled/oribf/RulesData.py deleted file mode 100644 index 11a51c0763..0000000000 --- a/worlds_disabled/oribf/RulesData.py +++ /dev/null @@ -1,6 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -# Rules from areas.ori -location_rules = {'casual-core': {'AboveChargeJumpAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'BashSkillTree': {frozenset({'GinsoKey'})}, 'BashAreaExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'GinsoKey', 'ChargeJump'})}, 'DashAreaOrbRoomExp': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DashAreaAbilityCell': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DashAreaRoofExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'BlackrootBoulderExp': {frozenset({'Stomp'})}, 'BlackrootMap': {frozenset({'MapStone', 'ChargeJump'}), frozenset({'Climb', 'MapStone', 'DoubleJump'}), frozenset({'MapStone', 'WallJump'}), frozenset({'Grenade', 'Bash', 'MapStone'})}, 'ChargeFlameAreaPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DashAreaMapstone': {frozenset({'Dash'})}, 'DashAreaPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DeathGauntletExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DeathGauntletStompSwim': {frozenset({'Stomp', 'Water'})}, 'DeathGauntletEnergyCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DeathGauntletSwimEnergyDoor': {frozenset({('EC', 4)})}, 'DeathGauntletRoofPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DoubleJumpSkillTree': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'DoubleJump'})}, 'DoubleJumpAreaExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'Bash', 'WallJump', 'Water'}), frozenset({'ChargeJump', 'WallJump', 'Water'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey', 'Bash'})}, 'ForlornKeystone1': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey'}), frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'ForlornKey', 'DoubleJump', 'Bash'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'Glide', 'ForlornKey', 'DoubleJump', 'WallJump'}), frozenset({'ForlornKey'}), frozenset({'Climb', 'ForlornKey', 'Glide', 'DoubleJump'})}, 'ForlornEntranceExp': {frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'Open'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'}), frozenset({'ForlornKey', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ForlornKey', 'WallJump', 'Open'}), frozenset({'ForlornKey', 'DoubleJump', 'Open'}), frozenset({'Climb', 'ForlornKey', 'DoubleJump'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'}), frozenset({'Glide', 'ForlornKey', 'Climb', 'Open'})}, 'ForlornEscape': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'ForlornMap': {frozenset({'ForlornKey', 'MapStone'})}, 'ForlornKeystone4': {frozenset({'ForlornKey'}), frozenset({'Grenade', 'ForlornKey', 'WallJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'})}, 'ForlornKeystone3': {frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'}), frozenset({'Glide', 'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}, 'ForlornPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'LowerGinsoKeystone1': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'LowerGinsoKeystone2': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'LowerGinsoKeystone3': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'LowerGinsoKeystone4': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GladesLaser': {frozenset({'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}, 'GladesMap': {frozenset({'MapStone'})}, 'GrenadeSkillTree': {frozenset({'Climb', 'Dash'}), frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'})}, 'GrenadeAreaExp': {frozenset({'Climb', 'Dash', 'Glide'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'Dash', 'Bash'}), frozenset({'Glide', 'Dash', 'WallJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Grenade', 'Dash', 'ChargeJump'})}, 'GumoHideoutMap': {frozenset({'MapStone'})}, 'GumoHideoutRightHangingExp': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}, 'GumoHideoutMapstone': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'DoubleJump'})}, 'GumoHideoutMiniboss': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GumoHideoutEnergyCell': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutCrusherExp': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'Climb'}), frozenset({'WallJump'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'GumoHideoutRedirectPlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeFlame'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Climb', 'Grenade'})}, 'GumoHideoutRedirectEnergyCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GumoHideoutRedirectExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GroveWaterStompAbilityCell': {frozenset({'Stomp', 'Water'})}, 'HoruFieldsHealthCell': {frozenset({'Stomp'})}, 'HollowGroveTreePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'HollowGroveTreeAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'HollowGroveMap': {frozenset({'MapStone'})}, 'HollowGroveMapPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SwampTeleporterAbilityCell': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash', 'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide', 'WallJump'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb', 'Glide'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'DoorWarpExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruFieldsPlant': {frozenset({'Grenade', 'Glide', 'ChargeJump'}), frozenset({'ChargeFlame', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Bash'}), frozenset({'Climb', 'ChargeJump', 'Grenade'}), frozenset({'Climb', 'ChargeJump', 'ChargeFlame'})}, 'HoruFieldsEnergyCell': {frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'})}, 'HoruFieldsHiddenExp': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', 'Bash'}), frozenset({'Glide', 'Open', 'DoubleJump'}), frozenset({'Open', 'ChargeJump'})}, 'HoruLavaDrainedRightExp': {frozenset({'Glide', 'Open', 'Bash'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'Glide', 'Open', 'ChargeJump'})}, 'HoruL4': {frozenset({'Stomp'})}, 'HoruL4LowerExp': {frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}, 'HoruL4ChaseExp': {frozenset({'Free'})}, 'HoruMap': {frozenset({'MapStone'})}, 'HoruR1EnergyCell': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'Glide', 'WallJump'})}, 'HoruR3Plant': {frozenset({'Grenade'})}, 'HoruR4DrainedExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump'})}, 'HoruR4LaserExp': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'InnerSwampDrainExp': {frozenset({'Grenade', 'Bash', 'WallJump', 'Water'}), frozenset({'Climb', 'ChargeJump', 'Water'}), frozenset({'Glide'}), frozenset({'Climb', 'Bash', 'Grenade', 'Water'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'Water', 'Glide', 'Stomp', 'WallJump'}), frozenset({'DoubleJump', 'WallJump', 'Water'}), frozenset({'Grenade', 'Glide', 'Water', 'Bash'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'Water'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'Water'}), frozenset({'DoubleJump'}), frozenset({'Water', 'Grenade', 'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', 'DoubleJump', 'Water'}), frozenset({'Climb', 'Dash', 'Glide', 'Water'})}, 'HoruL1': {frozenset({'Grenade', 'Glide', 'Stomp', 'Bash'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump'})}, 'HoruL3': {frozenset({'Glide', 'Bash', 'Stomp', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'Stomp'}), frozenset({'Stomp', 'DoubleJump', 'Bash'})}, 'WallJumpAreaExp': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'WallJumpAreaEnergyCell': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Climb', 'ChargeFlame'}), frozenset({'Grenade'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump'})}, 'FarLeftGumoHideoutExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({'Glide', 'Bash'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}, 'LeftSorrowGrenade': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}, 'LeftSorrowPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump', 'WallJump'}), frozenset({'Grenade'})}, 'LeftSorrowKeystone1': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'LeftSorrowKeystone2': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'LeftSorrowKeystone3': {frozenset({'Glide'})}, 'LeftSorrowKeystone4': {frozenset({'Glide'})}, 'LeftSorrowEnergyCell': {frozenset({'Glide'})}, 'LostGroveLongSwim': {frozenset({'Water'})}, 'LostGroveHiddenExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'LostGroveTeleporter': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'LowerBlackrootAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Grenade', 'Dash', 'Bash'})}, 'LowerBlackrootLaserExp': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}, 'LowerBlackrootGrenadeThrow': {frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Climb', 'Grenade'}), frozenset({'Grenade', 'Glide'}), frozenset({'Grenade', 'DoubleJump'})}, 'LowerGinsoHiddenExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerGinsoPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'LeftGumoHideoutLowerPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GumoHideoutLeftHangingExp': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'LeftGumoHideoutExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'LeftGumoHideoutHealthCell': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'})}, 'LeftGumoHideoutSwim': {frozenset({'Water'})}, 'SorrowSpikeKeystone': {frozenset({'Glide'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'SorrowHiddenKeystone': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Glide'})}, 'SorrowHealthCell': {frozenset({'Glide', 'ChargeJump', 'Bash'})}, 'SorrowLowerLeftKeystone': {frozenset({'Glide'})}, 'SpiritCavernsKeystone2': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'LowerValleyMapstone': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Glide', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide'}), frozenset({'Bash'}), frozenset({'Glide', 'OpenWorld'}), frozenset({'Stomp'})}, 'ValleyMainPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'MistyGrenade': {frozenset({'Grenade'})}, 'MistyEntranceStompExp': {frozenset({'Stomp'})}, 'MistyEntranceTreeExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}, 'GumonSeal': {frozenset({'Climb'}), frozenset({'DoubleJump'}), frozenset({'Bash'}), frozenset({'WallJump'})}, 'MistyFrogNookExp': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', 'Bash', 'DoubleJump'})}, 'MistyAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Glide', 'Bash'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Glide'})}, 'MistyPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GrottoEnergyDoorSwim': {frozenset({('EC', 2), 'Water'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'ChargeJump'}), frozenset({('EC', 2), 'Bash', 'Grenade'}), frozenset({('EC', 2), 'DoubleJump', 'WallJump'})}, 'AboveGrottoTeleporterExp': {frozenset({'Grenade', 'Bash'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'Bash', 'WallJump'})}, 'LeftGrottoTeleporterExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}, 'BelowGrottoTeleporterPlant': {frozenset({'ChargeFlame', 'Glide'}), frozenset({'Grenade', 'Glide'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'MoonGrottoStompPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GrottoSwampDrainAccessExp': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'DoubleJump'})}, 'GrottoSwampDrainAccessPlant': {frozenset({'Grenade', 'Stomp'}), frozenset({'ChargeFlame', 'Stomp', 'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump', 'Glide'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump', 'DoubleJump'})}, 'OuterSwampStompExp': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'OuterSwampHealthCell': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'OuterSwampMortarPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'OuterSwampGrenadeExp': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'Climb'})}, 'OutsideForlornTreeExp': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'OutsideForlornWaterExp': {frozenset({'Water'})}, 'OutsideForlornCliffExp': {frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Dash'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'HoruR1HangingExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'HoruR2': {frozenset({'ChargeJump', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'Grenade', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'RightForlornPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'StompAreaExp': {frozenset({'Bash'}), frozenset({'Stomp'})}, 'StompAreaRoofExp': {frozenset({'ChargeJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'Glide', 'Water'}), frozenset({'Climb', 'Water', 'Grenade', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Stomp', 'ChargeJump', 'Water'}), frozenset({'Grenade', 'Bash', 'Stomp', 'Water'})}, 'SorrowMapstone': {frozenset({'Bash'})}, 'SorrowMap': {frozenset({'Bash', 'MapStone'}), frozenset({'Stomp', 'MapStone'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'ChargeFlame', 'Climb', 'ChargeJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 4)})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GroveSpiderWaterSwim': {frozenset({'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'})}, 'AboveChargeFlameTreeExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GladesGrenadePool': {frozenset({'Grenade', 'Water'})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesMainPool': {frozenset({'Water'})}, 'GladesMainPoolDeep': {frozenset({'Water'})}, 'FronkeyWalkRoof': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'})}, 'SunstonePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SwampMap': {frozenset({'MapStone'})}, 'SwampEntranceSwim': {frozenset({'Water'})}, 'SwampEntrancePlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Climb'})}, 'InnerSwampStompExp': {frozenset({'Stomp', 'Water'})}, 'InnerSwampSwimRightKeystone': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Glide', 'WallJump'})}, 'TopGinsoLeftLowerExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'TopGinsoLeftUpperExp': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'UpperGinsoLowerKeystone': {frozenset({'Glide', 'Bash', 'GinsoKey'}), frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Glide', 'Bash', 'GinsoKey'}), frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoEnergyCell': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'LeftGladesExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'UpperSorrowRightKeystone': {frozenset({'Glide'})}, 'UpperSorrowFarRightKeystone': {frozenset({'Glide'})}, 'UpperSorrowLeftKeystone': {frozenset({'Glide'})}, 'UpperSorrowSpikeExp': {frozenset({'Glide'})}, 'UpperSorrowFarLeftKeystone': {frozenset({'Glide'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Glide'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'ChargeJump', 'OpenWorld'}), frozenset({'Bash'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'ValleyEntryGrenadeLongSwim': {frozenset({'Grenade', 'Water'})}, 'ValleyEntryTreePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'ValleyForlornApproachGrenade': {frozenset({'Grenade'})}, 'ValleyMap': {frozenset({'Bash', 'MapStone'})}, 'ValleyRightSwimExp': {frozenset({'Water'})}, 'ValleyRightBirdStompCell': {frozenset({'Climb', 'ChargeJump'})}, 'ValleyRightFastStomplessCell': {frozenset({'Glide', 'Wind'})}, 'ValleyRightExp': {frozenset({'Bash'})}, 'ValleyMainFACS': {frozenset({'Climb', 'ChargeJump'})}, 'WilhelmExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Climb'})}}, 'dbash': {'AboveChargeJumpAbilityCell': {frozenset({'Bash'})}, 'GrenadeSkillTree': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Bash', 'DoubleJump'})}, 'GrenadeAreaExp': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Bash', 'DoubleJump'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Bash'})}, 'HoruFieldsEnergyCell': {frozenset({'Bash'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', 'Bash'}), frozenset({'Bash'})}, 'HoruR4DrainedExp': {frozenset({'Bash'})}, 'HoruR4LaserExp': {frozenset({'Bash'})}, 'LeftSorrowGrenade': {frozenset({'Grenade', 'Bash'})}, 'GumoHideoutLeftHangingExp': {frozenset({'Bash'})}, 'GumoHideoutRightHangingExp': {frozenset({'Bash'})}, 'LeftGumoHideoutExp': {frozenset({'Bash'})}, 'LeftGumoHideoutHealthCell': {frozenset({'Bash'})}, 'SorrowSpikeKeystone': {frozenset({'Bash'})}, 'SorrowHiddenKeystone': {frozenset({'Bash'})}, 'SorrowHealthCell': {frozenset({'Bash'})}, 'AboveGrottoTeleporterExp': {frozenset({'Bash'})}, 'GrottoSwampDrainAccessExp': {frozenset({'Bash'})}, 'StompAreaRoofExp': {frozenset({'Bash'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Bash'})}, 'ValleyMainFACS': {frozenset({'Bash'})}, 'WilhelmExp': {frozenset({'Bash'})}}, 'expert-abilities': {'AboveChargeJumpAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'BashAreaExp': {frozenset({('AC', 6), 'Dash', 'GinsoKey'}), frozenset({('AC', 6), 'Dash', 'GinsoKey', 'DoubleJump', 'WallJump'})}, 'ChargeFlameAreaPlant': {frozenset({'Dash', ('AC', 6)})}, 'DashAreaPlant': {frozenset({'Dash', ('AC', 6)})}, 'DeathGauntletRoofPlant': {frozenset({'Dash', ('AC', 6)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', ('AC', 6), 'Dash'})}, 'ForlornPlant': {frozenset({'Dash', ('AC', 6)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'ForlornKey', ('AC', 6), 'Dash'})}, 'GladesLaser': {frozenset({'Dash', ('AC', 6)})}, 'GladesLaserGrenade': {frozenset({('AC', 6), ('EC', 1), 'Dash', 'Grenade', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'Glide', 'ChargeJump'}), frozenset({('AC', 6), ('EC', 2), 'Climb', 'Dash', 'Grenade', 'ChargeJump'})}, 'GrenadeSkillTree': {frozenset({'Dash', ('AC', 6)})}, 'GrenadeAreaExp': {frozenset({'Dash', ('AC', 6)})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GumoHideoutRedirectPlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'HollowGroveTreePlant': {frozenset({'Dash', ('AC', 6)})}, 'HollowGroveTreeAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'HollowGroveMapPlant': {frozenset({'Dash', ('AC', 6)})}, 'SwampTeleporterAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'HoruFieldsPlant': {frozenset({'Dash', ('AC', 6), ('EC', 3)})}, 'HoruFieldsEnergyCell': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'HoruFieldsHiddenExp': {frozenset({'Dash', ('AC', 6)})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'HoruL4LowerExp': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', 'Stomp', ('AC', 3)})}, 'HoruR3Plant': {frozenset({'Dash', ('AC', 6)})}, 'HoruR4DrainedExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)}), frozenset({'Dash', ('AC', 6)})}, 'HoruR4LaserExp': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 2)})}, 'HoruL1': {frozenset({'Dash', 'Stomp', ('AC', 3), 'Bash'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', ('EC', 3)})}, 'HoruL2': {frozenset({'Stomp', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}, 'HoruL3': {frozenset({('AC', 6), 'Climb', 'Dash', ('EC', 2), 'ChargeJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'LeftSorrowPlant': {frozenset({'Dash', ('AC', 6)})}, 'LowerBlackrootAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'LowerBlackrootLaserExp': {frozenset({'Dash', ('AC', 6)})}, 'LowerGinsoPlant': {frozenset({'Dash', ('AC', 6)})}, 'LeftGumoHideoutLowerPlant': {frozenset({'Dash', ('AC', 6)})}, 'LeftGumoHideoutHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'SorrowSpikeKeystone': {frozenset({'Dash', ('AC', 6)})}, 'SorrowHiddenKeystone': {frozenset({'Dash', ('AC', 6)})}, 'SorrowLowerLeftKeystone': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp'})}, 'SpiritCavernsKeystone2': {frozenset({'Dash', ('AC', 6)})}, 'SpiritCavernsAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'LowerValleyMapstone': {frozenset({'Dash', ('AC', 6)})}, 'KuroPerchExp': {frozenset({'Dash', ('AC', 6), 'OpenWorld'}), frozenset({'Dash', ('AC', 3), 'ChargeJump', 'WallJump'}), frozenset({'Dash', ('AC', 6)})}, 'ValleyMainPlant': {frozenset({'Dash', ('AC', 6)})}, 'MistyEntranceTreeExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyMortarCorridorUpperExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'MistyPlant': {frozenset({'Dash', ('AC', 6)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'AboveGrottoTeleporterExp': {frozenset({'Dash', ('AC', 6)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'BelowGrottoTeleporterPlant': {frozenset({'Dash', ('AC', 6)})}, 'MoonGrottoStompPlant': {frozenset({'Dash', ('AC', 6)})}, 'GrottoSwampDrainAccessExp': {frozenset({'Dash', ('AC', 6)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampStompExp': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampMortarPlant': {frozenset({'Dash', ('AC', 6)})}, 'RightForlornPlant': {frozenset({'Dash', ('AC', 6)})}, 'StompAreaExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}, 'StompAreaGrenadeExp': {frozenset({('AC', 6), 'Dash', 'Water', 'Grenade', 'Stomp'}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Water', 'Grenade'})}, 'SorrowMapstone': {frozenset({'Dash', ('AC', 6)})}, 'AboveChargeFlameTreeExp': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterExp': {frozenset({'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'FronkeyWalkRoof': {frozenset({'Dash', ('AC', 6)})}, 'SunstonePlant': {frozenset({'Dash', ('AC', 6)})}, 'InnerSwampDrainExp': {frozenset({'Climb', 'Dash', 'Water', 'Grenade', 'Stomp', ('AC', 3)}), frozenset({'Climb', 'Dash', ('AC', 6), 'Water'}), frozenset({'ChargeFlame', 'Climb', 'Dash', 'Water', 'Stomp', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'WallJump', 'Water'})}, 'SwampEntrancePlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'InnerSwampStompExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3), 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({'Dash', ('AC', 6)})}, 'TopGinsoLeftUpperExp': {frozenset({'Dash', ('AC', 6)})}, 'TopGinsoRightPlant': {frozenset({'Dash', ('AC', 6)})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoLowerKeystone': {frozenset({('AC', 6), 'Dash', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}, 'UpperSorrowLeftKeystone': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyEntryTreePlant': {frozenset({'Dash', ('AC', 6)})}, 'ValleyMap': {frozenset({'Grenade', 'Dash', 'MapStone', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', 'MapStone', ('AC', 3)})}, 'ValleyMainFACS': {frozenset({'WallJump', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Wind', 'Dash', 'Glide', ('AC', 3), 'ChargeJump', 'WallJump'})}}, 'master-abilities': {'BashAreaExp': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'GumoHideoutRedirectPlant': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}, 'HoruFieldsAbilityCell': {frozenset({'Glide', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', ('AC', 12), 'DoubleJump'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)}), frozenset({'Glide', 'Open', ('AC', 12), 'DoubleJump'})}, 'HoruR4DrainedExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'HoruL1': {frozenset({('AC', 6), ('EC', 1), 'Dash', 'Stomp', 'DoubleJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', ('AC', 3), 'Dash'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}, 'HoruL3': {frozenset({('AC', 6), 'Dash', ('EC', 6), 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', ('EC', 3)}), frozenset({('AC', 6), ('EC', 4), 'Dash', 'Glide', 'DoubleJump'}), frozenset({'Dash', ('AC', 6), ('EC', 7)}), frozenset({'Glide', 'Dash', ('AC', 6), ('EC', 6)}), frozenset({('AC', 12), 'Climb', 'Dash', 'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({('AC', 6), 'Climb', 'Dash', ('EC', 6), 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'LowerGinsoHiddenExp': {frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'WallJump'})}, 'LeftGumoHideoutExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'LeftGumoHideoutHealthCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'SorrowLowerLeftKeystone': {frozenset({('AC', 12), 'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyFrogNookExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyMortarCorridorUpperExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyMortarCorridorHiddenExp': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'OuterSwampHealthCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'SpiderSacHealthCell': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'TopGinsoLeftUpperExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump'})}, 'UpperSorrowRightKeystone': {frozenset({('AC', 6), 'Dash', 'Grenade', 'Bash', 'DoubleJump'})}, 'UpperSorrowFarRightKeystone': {frozenset({('AC', 12), 'Dash', 'Grenade', 'Bash', 'DoubleJump'})}, 'ValleyThreeBirdAbilityCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'WilhelmExp': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'KuroPerchExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'master-core': {'DashAreaRoofExp': {frozenset({'DoubleJump'}), frozenset({'Bash'})}, 'DoubleJumpAreaExp': {frozenset({'DoubleJump'})}, 'ForlornKeystone4': {frozenset({'Grenade', 'ForlornKey', 'DoubleJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}, 'LowerGinsoKeystone3': {frozenset({'DoubleJump'})}, 'LowerGinsoKeystone4': {frozenset({'DoubleJump'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Bash', 'DoubleJump'})}, 'GrenadeSkillTree': {frozenset({'ChargeJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'ChargeJump'})}, 'GumoHideoutMiniboss': {frozenset({'DoubleJump'})}, 'GumoHideoutEnergyCell': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Stomp', 'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}, 'DoorWarpExp': {frozenset({'DoubleJump'})}, 'HoruFieldsPlant': {frozenset({'Grenade', 'Glide'}), frozenset({'Grenade', 'Dash'}), frozenset({'Grenade', 'DoubleJump'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash'})}, 'HoruL4LowerExp': {frozenset({'Dash', 'Stomp'})}, 'HoruR1EnergyCell': {frozenset({'DoubleJump'})}, 'HoruL2': {frozenset({'Glide', 'Stomp', 'DoubleJump'})}, 'HoruL3': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', 'Stomp'})}, 'WallJumpAreaEnergyCell': {frozenset({'DoubleJump'})}, 'FarLeftGumoHideoutExp': {frozenset({'Bash'})}, 'LeftSorrowAbilityCell': {frozenset({'Bash'})}, 'LeftSorrowKeystone2': {frozenset({'Bash'})}, 'LeftSorrowKeystone3': {frozenset({'Bash'})}, 'LeftSorrowKeystone4': {frozenset({'Bash'})}, 'LeftSorrowEnergyCell': {frozenset({'Bash'})}, 'LowerBlackrootAbilityCell': {frozenset({'DoubleJump'})}, 'LowerGinsoHiddenExp': {frozenset({'DoubleJump'})}, 'SorrowSpikeKeystone': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'SorrowLowerLeftKeystone': {frozenset({'Bash'})}, 'SpiritCavernsKeystone2': {frozenset({'Free'})}, 'LowerValleyMapstone': {frozenset({'Free'})}, 'MistyEntranceStompExp': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'ChargeFlame', 'Dash'})}, 'MistyEntranceTreeExp': {frozenset({'DoubleJump'}), frozenset({'WallJump'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Bash'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Bash'})}, 'OuterSwampHealthCell': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'})}, 'OutsideForlornTreeExp': {frozenset({'Bash'})}, 'HoruR1HangingExp': {frozenset({'Glide', 'WallJump'})}, 'HoruR2': {frozenset({'Stomp', 'DoubleJump'})}, 'HoruR4DrainedExp': {frozenset({'Bash'})}, 'StompAreaExp': {frozenset({'Grenade'})}, 'AboveChargeFlameTreeExp': {frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Stomp', 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 2)})}, 'InnerSwampDrainExp': {frozenset({'DoubleJump', 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({'DoubleJump'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Grenade', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'DoubleJump'}), frozenset({'Climb'})}, 'KuroPerchExp': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide', 'ChargeJump'})}}, 'glitched': {'BlackrootBoulderExp': {frozenset({'Free'})}, 'GroveWaterStompAbilityCell': {frozenset({'Bash'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 3)})}, 'GladesGrenadeTree': {frozenset({'Grenade'})}, 'KuroPerchExp': {frozenset({'ChargeJump'})}}, 'standard-abilities': {'BlackrootMap': {frozenset({'Climb', 'Dash', 'MapStone', ('AC', 3)})}, 'DoubleJumpSkillTree': {frozenset({'Dash', ('AC', 3)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Bash', 'Dash', ('AC', 3)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'ChargeJump', 'Dash', ('AC', 3)})}, 'LowerGinsoKeystone1': {frozenset({'Dash', ('AC', 3)})}, 'LowerGinsoKeystone2': {frozenset({'Dash', ('AC', 3)})}, 'GladesLaserGrenade': {frozenset({'Dash', 'Grenade', 'Glide', ('AC', 3), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'GumoHideoutMapstone': {frozenset({'Dash', ('AC', 3)})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Dash', ('AC', 3)})}, 'HollowGroveTreeAbilityCell': {frozenset({'WallJump', 'Dash', 'Glide', 'Stomp', ('AC', 3)}), frozenset({'Climb', 'Dash', 'Glide', 'Stomp', ('AC', 3)})}, 'SwampTeleporterAbilityCell': {frozenset({'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'HoruFieldsPlant': {frozenset({'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'HoruFieldsEnergyCell': {frozenset({'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Glide', 'ChargeJump', 'Dash', ('AC', 3)})}, 'HoruLavaDrainedLeftExp': {frozenset({'Glide', 'Open', 'Dash', ('AC', 3)})}, 'HoruR1EnergyCell': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'HoruR4DrainedExp': {frozenset({'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Glide', 'Dash', ('AC', 3)})}, 'InnerSwampDrainExp': {frozenset({'Dash', ('AC', 3)})}, 'HoruL1': {frozenset({'WallJump', 'Dash', 'Stomp', ('AC', 3), 'Bash'}), frozenset({'Dash', 'Grenade', 'Stomp', ('AC', 3), 'Bash'}), frozenset({'Dash', 'Stomp', 'ChargeJump', ('AC', 3), 'Bash'}), frozenset({'Climb', 'Dash', 'Stomp', ('AC', 3), 'Bash'})}, 'HoruL2': {frozenset({'Stomp', ('AC', 3), 'Dash', 'WallJump'}), frozenset({'Climb', 'Dash', 'Stomp', 'DoubleJump', ('AC', 3)})}, 'HoruL3': {frozenset({'Bash', 'Stomp', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Bash', 'Dash', ('AC', 3)})}, 'FarLeftGumoHideoutExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'GumoHideoutLeftHangingExp': {frozenset({'Dash', ('AC', 3)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'Dash', ('AC', 3)})}, 'BelowGrottoTeleporterPlant': {frozenset({'Grenade', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', ('AC', 3)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Dash', ('AC', 3), 'WallJump'}), frozenset({'ChargeFlame', 'Glide', 'Dash', ('AC', 3)})}, 'HoruR1HangingExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'HoruLavaDrainedRightExp': {frozenset({'Dash', ('AC', 3)})}, 'AboveChargeFlameTreeExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'UpperGinsoLowerKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}}, 'expert-core': {'BlackrootMap': {frozenset({'Climb', 'MapStone'})}, 'DashAreaMapstone': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DoubleJumpSkillTree': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'})}, 'DoubleJumpAreaExp': {frozenset({'Climb', 'Bash', 'Water'}), frozenset({'Grenade', 'Bash'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', 'DoubleJump', 'WallJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'Open'})}, 'GladesLaserGrenade': {frozenset({'Water', 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'Water'})}, 'GrenadeSkillTree': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Dash', 'Bash'})}, 'GumoHideoutCrusherExp': {frozenset({'DoubleJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'HoruL4LowerExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'HoruR1EnergyCell': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Glide'})}, 'HoruR4DrainedExp': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruL1': {frozenset({'Glide', 'Stomp', 'Bash'})}, 'HoruL2': {frozenset({'Climb', 'Stomp', 'Glide', 'DoubleJump'})}, 'HoruL3': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'ChargeFlame'})}, 'LeftSorrowKeystone1': {frozenset({'ChargeJump', 'WallJump'})}, 'LeftSorrowKeystone2': {frozenset({'ChargeJump', 'WallJump'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerBlackrootLaserExp': {frozenset({'Grenade', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'GumoHideoutRightHangingExp': {frozenset({'DoubleJump'})}, 'LeftGumoHideoutExp': {frozenset({'Climb', 'DoubleJump'})}, 'SorrowHiddenKeystone': {frozenset({'Bash', 'ChargeJump', 'WallJump'})}, 'SorrowHealthCell': {frozenset({'Climb', 'ChargeJump'})}, 'SorrowLowerLeftKeystone': {frozenset({'Bash', 'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'Climb', 'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'MistyEntranceStompExp': {frozenset({'Climb', 'Dash', 'ChargeJump'})}, 'MistyEntranceTreeExp': {frozenset({'Bash'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Bash', 'DoubleJump'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Bash', 'DoubleJump'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'Glide'})}, 'LeftGrottoTeleporterExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruR1HangingExp': {frozenset({'DoubleJump'}), frozenset({'Dash'})}, 'HoruR2': {frozenset({'Stomp', 'WallJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'ChargeJump'})}, 'StompAreaExp': {frozenset({'ChargeFlame'})}, 'AboveChargeFlameTreeExp': {frozenset({'ChargeFlame', 'Climb', 'Glide'}), frozenset({'Dash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'Glide'}), frozenset({'ChargeFlame', 'Glide', 'WallJump'}), frozenset({'Grenade', 'Glide', 'WallJump'}), frozenset({'Climb', 'Stomp', 'Glide'}), frozenset({'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', 'Dash'})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'Climb', 'DoubleJump'})}, 'InnerSwampDrainExp': {frozenset({'ChargeJump', 'DoubleJump', 'Water'}), frozenset({'Glide', 'Dash', 'WallJump', 'Water'})}, 'SwampEntrancePlant': {frozenset({'Grenade'})}, 'InnerSwampStompExp': {frozenset({'Grenade', 'Bash', 'ChargeJump', 'Water'})}, 'InnerSwampSwimRightKeystone': {frozenset({'DoubleJump'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'ChargeFlame', 'GinsoKey'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'}), frozenset({'ChargeFlame', 'GinsoKey'})}, 'UpperGinsoEnergyCell': {frozenset({'Dash', 'GinsoKey', 'ChargeJump'}), frozenset({'ChargeFlame', 'GinsoKey'})}, 'LeftGladesExp': {frozenset({'DoubleJump'}), frozenset({'Bash'})}, 'UpperSorrowLeftKeystone': {frozenset({'Grenade', 'Bash'})}, 'ValleyMap': {frozenset({'Grenade', 'MapStone', 'DoubleJump'}), frozenset({'Grenade', 'MapStone', 'ChargeJump'}), frozenset({'ChargeFlame', 'MapStone', 'ChargeJump'}), frozenset({'ChargeFlame', 'MapStone', 'DoubleJump'})}, 'WilhelmExp': {frozenset({'Climb', 'Bash'}), frozenset({'Grenade', 'Bash'})}}, 'expert-dboost': {'UpperSorrowSpikeExp': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('HC', 2)}), frozenset({('EC', 2), 'Dash', ('AC', 6), ('HC', 2)}), frozenset({'Grenade', 'Bash', 'DoubleJump', ('HC', 2)}), frozenset({('AC', 6), 'Dash', ('HC', 2), 'Grenade', 'Bash'})}, 'DeathGauntletStompSwim': {frozenset({('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Climb', 'Bash', ('HC', -1)})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'WallJump', ('HC', 1)})}, 'GladesLaser': {frozenset({'Glide', 'WallJump'})}, 'GladesLaserGrenade': {frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'Glide'}), frozenset({'Grenade', 'Glide', 'ChargeJump', ('HC', 0)}), frozenset({('AC', 6), ('EC', 1), 'Climb', 'Dash', ('HC', 2), 'Grenade'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'DoubleJump'}), frozenset({('HC', 0), 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Grenade', 'ChargeJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Water', 'Grenade'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Dash', 'Grenade', 'Glide', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', ('HC', 0)}), frozenset({'Grenade', 'ChargeJump', ('HC', 2)}), frozenset({('HC', 0), ('EC', 2), 'Grenade', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 6), ('HC', 0), ('EC', 2), 'Dash', 'Grenade', 'WallJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Dash', 'Water', 'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', ('HC', 0)}), frozenset({'Grenade', 'ChargeJump', ('HC', 0), 'Water'}), frozenset({('AC', 6), ('HC', 0), ('EC', 2), 'Climb', 'Dash', 'Grenade'}), frozenset({('EC', 1), ('HC', 1), 'Grenade', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 6), ('EC', 1), 'Dash', ('HC', 2), 'Grenade', 'WallJump'})}, 'GroveWaterStompAbilityCell': {frozenset({'Stomp', ('HC', 2)}), frozenset({('HC', 3), 'Bash'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash', 'WallJump', ('HC', 2)})}, 'HoruR1EnergyCell': {frozenset({'WallJump', ('HC', 2)}), frozenset({'Climb', ('HC', 2)})}, 'HoruR4DrainedExp': {frozenset({('HC', 3), 'DoubleJump'}), frozenset({('HC', 3), 'Dash', ('AC', 3)}), frozenset({('HC', 3), 'Glide'})}, 'LeftSorrowAbilityCell': {frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'LeftSorrowKeystone3': {frozenset({'Climb', 'ChargeJump', ('HC', 2)})}, 'LeftSorrowKeystone4': {frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 2)}), frozenset({'Climb', 'Dash', 'ChargeJump', ('HC', 2)})}, 'LeftSorrowEnergyCell': {frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 2)})}, 'LowerBlackrootAbilityCell': {frozenset({'DoubleJump', ('HC', 2)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'DoubleJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Glide', 'Stomp', ('HC', 1)}), frozenset({'Glide', 'WallJump', ('HC', 1)}), frozenset({'Dash', ('AC', 3), ('HC', 1)})}, 'LeftGumoHideoutSwim': {frozenset({'Free'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'DoubleJump', ('HC', 2)}), frozenset({'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'DoubleJump', 'WallJump', ('HC', 2)})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'Bash', ('HC', 2)}), frozenset({'Bash', 'WallJump', ('HC', 2)})}, 'SorrowHealthCell': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 2)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({('HC', 4), 'Dash', 'WallJump'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', ('HC', 1)})}, 'MistyMortarCorridorUpperExp': {frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Bash', ('HC', 1)})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Grenade', 'Bash', ('HC', 1)}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({('HC', 4), 'Bash'})}, 'GrottoEnergyDoorSwim': {frozenset({('EC', 2)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'DoubleJump'})}, 'LeftGrottoTeleporterExp': {frozenset({('HC', 4), 'WallJump'}), frozenset({'Glide', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 4)}), frozenset({'Glide', 'WallJump', ('HC', 1)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Bash', ('HC', 2)})}, 'OutsideForlornWaterExp': {frozenset({('HC', 1)}), frozenset({'Stomp', ('HC', -1)})}, 'HoruR1HangingExp': {frozenset({'ChargeJump', ('HC', 2)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', ('HC', 0)}), frozenset({('HC', 0), 'Climb', 'Dash', 'Water', 'Grenade', 'Stomp', 'DoubleJump', ('AC', 3)}), frozenset({'Climb', 'Dash', ('HC', 1), 'Grenade', 'Stomp', 'DoubleJump', ('AC', 3)}), frozenset({('HC', 0), 'Water', 'Grenade', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Grenade', ('HC', 1)}), frozenset({('HC', 1), 'Grenade', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'ChargeJump', ('HC', 1)})}, 'GroveSpiderWaterSwim': {frozenset({'Bash', ('HC', 2)}), frozenset({('HC', 3)})}, 'GladesGrenadePool': {frozenset({'Grenade', ('HC', 3)}), frozenset({'Grenade', 'Stomp', ('HC', 2)})}, 'GladesMainPool': {frozenset({'Bash', ('HC', 0)}), frozenset({('HC', 1)}), frozenset({'Stomp', ('HC', 0)})}, 'GladesMainPoolDeep': {frozenset({('HC', 4)})}, 'SwampEntranceSwim': {frozenset({'Free'})}, 'InnerSwampStompExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Stomp'}), frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'TopGinsoLeftLowerExp': {frozenset({('HC', 2)})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'DoubleJump', 'WallJump', ('HC', 0)}), frozenset({'Climb', ('HC', 0), 'DoubleJump', 'ChargeFlame'})}, 'UpperGinsoLowerKeystone': {frozenset({'GinsoKey', ('HC', 2)})}, 'UpperGinsoRightKeystone': {frozenset({'GinsoKey', 'DoubleJump', 'WallJump', ('HC', 2)})}, 'UpperSorrowRightKeystone': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('HC', 2)})}, 'UpperSorrowLeftKeystone': {frozenset({'ChargeJump', ('HC', 2)})}, 'ValleyRightSwimExp': {frozenset({('HC', 1)})}, 'ValleyRightFastStomplessCell': {frozenset({'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'ValleyRightExp': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'ValleyMainFACS': {frozenset({'WallJump', 'Dash', ('HC', 1), 'ChargeJump', ('AC', 3)})}, 'WilhelmExp': {frozenset({'ChargeJump', ('HC', 2)})}}, 'master-lure': {'UpperSorrowSpikeExp': {frozenset({'Bash'})}, 'UpperSorrowFarLeftKeystone': {frozenset({'Bash'})}, 'UpperSorrowRightKeystone': {frozenset({'Bash'})}, 'UpperSorrowFarRightKeystone': {frozenset({'Bash'})}, 'UpperSorrowLeftKeystone': {frozenset({'Bash'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'Bash'})}, 'ForlornEscape': {frozenset({'Bash'})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'Bash'})}, 'GroveWaterStompAbilityCell': {frozenset({('AC', 12)}), frozenset({('HC', 2)})}, 'SwampTeleporterAbilityCell': {frozenset({'Bash'})}, 'WallJumpAreaExp': {frozenset({'Bash'})}, 'WallJumpAreaEnergyCell': {frozenset({'Bash'})}, 'SorrowHealthCell': {frozenset({'Glide', 'Stomp', 'WallJump'}), frozenset({'Glide', 'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'Stomp'})}, 'KuroPerchExp': {frozenset({'Bash'})}, 'LeftGrottoTeleporterExp': {frozenset({'Bash'})}, 'InnerSwampDrainExp': {frozenset({'Bash', 'Water'})}, 'InnerSwampStompExp': {frozenset({'Bash', 'Water'}), frozenset({'Bash', ('HC', 0)})}}, 'master-dboost': {'UpperSorrowSpikeExp': {frozenset({('AC', 12), 'Dash', 'Grenade', 'Bash', ('HC', 1)}), frozenset({('AC', 12), 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('EC', 2), 'Dash', ('AC', 12), ('HC', 1)}), frozenset({('AC', 12), 'Dash', 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'UpperSorrowFarLeftKeystone': {frozenset({('AC', 12), 'Dash', ('HC', 1), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'Climb', 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', 'Dash', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 7)}), frozenset({('AC', 12), 'Climb', 'Dash', 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', ('AC', 12), ('HC', 0), 'WallJump'})}, 'HoruR1EnergyCell': {frozenset({('AC', 12), 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), ('HC', 1)})}, 'HoruR4DrainedExp': {frozenset({('HC', 8)}), frozenset({('AC', 12), ('HC', 6)})}, 'HoruL1': {frozenset({('EC', 1), ('AC', 12), 'Climb', ('HC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', ('EC', 2), 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), ('AC', 12), 'Climb', 'Stomp', 'DoubleJump'}), frozenset({('AC', 12), ('HC', 1), 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Bash', 'Stomp', ('HC', 2)}), frozenset({'Stomp', 'ChargeJump', ('HC', 2)})}, 'HoruL3': {frozenset({('HC', 3), ('AC', 12), 'Climb', 'Dash', ('EC', 2), 'Glide', 'DoubleJump'}), frozenset({('HC', 0), ('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeFlame', ('HC', 0), ('AC', 12), 'ChargeJump', 'DoubleJump'}), frozenset({('EC', 1), ('AC', 12), 'Climb', 'Dash', 'Glide', 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 0), ('AC', 12), 'Stomp', 'ChargeJump', 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)})}, 'LeftSorrowKeystone3': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LeftSorrowKeystone4': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LeftSorrowEnergyCell': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LostGroveLongSwim': {frozenset({('HC', 3), ('AC', 12)}), frozenset({('HC', 9)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Stomp', ('HC', 1)})}, 'SorrowLowerLeftKeystone': {frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}, 'MistyFrogNookExp': {frozenset({'DoubleJump', ('HC', 1)})}, 'MistyPostClimbSpikeCave': {frozenset({'Bash', ('HC', 1)}), frozenset({'DoubleJump', ('HC', 8)})}, 'MistyMortarCorridorHiddenExp': {frozenset({('HC', 7)}), frozenset({('HC', 4), ('AC', 12)}), frozenset({'DoubleJump', ('HC', 1)})}, 'LeftGrottoTeleporterExp': {frozenset({'DoubleJump', ('HC', 1)})}, 'OutsideForlornWaterExp': {frozenset({('AC', 12), ('HC', -1)})}, 'HoruR1HangingExp': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'DoubleJump', ('HC', 2)}), frozenset({'Water', ('HC', 2), 'Grenade', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Water', ('HC', 2), 'Grenade', 'DoubleJump'})}, 'GroveSpiderWaterSwim': {frozenset({('HC', 2)}), frozenset({'Bash', ('AC', 12)}), frozenset({('AC', 12), ('HC', 1)})}, 'GladesGrenadePool': {frozenset({'Grenade', ('HC', 2)})}, 'GladesMainPool': {frozenset({('HC', 0)})}, 'InnerSwampDrainExp': {frozenset({('HC', 4), 'Dash', ('AC', 12), 'WallJump'}), frozenset({('HC', 4), 'Bash', ('AC', 12)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', ('AC', 12)}), frozenset({'ChargeFlame', ('HC', 4), ('AC', 12), 'Glide', 'Stomp', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({'Climb', 'Dash', ('HC', 4), ('AC', 12)})}, 'TopGinsoLeftUpperExp': {frozenset({('HC', 0), 'Glide', 'DoubleJump'}), frozenset({('HC', 0), 'Dash', 'DoubleJump'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'DoubleJump', ('HC', 0)}), frozenset({'Grenade', 'DoubleJump', ('HC', 0)})}, 'UpperGinsoRightKeystone': {frozenset({('HC', 0), ('AC', 12), 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump', ('HC', 2)})}, 'UpperGinsoUpperLeftKeystone': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump', ('HC', 2)})}, 'UpperSorrowRightKeystone': {frozenset({('HC', 4), 'ChargeJump', 'DoubleJump', ('AC', 12)}), frozenset({('AC', 12), 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}, 'UpperSorrowFarRightKeystone': {frozenset({('HC', 4), 'Dash', 'ChargeJump', ('AC', 12)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'DoubleJump'})}, 'UpperSorrowLeftKeystone': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}, 'ValleyEntryGrenadeLongSwim': {frozenset({'Grenade', 'Bash', ('HC', 10)}), frozenset({'Grenade', ('HC', 11)}), frozenset({'Grenade', ('HC', 4), ('AC', 12)})}, 'ValleyRightFastStomplessCell': {frozenset({'Climb', ('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 2)})}, 'ValleyRightExp': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'WilhelmExp': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}}, 'standard-lure': {'DeathGauntletExp': {frozenset({'Bash'})}, 'DeathGauntletStompSwim': {frozenset({'Water'})}, 'GladesLaser': {frozenset({'Bash'})}, 'HoruFieldsHealthCell': {frozenset({'Free'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', 'Bash'})}, 'LeftSorrowKeystone1': {frozenset({'Bash'})}, 'MistyEntranceStompExp': {frozenset({'Bash'})}, 'MistyAbilityCell': {frozenset({'Bash'})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Grenade'})}, 'SorrowMap': {frozenset({'MapStone'})}, 'FronkeyWalkRoof': {frozenset({'Bash'})}, 'ValleyRightFastStomplessCell': {frozenset({'Bash'})}, 'WilhelmExp': {frozenset({'Bash', 'WallJump'})}, 'KuroPerchExp': {frozenset({'HoruKey'})}}, 'casual-dboost': {'DoubleJumpSkillTree': {frozenset({'Bash', ('HC', 0)}), frozenset({'Climb', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Grenade', 'Bash', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0), 'Water'}), frozenset({('HC', -1), 'ChargeJump', 'WallJump'}), frozenset({'Bash', ('HC', 0), 'Water'}), frozenset({'Bash', 'WallJump', ('HC', -1)})}, 'GrenadeAreaExp': {frozenset({'ChargeJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'WallJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'ChargeJump', 'Water'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'InnerSwampSwimRightKeystone': {frozenset({'Climb'}), frozenset({'WallJump'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'ChargeJump'}), frozenset({'Bash'})}}, 'standard-dboost': {'DoubleJumpSkillTree': {frozenset({'Dash', ('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', 'ChargeJump', ('HC', 0)}), frozenset({('HC', 0), 'Bash', 'Dash'}), frozenset({'ChargeJump', ('HC', 0), ('AC', 3), ('EC', 1)}), frozenset({'Bash', ('HC', 0), ('AC', 3), ('EC', 1)}), frozenset({'Bash', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'ChargeJump', ('HC', 1)})}, 'LowerGinsoKeystone1': {frozenset({('HC', 0)})}, 'LowerGinsoKeystone2': {frozenset({'ChargeJump', ('HC', 0)})}, 'GumoHideoutMapstone': {frozenset({'ChargeJump', ('HC', 1)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Dash', 'ChargeJump', ('HC', 1)})}, 'MistyAbilityCell': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'WallJump'})}, 'BelowGrottoTeleporterHealthCell': {frozenset({('HC', 0), 'Bash', 'DoubleJump'}), frozenset({'Bash', ('HC', 0), 'WallJump'}), frozenset({'ChargeJump', ('HC', 0)})}, 'BelowGrottoTeleporterPlant': {frozenset({'ChargeFlame', ('HC', 1)}), frozenset({'Grenade', ('HC', 1)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Glide', ('HC', 1)}), frozenset({'ChargeFlame', 'DoubleJump', ('HC', 1)}), frozenset({'ChargeFlame', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeFlame', 'WallJump', ('HC', 1)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', ('HC', 0), 'Water'})}, 'InnerSwampDrainExp': {frozenset({'Grenade', 'Bash', ('HC', 1), 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({('HC', 0), 'DoubleJump'}), frozenset({'ChargeJump', ('HC', 0)})}, 'TopGinsoLeftUpperExp': {frozenset({('HC', 0), 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'DoubleJump', ('HC', 0)}), frozenset({'Climb', 'Glide', 'DoubleJump', ('HC', 0)}), frozenset({('HC', 0), 'Glide', 'DoubleJump', 'WallJump'})}, 'TopGinsoRightPlant': {frozenset({'Grenade', 'DoubleJump', 'WallJump', ('HC', 0)}), frozenset({'Climb', 'Grenade', 'DoubleJump', ('HC', 0)})}, 'UpperGinsoLowerKeystone': {frozenset({'Bash', 'GinsoKey', ('HC', 0)}), frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'}), frozenset({('HC', 0), 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoRightKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}}, 'standard-core': {'DoubleJumpAreaExp': {frozenset({'ChargeJump', 'WallJump'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ForlornKey', 'Dash', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'Dash', 'DoubleJump'}), frozenset({'Glide', 'ForlornKey', 'Climb', 'Dash'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'Dash', 'WallJump', 'Open'}), frozenset({'Climb', 'ForlornKey', 'Dash', 'Open'})}, 'LowerGinsoKeystone1': {frozenset({'Grenade', 'Bash'})}, 'LowerGinsoKeystone2': {frozenset({'Grenade', 'Bash'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'Bash'}), frozenset({'Climb', 'Grenade', 'Glide', 'ChargeJump', 'DoubleJump'})}, 'GrenadeSkillTree': {frozenset({'Grenade', 'Bash'})}, 'GrenadeAreaExp': {frozenset({'Dash', 'DoubleJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'GumoHideoutMapstone': {frozenset({'Climb'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'SwampTeleporterAbilityCell': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}, 'HoruFieldsHiddenExp': {frozenset({'Bash'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', 'Dash', 'DoubleJump'})}, 'HoruL4LowerExp': {frozenset({'Climb', 'Stomp'})}, 'HoruR1EnergyCell': {frozenset({'Grenade', 'Bash'})}, 'HoruR3Plant': {frozenset({'ChargeFlame'})}, 'HoruR4DrainedExp': {frozenset({'Grenade', 'Bash', 'Climb'})}, 'HoruL1': {frozenset({'Glide', 'ChargeJump', 'Stomp', 'Bash'})}, 'HoruL3': {frozenset({'ChargeFlame', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Glide', 'Bash', 'ChargeFlame', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeFlame'}), frozenset({'Grenade', 'Bash', 'ChargeFlame'})}, 'FarLeftGumoHideoutExp': {frozenset({'Climb', 'Bash', 'Grenade'})}, 'LeftSorrowKeystone1': {frozenset({'Dash'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Dash', 'DoubleJump'})}, 'LowerBlackrootGrenadeThrow': {frozenset({'ChargeJump', 'DoubleJump'})}, 'GumoHideoutRightHangingExp': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'Dash', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump', 'WallJump'})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'Bash', 'Dash', 'DoubleJump'}), frozenset({'Bash', 'Dash', 'DoubleJump', 'WallJump'})}, 'SorrowHealthCell': {frozenset({'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'DoubleJump', 'WallJump'})}, 'MistyFrogNookExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', 'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Grenade', 'Bash'})}, 'OuterSwampHealthCell': {frozenset({'Climb', 'DoubleJump'})}, 'HoruR1HangingExp': {frozenset({'Grenade', 'Bash'})}, 'HoruR2': {frozenset({'Glide', 'Stomp', 'Climb', 'Bash'}), frozenset({'Glide', 'Stomp', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'})}, 'StompAreaExp': {frozenset({'Climb', 'ChargeJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'DoubleJump', 'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Bash', 'ChargeJump'})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'AboveChargeFlameTreeExp': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'Climb', 'Wind'}), frozenset({'Grenade', 'Glide', 'WallJump', 'Wind'})}, 'InnerSwampSwimRightKeystone': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}, 'TopGinsoLeftLowerExp': {frozenset({'Bash'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Glide', 'GinsoKey', 'ChargeJump'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Glide', 'GinsoKey', 'ChargeJump'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoEnergyCell': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'GrottoLasersRoofExp': {frozenset({'Climb', 'DoubleJump'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'ValleyRightBirdStompCell': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Dash', 'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'ForlornKeystone1': {frozenset({'ForlornKey', 'Bash'})}, 'GumoHideoutMiniboss': {frozenset({'Bash'})}, 'GroveWaterStompAbilityCell': {frozenset({'Bash', 'Water'})}, 'SorrowHealthCell': {frozenset({'Grenade', 'Glide', 'Stomp', 'Bash'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Glide', 'Stomp'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump'}), frozenset({'Glide', 'Stomp', 'ChargeJump'})}}, 'gjump': {'GladesLaserGrenade': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruFieldsEnergyCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruR4LaserExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruL3': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowLowerLeftKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'KuroPerchExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'Water'})}, 'SorrowMapstone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'UpperSorrowLeftKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'insane': {'GrenadeSkillTree': {frozenset({'WallJump'})}, 'ValleyRightBirdStompCell': {frozenset({'Bash'})}}, 'timed-level': {'LowerBlackrootGrenadeThrow': {frozenset({'Free'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 2)})}}} -connection_rules = {'AboveChargeJumpArea': {'casual-core': {'SorrowTeleporter': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'})}}, 'expert-dboost': {'SorrowTeleporter': {frozenset({'Dash', 'ChargeJump', 'WallJump', ('HC', 2)})}, 'ChargeJumpArea': {frozenset({('HC', 3), 'Bash', 'ChargeJump'}), frozenset({('HC', 3), 'Dash', 'ChargeJump', ('AC', 6)})}}, 'master-core': {'SorrowTeleporter': {frozenset({'Bash'})}, 'ChargeJumpArea': {frozenset({'Bash'})}}, 'standard-lure': {'ChargeJumpArea': {frozenset({'Climb', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'WallJump'})}}, 'expert-core': {'ChargeJumpArea': {frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', 'WallJump'})}}, 'expert-abilities': {'ChargeJumpArea': {frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'}), frozenset({'Climb', 'Dash', 'ChargeJump', ('AC', 6)}), frozenset({'Bash', 'ChargeJump', 'Dash', ('AC', 3)}), frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)})}}, 'gjump': {'ChargeJumpArea': {frozenset({'Climb', 'Dash', 'ChargeJump', 'Grenade'}), frozenset({'Climb', ('HC', 3), 'ChargeJump', 'Grenade'})}}, 'dbash': {'ChargeJumpArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}}, 'BashTree': {'casual-core': {'BashTreeDoorClosed': {frozenset({'Open'})}, 'UpperGinsoRedirectArea': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Dash', 'ChargeJump', 'DoubleJump'})}}, 'standard-dboost': {'UpperGinsoRedirectArea': {frozenset({'ChargeJump', ('HC', 1)})}}, 'expert-dboost': {'UpperGinsoRedirectArea': {frozenset({'ChargeJump', ('HC', 0)})}}, 'expert-abilities': {'UpperGinsoRedirectArea': {frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}, 'master-core': {'UpperGinsoRedirectArea': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump'})}}, 'master-abilities': {'UpperGinsoRedirectArea': {frozenset({('AC', 12), 'DoubleJump'})}}}, 'BashTreeDoorClosed': {'casual-core': {'BashTreeDoorOpened': {frozenset({('KS', 4)})}}}, 'BashTreeDoorOpened': {'casual-core': {'GinsoMiniBossDoor': {frozenset({'Open', 'GinsoKey'})}, 'BashTree': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'master-core': {'BashTree': {frozenset({'DoubleJump'})}}}, 'BelowSunstoneArea': {'casual-core': {'SunstoneArea': {frozenset({'Glide', 'Stomp'})}, 'UpperSorrow': {frozenset({'Stomp'})}}, 'standard-core': {'SunstoneArea': {frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'UpperSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'SunstoneArea': {frozenset({'Glide', 'Dash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', 'Glide'})}, 'UpperSorrow': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}}, 'gjump': {'SunstoneArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'SunstoneArea': {frozenset({'Bash'})}, 'UpperSorrow': {frozenset({'Bash'})}}, 'master-dboost': {'SunstoneArea': {frozenset({('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'UpperSorrow': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}}, 'BlackrootDarknessRoom': {'casual-core': {'DashArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'expert-core': {'DashArea': {frozenset({'DoubleJump'})}}, 'master-core': {'DashArea': {frozenset({'Bash'})}}}, 'BlackrootGrottoConnection': {'casual-core': {'SideFallCell': {frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-abilities': {'SideFallCell': {frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}}, 'expert-core': {'SideFallCell': {frozenset({'Climb', 'Stomp'})}}}, 'ChargeFlameAreaStump': {'casual-core': {'ChargeFlameSkillTreeChamber': {frozenset({'ChargeFlame'}), frozenset({'Grenade'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}}, 'standard-core': {'ChargeFlameSkillTreeChamber': {frozenset({'Stomp'})}}, 'expert-abilities': {'ChargeFlameSkillTreeChamber': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'ChargeFlameSkillTreeChamber': {frozenset({'DoubleJump'})}}}, 'ChargeFlameSkillTreeChamber': {'casual-core': {'SpiritTreeRefined': {frozenset({'ChargeJump'})}, 'ChargeFlameAreaStump': {frozenset({'ChargeJump'}), frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-abilities': {'ChargeFlameAreaStump': {frozenset({'Dash', ('AC', 6)})}}}, 'ChargeJumpArea': {'casual-core': {'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'ChargeJumpDoor': {frozenset({'Open'})}}, 'gjump': {'AboveChargeJumpArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Dash', 'ChargeJump', ('HC', 2)})}}, 'expert-abilities': {'AboveChargeJumpArea': {frozenset({'Climb', 'Dash', 'ChargeJump', ('AC', 6)})}}, 'master-core': {'AboveChargeJumpArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}}, 'ChargeJumpDoor': {'casual-core': {'ChargeJumpDoorOpen': {frozenset({('KS', 4)})}}}, 'ChargeJumpDoorOpen': {'casual-core': {'ChargeJumpArea': {frozenset({'Glide'})}}, 'master-dboost': {'ChargeJumpArea': {frozenset({('AC', 12), 'Dash', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('HC', 10), ('AC', 12), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}, 'ChargeJumpDoorOpenLeft': {frozenset({'ChargeJump', ('HC', 2)})}}, 'expert-dboost': {'ChargeJumpDoorOpenLeft': {frozenset({('HC', 3), 'ChargeJump'})}}, 'master-lure': {'ChargeJumpDoorOpenLeft': {frozenset({'Bash'})}}}, 'ChargeJumpDoorOpenLeft': {'casual-core': {'UpperSorrow': {frozenset({'Glide'})}}, 'master-dboost': {'UpperSorrow': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('AC', 6), ('HC', 6), 'Dash', ('EC', 2), 'ChargeJump'}), frozenset({('HC', 4), ('AC', 12), 'Dash', ('EC', 2), 'ChargeJump'})}}, 'master-lure': {'UpperSorrow': {frozenset({'Bash'})}}}, 'DashArea': {'casual-core': {'DashPlantAccess': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'WallJump'})}, 'GrenadeAreaAccess': {frozenset({'Stomp', 'Dash'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump'})}, 'RazielNoArea': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}, 'standard-abilities': {'DashPlantAccess': {frozenset({'Climb', 'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}, 'RazielNoArea': {frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Dash', ('AC', 3)}), frozenset({'WallJump'})}}, 'expert-core': {'DashPlantAccess': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Glide'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'GrenadeAreaAccess': {frozenset({'Stomp'})}}, 'expert-abilities': {'DashPlantAccess': {frozenset({'Climb', 'Dash', ('AC', 6), ('EC', 2)}), frozenset({'Grenade', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', ('AC', 6), 'WallJump'}), frozenset({('EC', 2), 'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6), 'ChargeFlame'})}, 'RazielNoArea': {frozenset({'Climb'})}}, 'master-core': {'DashPlantAccess': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Dash', 'DoubleJump'})}, 'GrenadeAreaAccess': {frozenset({'Bash'})}}, 'master-abilities': {'DashPlantAccess': {frozenset({'Climb', 'ChargeFlame', ('AC', 3)}), frozenset({'ChargeFlame', ('AC', 3), 'WallJump'}), frozenset({('AC', 12), 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump', ('AC', 3)})}, 'RazielNoArea': {frozenset({'DoubleJump'})}}, 'standard-core': {'GrenadeAreaAccess': {frozenset({'Climb', 'ChargeJump'})}, 'RazielNoArea': {frozenset({'Grenade', 'Bash'})}}, 'glitched': {'GrenadeAreaAccess': {frozenset({'Free'})}}, 'insane': {'GrenadeAreaAccess': {frozenset({'Free'})}}}, 'DeathGauntlet': {'casual-core': {'DeathGauntletMoat': {frozenset({'Water'})}, 'DeathGauntletDoor': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'DeathGauntletRoof': {frozenset({'ChargeJump'})}, 'MoonGrotto': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'expert-dboost': {'DeathGauntletMoat': {frozenset({('HC', 1)})}}, 'master-dboost': {'DeathGauntletMoat': {frozenset({('HC', 0)})}}, 'expert-core': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Bash', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Grenade'}), frozenset({'ChargeFlame', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Climb'})}}, 'master-core': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', 'DoubleJump'})}}, 'master-abilities': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', ('AC', 3)})}}, 'master-lure': {'MoonGrotto': {frozenset({'Dash', ('AC', 6), ('EC', 1)}), frozenset({'Bash'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Bash'})}}}, 'DeathGauntletDoor': {'casual-core': {'DeathGauntletDoorOpened': {frozenset({('EC', 4)})}}, 'glitched': {'DeathGauntletDoorOpened': {frozenset({('EC', 3)})}}, 'timed-level': {'DeathGauntletDoorOpened': {frozenset({('EC', 2)})}}}, 'DeathGauntletDoorOpened': {'casual-core': {'DeathGauntlet': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'WallJump', 'Water'}), frozenset({'Climb', 'Water'}), frozenset({'Bash', 'Water'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}, 'DeathGauntletMoat': {frozenset({'Water'})}}, 'standard-dboost': {'DeathGauntlet': {frozenset({'Climb', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'Bash', ('HC', 1)})}}, 'expert-dboost': {'DeathGauntlet': {frozenset({'Climb', ('HC', 0)}), frozenset({'Bash', ('HC', 0)}), frozenset({('HC', 0), 'WallJump'})}, 'DeathGauntletMoat': {frozenset({('HC', 2)})}}, 'expert-abilities': {'DeathGauntlet': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}}, 'master-core': {'DeathGauntlet': {frozenset({'DoubleJump'})}}, 'master-dboost': {'DeathGauntletMoat': {frozenset({('HC', 1)})}}}, 'DeathGauntletRoof': {'casual-core': {'DeathGauntlet': {frozenset({'Stomp'})}}, 'standard-lure': {'DeathGauntlet': {frozenset({'Free'})}}}, 'DoubleJumpKeyDoor': {'casual-core': {'DoubleJumpKeyDoorOpened': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'expert-core': {'DoubleJumpKeyDoorOpened': {frozenset({'DoubleJump'})}}}, 'ForlornGravityRoom': {'casual-core': {'ForlornMapArea': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'ForlornInnerDoor': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'master-core': {'ForlornMapArea': {frozenset({'DoubleJump'})}}, 'master-lure': {'ForlornMapArea': {frozenset({'Bash'})}}, 'standard-dboost': {'ForlornInnerDoor': {frozenset({('HC', 1)})}}, 'standard-core': {'ForlornInnerDoor': {frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'ForlornInnerDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'ForlornInnerDoor': {frozenset({'ChargeJump'})}}, 'master-dboost': {'ForlornInnerDoor': {frozenset({('AC', 12), ('HC', 0)})}}}, 'ForlornInnerDoor': {'casual-core': {'ForlornOuterDoor': {frozenset({'ForlornKey'})}, 'ForlornOrbPossession': {frozenset({'Climb', 'Glide', 'Open'}), frozenset({'Open', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Open'}), frozenset({'Glide', 'WallJump', 'Open'}), frozenset({'Open', 'DoubleJump'})}, 'ForlornGravityRoom': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'ForlornOrbPossession': {frozenset({'Dash', 'WallJump', 'Open'}), frozenset({'Climb', 'Dash', 'Open'})}, 'ForlornGravityRoom': {frozenset({'Climb', 'Dash', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'ForlornOrbPossession': {frozenset({'Open'})}, 'ForlornGravityRoom': {frozenset({'ChargeJump'})}}, 'standard-dboost': {'ForlornGravityRoom': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)})}}, 'standard-abilities': {'ForlornGravityRoom': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-dboost': {'ForlornGravityRoom': {frozenset({'WallJump', ('HC', 1)})}}, 'master-dboost': {'ForlornGravityRoom': {frozenset({('AC', 12), ('HC', 0), 'WallJump'})}}}, 'ForlornKeyDoor': {'casual-core': {'ForlornLaserRoom': {frozenset({'ForlornKey', ('KS', 4)})}}}, 'ForlornLaserRoom': {'casual-core': {'ForlornStompDoor': {frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Glide', 'Stomp', 'ChargeJump'})}}, 'standard-abilities': {'ForlornStompDoor': {frozenset({'Dash', 'Glide', ('AC', 3), 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', ('HC', 1), 'Stomp', 'ChargeJump', ('AC', 3)}), frozenset({'Dash', 'Stomp', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'standard-dboost': {'ForlornStompDoor': {frozenset({'Stomp', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'ForlornStompDoor': {frozenset({'Stomp', ('AC', 6), 'Dash', 'DoubleJump'}), frozenset({'Climb', 'Stomp', ('AC', 6), 'Dash'}), frozenset({('AC', 6), 'Stomp', 'ChargeJump', 'Dash'}), frozenset({'Stomp', ('AC', 6), 'Dash', 'WallJump'})}}, 'master-abilities': {'ForlornStompDoor': {frozenset({'Glide', 'Stomp', ('AC', 12), 'DoubleJump'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', ('AC', 12)})}}, 'master-lure': {'ForlornStompDoor': {frozenset({'Stomp', 'Bash'})}}, 'gjump': {'ForlornStompDoor': {frozenset({'Climb', 'Stomp', 'ChargeJump', 'Grenade'})}}}, 'ForlornMapArea': {'casual-core': {'ForlornTeleporter': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'ForlornPlantAccess': {frozenset({'Grenade', 'ForlornKey', 'WallJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'}), frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'})}}, 'standard-abilities': {'ForlornTeleporter': {frozenset({'Glide', 'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', 'Glide', ('AC', 3)}), frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-dboost': {'ForlornTeleporter': {frozenset({'ChargeJump', ('HC', 1)})}}, 'master-core': {'ForlornTeleporter': {frozenset({'DoubleJump'})}, 'ForlornPlantAccess': {frozenset({'Grenade', 'ForlornKey', 'DoubleJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}}, 'master-lure': {'ForlornTeleporter': {frozenset({'Bash'})}}, 'master-dboost': {'ForlornTeleporter': {frozenset({('AC', 12), 'ChargeJump', ('HC', 0)})}}}, 'ForlornOrbPossession': {'casual-core': {'ForlornPlantAccess': {frozenset({'ForlornKey'})}, 'ForlornInnerDoor': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'ForlornInnerDoor': {frozenset({('HC', 1)})}}, 'standard-core': {'ForlornInnerDoor': {frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'ForlornInnerDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'ForlornInnerDoor': {frozenset({'ChargeJump'})}}, 'master-dboost': {'ForlornInnerDoor': {frozenset({('AC', 12), ('HC', 0)})}}}, 'ForlornStompDoor': {'casual-core': {'RightForlorn': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'standard-abilities': {'RightForlorn': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Climb', 'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'RightForlorn': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)})}}, 'expert-dboost': {'RightForlorn': {frozenset({'Climb', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)})}}, 'master-dboost': {'RightForlorn': {frozenset({'Climb', ('AC', 12), ('HC', 0)}), frozenset({('AC', 12), ('HC', 0), 'WallJump'})}}, 'master-lure': {'RightForlorn': {frozenset({'Bash'})}}, 'master-abilities': {'RightForlorn': {frozenset({('AC', 12), 'DoubleJump'})}}}, 'ForlornTeleporter': {'casual-core': {'ForlornOrbPossession': {frozenset({'ForlornKey', 'Open'})}, 'ForlornMapArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}}, 'GinsoEscape': {'casual-core': {'GinsoEscapeComplete': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'})}}, 'standard-core': {'GinsoEscapeComplete': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-core': {'GinsoEscapeComplete': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'expert-dboost': {'GinsoEscapeComplete': {frozenset({'Climb', 'ChargeJump', ('HC', 0)}), frozenset({('AC', 6), ('HC', 0), 'Dash', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', ('HC', 6), 'WallJump'})}}, 'dbash': {'GinsoEscapeComplete': {frozenset({'Bash'})}}, 'master-dboost': {'GinsoEscapeComplete': {frozenset({('HC', 3), ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Climb', ('AC', 12), 'DoubleJump', ('HC', 7)}), frozenset({('HC', 4), 'ChargeJump', 'DoubleJump'})}}, 'insane': {'GinsoEscapeComplete': {frozenset({('HC', 9), ('AC', 12), 'DoubleJump'})}}}, 'GinsoInnerDoor': {'casual-core': {'LowerGinsoTree': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-core': {'LowerGinsoTree': {frozenset({'DoubleJump'})}}, 'master-abilities': {'LowerGinsoTree': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}}}, 'GinsoMiniBossDoor': {'casual-core': {'BashTreeDoorClosed': {frozenset({'Free'})}}}, 'GinsoTeleporter': {'casual-core': {'TopGinsoTree': {frozenset({'Bash', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'GinsoKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'GinsoKey', 'DoubleJump'}), frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoDoorClosed': {frozenset({'Open'})}}, 'standard-core': {'TopGinsoTree': {frozenset({'Grenade', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'GinsoKey', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'TopGinsoTree': {frozenset({'Stomp', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'GinsoKey', 'ChargeJump'})}}, 'master-abilities': {'TopGinsoTree': {frozenset({'ChargeFlame', ('AC', 12), 'GinsoKey', 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'GinsoKey', 'DoubleJump'}), frozenset({'Stomp', 'GinsoKey', 'DoubleJump', ('AC', 12)})}}}, 'GladesLaserArea': {'casual-core': {'MidSpiritCaverns': {frozenset({('EC', 4), 'DoubleJump'}), frozenset({('EC', 4), 'WallJump'}), frozenset({'Grenade', 'Bash', ('EC', 4)}), frozenset({'Climb', ('EC', 4)}), frozenset({'ChargeJump', ('EC', 4)})}}, 'expert-core': {'MidSpiritCaverns': {frozenset({'Dash', ('EC', 4)})}}, 'dbash': {'MidSpiritCaverns': {frozenset({'Bash', ('EC', 4)})}}, 'timed-level': {'MidSpiritCaverns': {frozenset({'Climb', ('EC', 2)}), frozenset({('EC', 2), 'WallJump'}), frozenset({('EC', 2), 'DoubleJump'}), frozenset({('EC', 2), 'Dash'}), frozenset({('EC', 2), 'ChargeJump'}), frozenset({('EC', 2), 'Bash'})}}}, 'GladesMain': {'casual-core': {'GladesMainAttic': {frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesLaserArea': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'LowerChargeFlameArea': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'standard-core': {'GladesMainAttic': {frozenset({'DoubleJump', 'WallJump'})}}, 'expert-core': {'GladesMainAttic': {frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash'})}, 'GladesLaserArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'GladesMainAttic': {frozenset({'Dash', ('AC', 6)})}, 'GladesLaserArea': {frozenset({'Dash', ('AC', 6)})}, 'LowerChargeFlameArea': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'GladesMainAttic': {frozenset({'Bash'})}, 'GladesLaserArea': {frozenset({'Bash'})}}, 'master-core': {'GladesMainAttic': {frozenset({'DoubleJump'})}}}, 'GladesMainAttic': {'glitched': {'LowerChargeFlameArea': {frozenset({'Dash'})}}}, 'GrenadeAreaAccess': {'casual-core': {'GrenadeArea': {frozenset({'Dash'})}, 'LowerBlackroot': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'})}}, 'expert-core': {'GrenadeArea': {frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'gjump': {'GrenadeArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'glitched': {'GrenadeArea': {frozenset({'Free'})}}, 'insane': {'GrenadeArea': {frozenset({'Free'})}}, 'casual-dboost': {'LowerBlackroot': {frozenset({'Free'})}}, 'standard-core': {'LowerBlackroot': {frozenset({'Grenade', 'Bash'})}}, 'expert-abilities': {'LowerBlackroot': {frozenset({'Dash', ('AC', 3)})}}, 'dbash': {'LowerBlackroot': {frozenset({'Bash'})}}}, 'GumoHideout': {'casual-core': {'DoubleJumpKeyDoor': {frozenset({('KS', 2)})}, 'LeftGumoHideout': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'})}, 'SideFallCell': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'ChargeJump', 'WallJump'})}}, 'expert-core': {'LeftGumoHideout': {frozenset({'ChargeJump'})}}, 'master-core': {'LeftGumoHideout': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}, 'LowerLeftGumoHideout': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}}, 'master-abilities': {'LeftGumoHideout': {frozenset({('AC', 12), 'DoubleJump'})}}, 'dbash': {'SideFallCell': {frozenset({'Bash'})}}}, 'GumoHideoutRedirectArea': {'casual-core': {'GumoHideoutRedirectEnergyVault': {frozenset({('EC', 4)})}}, 'glitched': {'GumoHideoutRedirectEnergyVault': {frozenset({'Free'})}}}, 'HollowGrove': {'casual-core': {'SpiderWaterArea': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'SwampTeleporter': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'OuterSwampUpperArea': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'HoruFields': {frozenset({'Bash'})}, 'Iceless': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'standard-core': {'SpiderWaterArea': {frozenset({'Bash'})}, 'HoruFields': {frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'master-core': {'SpiderWaterArea': {frozenset({'Free'})}, 'SwampTeleporter': {frozenset({'DoubleJump'})}, 'OuterSwampUpperArea': {frozenset({'DoubleJump'})}, 'HoruFields': {frozenset({'DoubleJump'})}, 'Iceless': {frozenset({'DoubleJump'}), frozenset({'WallJump'})}}, 'standard-abilities': {'HoruFields': {frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}}, 'expert-core': {'HoruFields': {frozenset({'ChargeJump'}), frozenset({'WallJump'})}}, 'expert-abilities': {'HoruFields': {frozenset({'Climb', 'Dash', ('AC', 3)})}, 'Iceless': {frozenset({'Dash', ('AC', 6)})}}, 'standard-lure': {'Iceless': {frozenset({'Bash'})}}, 'master-lure': {'MoonGrottoStompPlantAccess': {frozenset({'Dash', ('AC', 6)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'DoubleJump'}), frozenset({'Glide', 'WallJump'})}}}, 'HoruBasement': {'casual-core': {'HoruEscapeOuterDoor': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Dash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}}, 'HoruFields': {'casual-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}, 'HoruOuterDoor': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'})}, 'HoruOuterDoor': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}}, 'standard-abilities': {'HoruFieldsPushBlock': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)}), frozenset({'WallJump', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-abilities': {'HoruFieldsPushBlock': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 4)}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Glide', 'ChargeJump'})}}, 'dbash': {'HoruFieldsPushBlock': {frozenset({'Bash'})}}, 'master-abilities': {'HoruFieldsPushBlock': {frozenset({('EC', 4), ('AC', 12), 'Climb', 'Dash', 'DoubleJump'}), frozenset({('AC', 12), 'Dash', ('EC', 5), 'DoubleJump', 'WallJump'})}, 'HoruOuterDoor': {frozenset({('AC', 12), 'Dash', ('EC', 3), 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'gjump': {'HoruFieldsPushBlock': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruOuterDoor': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'HoruOuterDoor': {frozenset({'Bash'})}}}, 'HoruFieldsPushBlock': {'master-lure': {'HollowGrove': {frozenset({'Bash'})}}}, 'HoruInnerDoor': {'casual-core': {'HoruMapLedge': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'L1OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'L2OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'L3OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'L4OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Open', 'ChargeJump'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'R1OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'R2OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'R3OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'R4OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump'})}, 'HoruBasement': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'HoruTeleporter': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}}, 'expert-core': {'HoruMapLedge': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'L1OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'L2OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'L3OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'L4OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'R1OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'R2OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'R3OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'R4OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'HoruBasement': {frozenset({'Free'})}, 'HoruTeleporter': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}}, 'dbash': {'HoruMapLedge': {frozenset({'Bash'})}, 'L1OuterDoor': {frozenset({'Bash'})}, 'L2OuterDoor': {frozenset({'Open', 'Bash'})}, 'L3OuterDoor': {frozenset({'Open', 'Bash'})}, 'R1OuterDoor': {frozenset({'Bash'})}, 'R2OuterDoor': {frozenset({'Open', 'Bash'})}, 'R3OuterDoor': {frozenset({'Open', 'Bash'})}, 'R4OuterDoor': {frozenset({'Open', 'Bash'})}}, 'master-dboost': {'HoruMapLedge': {frozenset({('AC', 12), ('HC', 1), 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L1OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L2OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'L3OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'L4OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'R1OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R2OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R3OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'R4OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'HoruBasement': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'HoruTeleporter': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'L2OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L3OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R2OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Dash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'Dash', 'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'})}, 'R3OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'expert-dboost': {'L2OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'L3OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'R3OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}}, 'expert-abilities': {'L2OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'L3OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'L4OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'R2OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'R3OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'R4OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash'})}}, 'master-abilities': {'L2OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'L3OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'R2OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'R3OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}}, 'gjump': {'L2OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'L3OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'R2OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'R3OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}}}, 'HoruL4LavaChasePeg': {'casual-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Stomp'})}}, 'standard-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'HoruL4CutscenePeg': {frozenset({'Climb', 'Bash', 'Stomp', 'DoubleJump'})}}, 'expert-abilities': {'HoruL4CutscenePeg': {frozenset({('AC', 6), 'Dash', ('EC', 2), 'Bash', 'Stomp'})}}, 'master-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'DoubleJump'})}}}, 'HoruOuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'HoruKey'})}, 'HoruFieldsPushBlock': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'HoruFieldsPushBlock': {frozenset({'Dash', 'DoubleJump', 'Bash'})}}, 'standard-abilities': {'HoruFieldsPushBlock': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)}), frozenset({'WallJump', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-abilities': {'HoruFieldsPushBlock': {frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}, 'master-core': {'HoruFieldsPushBlock': {frozenset({'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'HoruFieldsPushBlock': {frozenset({'Bash', ('AC', 12), 'DoubleJump'})}}, 'gjump': {'HoruFieldsPushBlock': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'HoruR1CutsceneTrigger': {'glitched': {'LowerGinsoTree': {frozenset({'Dash'})}}}, 'HoruR1MapstoneSecret': {'casual-core': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}}, 'expert-core': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-dboost': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'ChargeJump', 'DoubleJump', ('HC', 2)}), frozenset({('AC', 6), ('EC', 1), 'Dash', ('HC', 2), 'ChargeJump'})}}, 'dbash': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'Dash', ('AC', 3)}), frozenset({'Bash', 'DoubleJump'})}}, 'master-core': {'HoruR1CutsceneTrigger': {frozenset({'Bash', 'DoubleJump'})}}, 'master-dboost': {'HoruR1CutsceneTrigger': {frozenset({('HC', 4), ('EC', 4), ('AC', 12), 'Dash', 'DoubleJump'})}}, 'gjump': {'HoruR1CutsceneTrigger': {frozenset({('AC', 12), 'Climb', 'Grenade', 'Glide', 'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 2), 'Grenade', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 6)}), frozenset({('AC', 12), 'Climb', 'Grenade', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', ('HC', 2), 'Grenade', 'Glide', 'ChargeJump'})}}}, 'HoruR3ElevatorLever': {'casual-core': {'HoruR3CutsceneTrigger': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Glide', 'WallJump'})}}, 'casual-dboost': {'HoruR3CutsceneTrigger': {frozenset({'Climb', ('HC', -1), 'ChargeJump'})}}, 'standard-core': {'HoruR3CutsceneTrigger': {frozenset({'WallJump'})}}, 'master-core': {'HoruR3CutsceneTrigger': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-abilities': {'HoruR3CutsceneTrigger': {frozenset({('AC', 12), 'DoubleJump'})}, 'HoruR3PlantCove': {frozenset({'Glide', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump', ('EC', 1)}), frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 1)})}}}, 'HoruR4PuzzleEntrance': {'casual-core': {'HoruR4CutsceneTrigger': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-abilities': {'HoruR4CutsceneTrigger': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 2)})}}, 'gjump': {'HoruR4CutsceneTrigger': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'HoruR4StompHideout': {'casual-core': {'HoruR4PuzzleEntrance': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-abilities': {'HoruR4PuzzleEntrance': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Bash', 'Dash', ('AC', 3)})}}, 'expert-dboost': {'HoruR4PuzzleEntrance': {frozenset({'ChargeJump', ('HC', 2)}), frozenset({'Bash', ('HC', 2)})}, 'HoruR4CutsceneTrigger': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 2)})}}, 'dbash': {'HoruR4PuzzleEntrance': {frozenset({'Bash'})}, 'HoruR4CutsceneTrigger': {frozenset({'Bash'})}}, 'master-dboost': {'HoruR4PuzzleEntrance': {frozenset({('AC', 12), 'DoubleJump', ('HC', 1)})}}, 'gjump': {'HoruR4PuzzleEntrance': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-core': {'HoruR4CutsceneTrigger': {frozenset({'Bash', 'ChargeJump'})}}}, 'HoruTeleporter': {'casual-core': {'HoruInnerDoor': {frozenset({'Climb', 'Open', 'ChargeJump'}), frozenset({'Open', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Open', 'Bash'})}}, 'dbash': {'HoruInnerDoor': {frozenset({'Open', 'Bash'})}}, 'master-core': {'HoruInnerDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'HoruInnerDoor': {frozenset({'Open', ('AC', 12), 'DoubleJump', 'WallJump'})}}}, 'Iceless': {'casual-core': {'UpperGrotto': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'UpperGrotto': {frozenset({'Grenade', 'Bash'})}}, 'standard-dboost': {'UpperGrotto': {frozenset({('HC', 1)})}}, 'gjump': {'UpperGrotto': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'InnerSwampAboveDrainArea': {'casual-core': {'InnerSwampDrainBroken': {frozenset({'ChargeFlame', 'Water'}), frozenset({'Grenade'})}}, 'casual-dboost': {'InnerSwampDrainBroken': {frozenset({'ChargeFlame'})}}}, 'InnerSwampDrainBroken': {'casual-core': {'Swamp': {frozenset({'Climb', 'ChargeJump', 'Water'}), frozenset({'Climb', 'Bash', 'Grenade', 'Water'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump', 'Water'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'WallJump', 'Water'})}}, 'casual-dboost': {'Swamp': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Water'}), frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'Swamp': {frozenset({'DoubleJump', 'Water'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'expert-dboost': {'Swamp': {frozenset({'ChargeJump'}), frozenset({'Climb', ('HC', 0), 'Water'})}}, 'master-core': {'Swamp': {frozenset({'Bash'})}}, 'standard-core': {'Swamp': {frozenset({'Climb', 'DoubleJump', 'Water'})}}, 'standard-abilities': {'Swamp': {frozenset({'Climb', 'Dash', ('AC', 3), 'Water'}), frozenset({'Dash', ('AC', 3), 'WallJump', 'Water'})}}, 'master-dboost': {'Swamp': {frozenset({('HC', 10), 'WallJump'}), frozenset({'Climb', ('HC', 4), ('AC', 12)}), frozenset({'Climb', ('HC', 10)}), frozenset({('HC', 10), 'DoubleJump'}), frozenset({('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({('HC', 4), ('AC', 12), 'WallJump'})}}}, 'L2OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'L3OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'L4': {'casual-core': {'HoruL4LavaChasePeg': {frozenset({'Bash'})}}, 'expert-core': {'HoruL4CutscenePeg': {frozenset({'Free'})}}}, 'LeftGlades': {'casual-core': {'UpperLeftGlades': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'standard-lure': {'UpperLeftGlades': {frozenset({'Bash'})}}, 'expert-core': {'UpperLeftGlades': {frozenset({'DoubleJump'})}}}, 'LeftGumoHideout': {'casual-core': {'WaterVeinArea': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'})}}, 'standard-core': {'WaterVeinArea': {frozenset({'Climb', 'DoubleJump'})}}, 'standard-abilities': {'WaterVeinArea': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'master-core': {'WaterVeinArea': {frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}}}, 'LeftSorrow': {'casual-core': {'LeftSorrowKeystones': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide'})}}, 'expert-dboost': {'LeftSorrowKeystones': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}}, 'master-dboost': {'LeftSorrowKeystones': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)})}}, 'master-abilities': {'LeftSorrowKeystones': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}, 'master-core': {'LeftSorrowKeystones': {frozenset({'Bash'})}}}, 'LeftSorrowKeystones': {'casual-core': {'LeftSorrowMiddleDoor': {frozenset({('KS', 4)})}}, 'standard-core': {'MiddleSorrow': {frozenset({'Bash', 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'Dash', 'DoubleJump'})}}, 'expert-abilities': {'MiddleSorrow': {frozenset({'Bash', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Bash', ('AC', 6), 'Dash'})}}, 'dbash': {'MiddleSorrow': {frozenset({'Bash'})}}, 'master-abilities': {'MiddleSorrow': {frozenset({'ChargeJump', ('AC', 12), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'Stomp', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 12), 'Climb', 'Stomp', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', 'ChargeJump', 'WallJump'})}}}, 'LeftSorrowLowerDoor': {'casual-core': {'LeftSorrow': {frozenset({'Glide', 'Stomp', 'Bash'})}}, 'standard-core': {'LeftSorrow': {frozenset({'Climb', 'Bash', 'ChargeJump', 'Stomp'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'ChargeJump', 'Stomp', 'WallJump'})}}, 'expert-dboost': {'LeftSorrow': {frozenset({'Climb', 'ChargeJump', ('HC', 2)})}}, 'dbash': {'LeftSorrow': {frozenset({'Bash', 'Stomp', ('HC', 2)}), frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}}}, 'LeftSorrowMiddleDoor': {'casual-core': {'MiddleSorrow': {frozenset({'Bash', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Climb', 'Bash', 'Stomp', 'DoubleJump'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'})}}, 'standard-core': {'MiddleSorrow': {frozenset({'Climb', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'WallJump'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}}, 'expert-dboost': {'MiddleSorrow': {frozenset({'Climb', ('HC', 2), 'Bash', 'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'MiddleSorrow': {frozenset({('AC', 6), 'Climb', 'Dash', 'Bash', 'ChargeJump'}), frozenset({('AC', 6), 'Bash', 'Stomp', 'Dash'})}}, 'master-dboost': {'MiddleSorrow': {frozenset({('AC', 12), 'Climb', 'Bash', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'glitched': {'MiddleSorrow': {frozenset({'Dash'})}}}, 'LostGrove': {'casual-core': {'LostGroveExit': {frozenset({'Grenade', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}}, 'casual-dboost': {'LostGroveExit': {frozenset({'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'})}}, 'expert-core': {'LostGroveExit': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Glide', 'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'WallJump'})}}, 'expert-dboost': {'LostGroveExit': {frozenset({'Grenade', ('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Dash', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', ('HC', 4)}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'WallJump'})}}, 'expert-abilities': {'LostGroveExit': {frozenset({'Climb', 'Dash', 'Grenade', 'ChargeJump', ('AC', 3)})}}, 'master-abilities': {'LostGroveExit': {frozenset({'Grenade', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump', 'WallJump'})}}, 'gjump': {'LostGroveExit': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}}}, 'LowerBlackroot': {'casual-core': {'LostGrove': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Grenade'})}}, 'expert-core': {'LostGrove': {frozenset({'Grenade', 'DoubleJump'})}}}, 'LowerChargeFlameArea': {'casual-core': {'GladesMain': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'ChargeFlameAreaStump': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'standard-core': {'GladesMain': {frozenset({'Stomp'})}}, 'expert-abilities': {'GladesMain': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'ChargeFlameAreaStump': {frozenset({'DoubleJump'})}}, 'master-lure': {'ChargeFlameAreaStump': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', ('AC', 6), 'Dash'}), frozenset({'Bash', 'Stomp'})}}}, 'LowerGinsoTree': {'casual-core': {'GinsoMiniBossDoor': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide'}), frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'}), frozenset({'Glide', 'WallJump'})}}, 'standard-dboost': {'GinsoMiniBossDoor': {frozenset({'Climb', ('HC', 0)}), frozenset({('HC', 0), 'WallJump'}), frozenset({'ChargeJump', ('HC', 0)})}}, 'standard-abilities': {'GinsoMiniBossDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'expert-core': {'GinsoMiniBossDoor': {frozenset({'WallJump'})}}, 'master-core': {'GinsoMiniBossDoor': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}, 'glitched': {'R4InnerDoor': {frozenset({'Dash'})}}}, 'LowerLeftGumoHideout': {'glitched': {'LowerBlackroot': {frozenset({'Dash'})}}}, 'LowerSorrow': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'DoubleJump'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Bash', 'WallJump'})}, 'SorrowMapstoneArea': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'LeftSorrowLowerDoor': {frozenset({('KS', 4)})}, 'LeftSorrow': {frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}, 'MiddleSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'WilhelmLedge': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}, 'MiddleSorrow': {frozenset({'Glide', 'Bash'})}}, 'expert-dboost': {'WilhelmLedge': {frozenset({'Glide', ('HC', 2)}), frozenset({'DoubleJump', ('HC', 2)})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Dash', ('AC', 6)})}, 'LeftSorrow': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'Stomp', 'ChargeJump'}), frozenset({('AC', 6), 'Dash', 'ChargeJump', 'DoubleJump'}), frozenset({('EC', 2), 'Dash', 'ChargeJump', ('AC', 6)})}, 'MiddleSorrow': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'WilhelmLedge': {frozenset({'Bash'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Bash'})}, 'SorrowMapstoneArea': {frozenset({'Bash'})}, 'LeftSorrow': {frozenset({'Bash'})}, 'SunstoneArea': {frozenset({'Glide', 'Bash'})}}, 'master-dboost': {'WilhelmLedge': {frozenset({'Glide', ('AC', 12), ('HC', 1)})}, 'LeftSorrow': {frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}}, 'master-abilities': {'WilhelmLedge': {frozenset({('AC', 12), 'DoubleJump'})}, 'LeftSorrow': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}, 'standard-lure': {'SorrowMapstoneArea': {frozenset({'Climb', 'Glide'}), frozenset({'Glide', 'WallJump'})}}, 'gjump': {'LeftSorrow': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'MiddleSorrow': {frozenset({'Bash'})}}, 'glitched': {'MiddleSorrow': {frozenset({'Glide', 'ChargeJump'})}}}, 'LowerSpiritCaverns': {'casual-core': {'MidSpiritCaverns': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'GladesLaserArea': {frozenset({'Bash', ('EC', 4)})}, 'SpiritCavernsDoor': {frozenset({'Open'})}}, 'expert-core': {'MidSpiritCaverns': {frozenset({'Bash', 'Dash'})}}, 'dbash': {'MidSpiritCaverns': {frozenset({'Bash'})}}, 'master-core': {'MidSpiritCaverns': {frozenset({'DoubleJump'})}}}, 'LowerValley': {'casual-core': {'LowerValleyPlantApproach': {frozenset({'Glide', 'Wind'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'DoubleJump'})}, 'MistyEntrance': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Wind'})}, 'ValleyTeleporter': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'DoubleJump'})}}, 'standard-lure': {'LowerValleyPlantApproach': {frozenset({'Bash'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}}, 'standard-core': {'ValleyThreeBirdLever': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}, 'MistyEntrance': {frozenset({'Climb', 'Bash', 'Grenade'})}, 'ValleyTeleporter': {frozenset({'Climb', 'Bash', 'Grenade', 'OpenWorld'}), frozenset({'OpenWorld', 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'ValleyThreeBirdLever': {frozenset({('HC', 1)})}}, 'expert-dboost': {'ValleyThreeBirdLever': {frozenset({('HC', -1)})}}, 'dbash': {'ValleyThreeBirdLever': {frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'MistyEntrance': {frozenset({'Dash', ('AC', 6)})}, 'ValleyTeleporter': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}, 'master-lure': {'MistyEntrance': {frozenset({'Bash'})}, 'ValleyTeleporter': {frozenset({'Bash', 'OpenWorld'})}}}, 'MidSpiritCaverns': {'casual-core': {'GladesLaserArea': {frozenset({('EC', 4)})}, 'UpperSpiritCaverns': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'glitched': {'GladesLaserArea': {frozenset({('EC', 3)})}}, 'casual-dboost': {'UpperSpiritCaverns': {frozenset({'DoubleJump'})}}, 'standard-core': {'UpperSpiritCaverns': {frozenset({'Bash'})}}}, 'MiddleSorrow': {'casual-core': {'UpperSorrow': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Stomp'})}, 'LowerSorrow': {frozenset({'Stomp'})}}, 'gjump': {'UpperSorrow': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'UpperSorrow': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'ChargeJump', ('HC', 2)})}}, 'master-dboost': {'UpperSorrow': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)})}}, 'expert-abilities': {'LeftSorrow': {frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'})}, 'LeftSorrowKeystones': {frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}, 'LowerSorrow': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-core': {'SorrowMainShaftKeystoneArea': {frozenset({'Climb', 'ChargeJump'})}, 'LowerSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'SorrowMainShaftKeystoneArea': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'LowerSorrow': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'SunstoneArea': {frozenset({'Glide', 'Bash'})}}}, 'MistyAbove200xp': {'casual-core': {'MistyBeforeMiniBoss': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'MistyBeforeMiniBoss': {frozenset({'Grenade', 'Bash'}), frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'MistyBeforeMiniBoss': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'MistyBeforeMiniBoss': {frozenset({'Bash'})}}}, 'MistyBeforeDocks': {'casual-core': {'MistyAbove200xp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'})}}, 'standard-core': {'MistyAbove200xp': {frozenset({'Glide', 'ChargeJump'})}}, 'standard-abilities': {'MistyAbove200xp': {frozenset({'Bash', ('AC', 6), 'Dash'}), frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-abilities': {'MistyAbove200xp': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'MistyAbove200xp': {frozenset({'Bash'})}}}, 'MistyBeforeMiniBoss': {'casual-core': {'MistyOrbRoom': {frozenset({('KS', 4)})}}}, 'MistyEntrance': {'casual-core': {'MistyPostFeatherTutorial': {frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-core': {'MistyPostFeatherTutorial': {frozenset({'Glide', 'Bash'})}}, 'standard-abilities': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', 'Glide', ('AC', 3), 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-dboost': {'MistyPostFeatherTutorial': {frozenset({('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'MistyPostFeatherTutorial': {frozenset({'Dash', ('AC', 6), ('EC', 4)}), frozenset({'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'master-core': {'MistyPostFeatherTutorial': {frozenset({'Bash'})}}, 'gjump': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 1)})}}}, 'MistyKeystone3Ledge': {'casual-core': {'MistyPreLasers': {frozenset({'Glide'})}}, 'standard-abilities': {'MistyPreLasers': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}}, 'expert-core': {'MistyPreLasers': {frozenset({'Grenade', 'Bash'}), frozenset({'Dash', 'DoubleJump'})}}, 'expert-dboost': {'MistyPreLasers': {frozenset({'ChargeJump', ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'MistyPreLasers': {frozenset({('HC', 4), 'WallJump'})}}, 'gjump': {'MistyPreLasers': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}}}, 'MistyKeystone4Ledge': {'casual-core': {'MistyBeforeDocks': {frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'Glide'}), frozenset({'Climb', 'Bash', 'Glide', 'DoubleJump'})}}, 'standard-core': {'MistyBeforeDocks': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'})}}, 'master-abilities': {'MistyBeforeDocks': {frozenset({'Dash', ('AC', 6)})}}, 'master-dboost': {'MistyBeforeDocks': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 7)})}}, 'master-lure': {'MistyBeforeDocks': {frozenset({'Bash'})}}}, 'MistyMortarSpikeCave': {'casual-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}}, 'standard-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash'})}}, 'expert-abilities': {'MistyKeystone4Ledge': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'master-core': {'MistyKeystone4Ledge': {frozenset({'Bash'})}}, 'master-abilities': {'MistyKeystone4Ledge': {frozenset({'Dash', ('AC', 6)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}}, 'MistyOrbRoom': {'casual-core': {'MistyPreKeystone2': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'master-core': {'MistyPreKeystone2': {frozenset({'DoubleJump'})}}}, 'MistyPostClimb': {'casual-core': {'MistySpikeCave': {frozenset({'Climb', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'MistySpikeCave': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'MistySpikeCave': {frozenset({'ChargeJump'})}}, 'expert-abilities': {'MistySpikeCave': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'dbash': {'MistySpikeCave': {frozenset({'Bash'})}}, 'master-core': {'MistySpikeCave': {frozenset({'DoubleJump'})}}}, 'MistyPostFeatherTutorial': {'casual-core': {'MistyPostKeystone1': {frozenset({'Free'})}}}, 'MistyPostKeystone1': {'casual-core': {'MistyPreMortarCorridor': {frozenset({'Glide', 'Bash'})}}, 'expert-core': {'MistyPreMortarCorridor': {frozenset({'Glide'})}}, 'expert-dboost': {'MistyPreMortarCorridor': {frozenset({('HC', 6)}), frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-core': {'MistyPreMortarCorridor': {frozenset({'Bash'})}}, 'master-abilities': {'MistyPreMortarCorridor': {frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump'})}}, 'master-dboost': {'MistyPreMortarCorridor': {frozenset({('HC', 3)}), frozenset({('AC', 12), ('HC', 1)})}}}, 'MistyPostLasers': {'casual-core': {'MistyMortarSpikeCave': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'standard-core': {'MistyMortarSpikeCave': {frozenset({'Glide', 'Bash'})}}, 'expert-core': {'MistyMortarSpikeCave': {frozenset({'Glide'})}}, 'master-core': {'MistyMortarSpikeCave': {frozenset({'Bash'})}}}, 'MistyPostMortarCorridor': {'casual-core': {'MistyPrePlantLedge': {frozenset({'Bash'})}}, 'standard-core': {'MistyPrePlantLedge': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'})}}, 'master-core': {'MistyPrePlantLedge': {frozenset({'DoubleJump'})}}, 'master-abilities': {'MistyPrePlantLedge': {frozenset({'Dash', ('AC', 6)})}}}, 'MistyPreClimb': {'casual-core': {'MistyPostClimb': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Stomp'})}}, 'expert-core': {'MistyPostClimb': {frozenset({'Grenade', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}}, 'master-core': {'MistyPostClimb': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump'})}}, 'glitched': {'ForlornTeleporter': {frozenset({'Dash'})}, 'RightForlorn': {frozenset({'Dash'})}}}, 'MistyPreLasers': {'casual-core': {'MistyPostLasers': {frozenset({'Climb', 'Glide', 'WallJump'})}}, 'standard-core': {'MistyPostLasers': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'expert-core': {'MistyPostLasers': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-core': {'MistyPostLasers': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}}, 'MistyPreMortarCorridor': {'casual-core': {'MistyPostMortarCorridor': {frozenset({'Glide'})}}, 'expert-dboost': {'MistyPostMortarCorridor': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', 'DoubleJump', ('AC', 3), ('HC', 1)})}}, 'master-core': {'MistyPostMortarCorridor': {frozenset({'Grenade', 'Bash', 'DoubleJump'})}}, 'master-abilities': {'MistyPostMortarCorridor': {frozenset({'Dash', ('AC', 6)})}}, 'master-dboost': {'MistyPostMortarCorridor': {frozenset({('AC', 12), ('HC', 6)}), frozenset({('HC', 7)})}}, 'glitched': {'RightForlorn': {frozenset({'Free'})}}}, 'MistyPrePlantLedge': {'casual-core': {'MistyPreClimb': {frozenset({'ChargeJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}}, 'standard-core': {'MistyPreClimb': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}}, 'expert-core': {'MistyPreClimb': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'master-core': {'MistyPreClimb': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}}, 'MistySpikeCave': {'casual-core': {'MistyKeystone3Ledge': {frozenset({'Climb', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'MistyKeystone3Ledge': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-core': {'MistyKeystone3Ledge': {frozenset({'DoubleJump'})}}, 'master-core': {'MistyKeystone3Ledge': {frozenset({'Bash'})}}, 'master-dboost': {'MistyKeystone3Ledge': {frozenset({'ChargeJump', ('HC', 1)})}}}, 'MoonGrotto': {'casual-core': {'MoonGrottoAboveTeleporter': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'DeathGauntlet': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'WaterVeinArea': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'MoonGrottoBelowTeleporter': {frozenset({'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'master-core': {'MoonGrottoAboveTeleporter': {frozenset({'DoubleJump'})}}, 'expert-abilities': {'MoonGrottoAboveTeleporter': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}}, 'standard-core': {'WaterVeinArea': {frozenset({'Dash'})}}, 'expert-core': {'WaterVeinArea': {frozenset({'WallJump'})}}, 'master-lure': {'WaterVeinArea': {frozenset({'Bash'})}}, 'standard-dboost': {'MoonGrottoBelowTeleporter': {frozenset({'Glide', ('HC', 1)})}}, 'standard-abilities': {'MoonGrottoBelowTeleporter': {frozenset({'Dash', ('AC', 3)})}}}, 'MoonGrottoAboveTeleporter': {'casual-core': {'UpperGrotto': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'})}, 'MoonGrottoSwampAccessArea': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'})}}, 'standard-core': {'UpperGrotto': {frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'UpperGrotto': {frozenset({'Climb', 'Glide'})}, 'MoonGrottoStompPlantAccess': {frozenset({'ChargeFlame'})}}, 'master-core': {'UpperGrotto': {frozenset({'DoubleJump'}), frozenset({'Bash', 'Dash', ('AC', 3)})}}, 'casual-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'DoubleJump'})}}, 'standard-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'ChargeJump', ('HC', 0)})}}, 'expert-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'Dash', ('HC', 1)})}}, 'expert-abilities': {'MoonGrottoSwampAccessArea': {frozenset({'Dash', ('AC', 6)})}}, 'gjump': {'MoonGrottoSwampAccessArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-lure': {'DeathGauntletRoof': {frozenset({'Bash'})}, 'MoonGrottoBelowTeleporter': {frozenset({'Bash'})}}}, 'MoonGrottoSwampAccessArea': {'casual-core': {'InnerSwampAboveDrainArea': {frozenset({'ChargeJump'})}}, 'standard-lure': {'InnerSwampAboveDrainArea': {frozenset({'Bash'})}}, 'expert-lure': {'InnerSwampAboveDrainArea': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Climb', 'ChargeFlame'})}}, 'master-lure': {'InnerSwampAboveDrainArea': {frozenset({'Grenade', 'DoubleJump'})}}}, 'OuterSwampAbilityCellNook': {'glitched': {'InnerSwampSkyArea': {frozenset({'Dash'})}}}, 'OuterSwampLowerArea': {'casual-core': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Bash'})}, 'OuterSwampUpperArea': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'OuterSwampAbilityCellNook': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'})}, 'OuterSwampMortarPlantAccess': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash'})}, 'SwampEntryArea': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'UpperGrotto': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'expert-abilities': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampUpperArea': {frozenset({'Dash', ('AC', 6)})}}, 'master-abilities': {'OuterSwampMortarAbilityCellLedge': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}, 'expert-core': {'OuterSwampUpperArea': {frozenset({'Climb'}), frozenset({'WallJump'})}}, 'standard-core': {'OuterSwampAbilityCellNook': {frozenset({'Climb'}), frozenset({'Bash'}), frozenset({'WallJump'})}}}, 'OuterSwampMortarAbilityCellLedge': {'expert-core': {'OuterSwampMortarPlantAccess': {frozenset({'ChargeFlame'})}}}, 'OuterSwampUpperArea': {'casual-core': {'GinsoOuterDoor': {frozenset({'GinsoKey'})}, 'OuterSwampAbilityCellNook': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'OuterSwampAbilityCellNook': {frozenset({'Free'})}}}, 'OutsideForlorn': {'casual-core': {'OutsideForlornCliff': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'})}, 'ForlornOuterDoor': {frozenset({'ForlornKey'})}}, 'expert-abilities': {'OutsideForlornCliff': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'OutsideForlornCliff': {frozenset({'Bash'})}}, 'master-core': {'OutsideForlornCliff': {frozenset({'ChargeJump', 'DoubleJump'})}}, 'glitched': {'RightForlorn': {frozenset({'Free'})}}}, 'OutsideForlornCliff': {'casual-core': {'ValleyForlornApproach': {frozenset({'Stomp', 'ChargeJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Bash'})}}, 'expert-core': {'ValleyForlornApproach': {frozenset({'ChargeFlame', 'Stomp', 'WallJump'}), frozenset({'ChargeFlame', 'Stomp', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump'})}}, 'master-core': {'ValleyForlornApproach': {frozenset({'Bash'})}}}, 'R1': {'casual-core': {'HoruR1MapstoneSecret': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'HoruR1MapstoneSecret': {frozenset({'Grenade', 'Bash'})}}, 'standard-abilities': {'HoruR1MapstoneSecret': {frozenset({'Dash', ('AC', 3)})}}, 'expert-dboost': {'HoruR1MapstoneSecret': {frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'Bash', ('HC', 2)}), frozenset({'Dash', ('HC', 2)})}}, 'master-dboost': {'HoruR1MapstoneSecret': {frozenset({'Dash', ('AC', 12), ('HC', 1)}), frozenset({('HC', 6)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)}), frozenset({'Bash', ('AC', 12), ('HC', 1)}), frozenset({('HC', 4), ('AC', 12)})}}, 'gjump': {'HoruR1MapstoneSecret': {frozenset({('AC', 12), 'Climb', 'Grenade', 'ChargeJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 2)}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'Grenade'})}}}, 'R1OuterDoor': {'expert-core': {'L1OuterDoor': {frozenset({'Free'})}}}, 'R3': {'casual-core': {'HoruR3ElevatorLever': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Climb'})}}, 'expert-core': {'HoruR3ElevatorLever': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'WallJump'})}}, 'master-abilities': {'HoruR3ElevatorLever': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}}, 'R3OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'R4': {'casual-core': {'HoruR4StompHideout': {frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Grenade'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-core': {'HoruR4StompHideout': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'HoruR4StompHideout': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', 'Stomp'})}}, 'expert-abilities': {'HoruR4StompHideout': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'expert-dboost': {'HoruR4StompHideout': {frozenset({('HC', 3), 'Bash'})}}, 'dbash': {'HoruR4StompHideout': {frozenset({'Bash'})}}}, 'RazielNoArea': {'casual-core': {'BlackrootGrottoConnection': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}, 'standard-core': {'BlackrootGrottoConnection': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'BlackrootGrottoConnection': {frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'})}}, 'expert-dboost': {'BlackrootGrottoConnection': {frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'glitched': {'BlackrootGrottoConnection': {frozenset({'Climb'})}, 'GumoHideout': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}}, 'SorrowBashLedge': {'casual-core': {'LowerSorrow': {frozenset({'Glide', 'Wind'})}}, 'expert-lure': {'LowerSorrow': {frozenset({'Climb', 'Dash', 'Glide', 'DoubleJump', 'Bash'}), frozenset({'Dash', 'Glide', 'DoubleJump', 'WallJump', 'Bash'})}}, 'dbash': {'LowerSorrow': {frozenset({'Bash'})}}, 'expert-dboost': {'LowerSorrow': {frozenset({'Climb', 'ChargeJump', ('HC', 6)}), frozenset({'ChargeJump', ('HC', 6), 'WallJump'})}}, 'master-dboost': {'LowerSorrow': {frozenset({('AC', 12), ('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', ('AC', 12)}), frozenset({('AC', 12), ('HC', 10), 'DoubleJump', 'WallJump'})}}}, 'SorrowMapstoneArea': {'glitched': {'HoruInnerDoor': {frozenset({'Dash'})}}}, 'SorrowTeleporter': {'casual-core': {'BelowSunstoneArea': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'AboveChargeJumpArea': {frozenset({'Climb', 'Stomp', 'ChargeJump'})}}, 'standard-core': {'BelowSunstoneArea': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'AboveChargeJumpArea': {frozenset({'Climb', 'ChargeJump'})}}, 'gjump': {'BelowSunstoneArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'BelowSunstoneArea': {frozenset({'Grenade', 'Stomp', ('HC', 2), 'Bash'}), frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'Glide', 'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'WallJump', 'Dash', ('HC', 2), 'ChargeJump', ('AC', 3)})}, 'AboveChargeJumpArea': {frozenset({('HC', 2), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'master-core': {'BelowSunstoneArea': {frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'Stomp', 'Bash'})}, 'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Stomp', 'Bash'})}}, 'master-dboost': {'BelowSunstoneArea': {frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'ChargeJump', 'WallJump'}), frozenset({('AC', 12), ('HC', 1), 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), ('HC', 1), 'Glide', 'ChargeJump', 'WallJump'})}}, 'expert-core': {'AboveChargeJumpArea': {frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'})}}, 'expert-abilities': {'AboveChargeJumpArea': {frozenset({'WallJump', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}}, 'SpiderSacArea': {'casual-core': {'SpiderSacTetherArea': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'SpiderWaterArea': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'SpiderSacEnergyNook': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'SpiritTreeRefined': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Climb'})}}, 'master-core': {'SpiderSacTetherArea': {frozenset({'DoubleJump'})}, 'SpiritTreeRefined': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}}, 'expert-abilities': {'SpiderWaterArea': {frozenset({'Dash', ('AC', 3)})}, 'SpiderSacEnergyNook': {frozenset({'Dash', ('AC', 3)})}}, 'standard-core': {'SpiritTreeRefined': {frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}}, 'SpiderSacEnergyNook': {'master-abilities': {'ChargeFlameAreaPlantAccess': {frozenset({'ChargeFlame', ('AC', 3)})}}}, 'SpiderSacTetherArea': {'casual-core': {'SpiderWaterArea': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SpiderSacEnergyNook': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-abilities': {'SpiderWaterArea': {frozenset({'Grenade', 'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'SpiderSacEnergyNook': {frozenset({'Grenade', 'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}}, 'SpiderWaterArea': {'casual-core': {'SpiderSacEnergyNook': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'SpiderSacArea': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}, 'HollowGrove': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'DeathGauntletRoof': {frozenset({'Stomp', 'WallJump', 'Water'}), frozenset({'Bash', 'Stomp', 'Water'}), frozenset({'Climb', 'Stomp', 'Water'})}}, 'standard-core': {'SpiderSacEnergyNook': {frozenset({'Dash', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'})}, 'SpiderSacArea': {frozenset({'Climb', 'Bash'}), frozenset({'Glide', 'Dash', 'WallJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Climb', 'Dash', 'Glide'})}, 'HollowGrove': {frozenset({'Bash'})}}, 'expert-core': {'SpiderSacEnergyNook': {frozenset({'DoubleJump'})}}, 'dbash': {'SpiderSacEnergyNook': {frozenset({'Bash'})}, 'SpiderSacArea': {frozenset({'Bash'})}}, 'expert-abilities': {'SpiderSacEnergyNook': {frozenset({'Dash', ('AC', 3)})}, 'SpiderSacArea': {frozenset({'Dash', ('AC', 6)})}}, 'gjump': {'SpiderSacEnergyNook': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'SpiderSacArea': {frozenset({'Climb', 'ChargeJump'})}}, 'master-abilities': {'HollowGrove': {frozenset({'Dash', ('AC', 6)})}}, 'expert-dboost': {'DeathGauntletRoof': {frozenset({'Climb', 'Stomp', ('HC', 2)}), frozenset({'Stomp', 'WallJump', ('HC', 2)}), frozenset({'Bash', 'Stomp', ('HC', 1)}), frozenset({'Stomp', 'DoubleJump', ('HC', 2)})}}, 'master-dboost': {'DeathGauntletRoof': {frozenset({'Climb', 'Stomp', ('AC', 12)}), frozenset({'Stomp', ('AC', 12), 'WallJump'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}}}, 'SpiritCavernsDoor': {'casual-core': {'SpiritCavernsDoorOpened': {frozenset({('KS', 2)})}}}, 'SpiritCavernsDoorOpened': {'casual-core': {'LowerSpiritCaverns': {frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'})}}, 'standard-lure': {'LowerSpiritCaverns': {frozenset({'Bash'})}}, 'expert-abilities': {'LowerSpiritCaverns': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'LowerSpiritCaverns': {frozenset({'DoubleJump'})}}}, 'SpiritTreeDoor': {'casual-core': {'SpiritTreeDoorOpened': {frozenset({('KS', 4)})}}}, 'SpiritTreeDoorOpened': {'casual-core': {'SpiritTreeRefined': {frozenset({'Climb'}), frozenset({'Bash'}), frozenset({'WallJump'})}}, 'casual-dboost': {'SpiritTreeRefined': {frozenset({'ChargeJump'})}}, 'master-core': {'SpiritTreeRefined': {frozenset({'DoubleJump'})}}}, 'SpiritTreeRefined': {'casual-core': {'SpiritTreeDoor': {frozenset({'Open'})}, 'ValleyEntry': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SpiderSacArea': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'ChargeFlame', 'Climb', 'Glide'}), frozenset({'Grenade', 'WallJump'}), frozenset({'ChargeFlame', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Climb', 'Dash'}), frozenset({'Grenade', 'Climb', 'Glide'}), frozenset({'Grenade', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Climb', 'Dash'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'ChargeJump'})}}, 'standard-core': {'ValleyEntry': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'expert-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacArea': {frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'WallJump'})}}, 'expert-core': {'SpiderSacArea': {frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'Climb'})}}, 'master-core': {'SpiderSacArea': {frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}}, 'master-abilities': {'SpiderSacArea': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}}}, 'SunkenGladesRunaway': {'casual-core': {'GladesMain': {frozenset({('KS', 2)}), frozenset({'OpenWorld'})}, 'BlackrootDarknessRoom': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'DeathGauntletDoor': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'SpiritTreeRefined': {frozenset({'TPGrove'})}, 'MoonGrotto': {frozenset({'TPGrotto'})}, 'SwampTeleporter': {frozenset({'TPSwamp'})}, 'ValleyTeleporter': {frozenset({'TPValley'})}, 'SorrowTeleporter': {frozenset({'TPSorrow'})}, 'GinsoTeleporter': {frozenset({'TPGinso'})}, 'ForlornTeleporter': {frozenset({'TPForlorn'})}, 'HoruTeleporter': {frozenset({'TPHoru', 'HoruKey'})}}, 'glitched': {'LowerChargeFlameArea': {frozenset({'Grenade'})}}, 'master-core': {'BlackrootDarknessRoom': {frozenset({'DoubleJump'})}, 'DeathGauntletDoor': {frozenset({'DoubleJump'})}}, 'casual-dboost': {'DeathGauntletDoor': {frozenset({'Climb'}), frozenset({'WallJump'})}}, 'standard-lure': {'DeathGauntletDoor': {frozenset({'Bash'})}}}, 'SunstoneArea': {'casual-core': {'UpperSorrow': {frozenset({'Stomp'})}, 'SorrowTeleporter': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'standard-core': {'UpperSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-dboost': {'SorrowTeleporter': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 2)})}}}, 'Swamp': {'casual-core': {'SwampDrainlessArea': {frozenset({'Stomp'})}, 'SwampKeyDoorPlatform': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'ChargeJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'SwampWater': {frozenset({'Water'})}}, 'expert-core': {'SwampDrainlessArea': {frozenset({'Climb', 'ChargeJump'})}}, 'casual-dboost': {'SwampKeyDoorPlatform': {frozenset({'Free'})}}, 'standard-core': {'SwampKeyDoorPlatform': {frozenset({'Dash'})}}, 'master-dboost': {'SwampWater': {frozenset({('HC', 4), ('AC', 12)}), frozenset({('HC', 12)})}}}, 'SwampEntryArea': {'casual-core': {'SwampDrainlessArea': {frozenset({'Climb', 'Stomp'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}, 'Swamp': {frozenset({'Stomp', 'ChargeJump'})}}, 'standard-core': {'SwampDrainlessArea': {frozenset({'Climb', 'ChargeJump'})}, 'Swamp': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'SwampDrainlessArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'Swamp': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}}}, 'SwampKeyDoorOpened': {'casual-core': {'RightSwamp': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'})}}, 'standard-core': {'RightSwamp': {frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'standard-dboost': {'RightSwamp': {frozenset({'Climb', 'ChargeJump', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0), 'WallJump'}), frozenset({('HC', 0), 'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump', ('HC', 0)})}}, 'expert-dboost': {'RightSwamp': {frozenset({'Climb', 'DoubleJump', ('HC', 2)}), frozenset({('HC', 0), 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', ('HC', 0), 'WallJump', 'Water'}), frozenset({'DoubleJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'Dash', ('AC', 6), ('HC', 0)}), frozenset({('AC', 6), ('HC', 0), 'Dash', ('EC', 3), 'Bash'}), frozenset({'Dash', ('AC', 6), ('HC', 0), 'WallJump'})}}, 'expert-abilities': {'RightSwamp': {frozenset({('EC', 2), 'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6), ('EC', 2)})}}, 'dbash': {'RightSwamp': {frozenset({'Bash', 'Water'}), frozenset({'Bash', ('HC', 2)})}}, 'master-dboost': {'RightSwamp': {frozenset({('HC', 9), 'WallJump'}), frozenset({('AC', 12), 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), 'DoubleJump'}), frozenset({('AC', 12), 'WallJump', 'Water', ('HC', 2)}), frozenset({('HC', 4), ('AC', 12), 'WallJump'}), frozenset({('HC', 6), 'WallJump', 'Water'})}}, 'master-abilities': {'RightSwamp': {frozenset({('EC', 2), 'Dash', ('AC', 6), 'DoubleJump'})}}, 'gjump': {'RightSwamp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'SwampKeyDoorPlatform': {'casual-core': {'SwampKeyDoorOpened': {frozenset({('KS', 2)})}, 'InnerSwampSkyArea': {frozenset({'Glide', 'Wind'})}}, 'standard-core': {'InnerSwampSkyArea': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'dbash': {'InnerSwampSkyArea': {frozenset({'Bash'})}}, 'gjump': {'InnerSwampSkyArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'SwampTeleporter': {'glitched': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Free'})}}}, 'TopGinsoTree': {'casual-core': {'GinsoEscape': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}}, 'standard-core': {'GinsoEscape': {frozenset({'Bash'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-dboost': {'GinsoEscape': {frozenset({('HC', 0), 'Climb', 'Dash', 'Stomp', 'DoubleJump'}), frozenset({('HC', 0), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('HC', 0), 'Climb', 'Glide', 'Stomp', 'DoubleJump'}), frozenset({('HC', 0), 'Dash', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'expert-abilities': {'GinsoEscape': {frozenset({'Stomp', ('AC', 6), 'Dash'})}}, 'master-abilities': {'GinsoEscape': {frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}}, 'master-dboost': {'GinsoEscape': {frozenset({('HC', 0), 'Stomp', 'DoubleJump', 'Dash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', ('HC', 0)})}}}, 'UpperGinsoDoorClosed': {'casual-core': {'UpperGinsoDoorOpened': {frozenset({('KS', 4)})}}}, 'UpperGinsoDoorOpened': {'casual-core': {'GinsoTeleporter': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}, 'UpperGinsoTree': {frozenset({'Open', 'Bash'}), frozenset({'Open', 'DoubleJump'}), frozenset({'Glide', 'Open'})}}, 'standard-core': {'GinsoTeleporter': {frozenset({'Bash'})}}, 'expert-dboost': {'GinsoTeleporter': {frozenset({'ChargeJump', ('HC', 2)}), frozenset({('HC', 0), 'ChargeJump', 'DoubleJump'})}}, 'master-dboost': {'GinsoTeleporter': {frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 2)})}}, 'casual-dboost': {'UpperGinsoTree': {frozenset({'Open', ('HC', 0)})}}, 'standard-abilities': {'UpperGinsoTree': {frozenset({'Open', 'Dash', ('AC', 3)})}}}, 'UpperGinsoRedirectArea': {'casual-core': {'UpperGinsoTree': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'BashTree': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}, 'master-abilities': {'UpperGinsoTree': {frozenset({'ChargeFlame', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', ('AC', 12), 'DoubleJump'}), frozenset({'ChargeFlame', ('AC', 12), 'DoubleJump', 'WallJump'})}}, 'standard-abilities': {'BashTree': {frozenset({'Dash', ('AC', 3)})}}, 'standard-dboost': {'BashTree': {frozenset({'Glide', ('HC', 1)}), frozenset({'Dash', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 1)})}}}, 'UpperGinsoTree': {'casual-core': {'UpperGinsoDoorClosed': {frozenset({'Free'})}, 'UpperGinsoRedirectArea': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Stomp'})}}, 'standard-core': {'UpperGinsoRedirectArea': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'UpperGinsoRedirectArea': {frozenset({'ChargeFlame', 'ChargeJump'})}}, 'expert-abilities': {'UpperGinsoRedirectArea': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'master-core': {'UpperGinsoRedirectArea': {frozenset({'Bash'})}}}, 'UpperGrotto': {'casual-core': {'OuterSwampMortarAbilityCellLedge': {frozenset({'ChargeJump'})}, 'MoonGrottoStompPlantAccess': {frozenset({'Stomp'})}, 'OuterSwampLowerArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'Iceless': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'Dash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'standard-core': {'MoonGrottoStompPlantAccess': {frozenset({'Climb', 'ChargeJump'})}, 'Iceless': {frozenset({'Grenade', 'Bash'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Grenade', 'Bash'})}}, 'master-core': {'MoonGrottoStompPlantAccess': {frozenset({'Bash'})}, 'Iceless': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'})}}, 'expert-core': {'OuterSwampLowerArea': {frozenset({'DoubleJump'})}}, 'standard-dboost': {'Iceless': {frozenset({'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', ('HC', 1)})}}, 'standard-abilities': {'Iceless': {frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'gjump': {'Iceless': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'glitched': {'MoonGrottoAboveTeleporter': {frozenset({'Free'})}}}, 'UpperSorrow': {'glitched': {'SunstoneArea': {frozenset({'Glide', 'ChargeJump'})}, 'SorrowTeleporter': {frozenset({'Climb', 'Glide', 'ChargeJump'})}}, 'casual-core': {'ChargeJumpDoor': {frozenset({'Free'})}}}, 'UpperSpiritCaverns': {'casual-core': {'SpiritTreeDoor': {frozenset({'Free'})}}}, 'ValleyEntry': {'casual-core': {'ValleyEntryTree': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Bash'}), frozenset({'WallJump'})}, 'ValleyEntryTreePlantAccess': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'ValleyPostStompDoor': {frozenset({'Stomp', 'ChargeJump', 'WallJump'}), frozenset({'OpenWorld', 'DoubleJump', 'WallJump'}), frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump'}), frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'ChargeJump', 'OpenWorld', 'WallJump'}), frozenset({'Climb', 'OpenWorld', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld', 'WallJump'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'DoubleJump'})}, 'ValleyStompFloor': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Glide', 'DoubleJump', 'OpenWorld'})}, 'SpiritTreeRefined': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'standard-lure': {'ValleyEntryTree': {frozenset({'Bash'})}}, 'expert-dboost': {'ValleyEntryTree': {frozenset({'ChargeJump', ('HC', 1)})}, 'ValleyPostStompDoor': {frozenset({'Stomp', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeJump', 'OpenWorld', ('HC', 1)}), frozenset({'Bash', 'ChargeJump', ('HC', 1)})}}, 'expert-abilities': {'ValleyEntryTree': {frozenset({'Dash', ('AC', 6)})}, 'ValleyEntryTreePlantAccess': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'ValleyThreeBirdLever': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyStompFloor': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'SpiritTreeRefined': {frozenset({'Dash', ('AC', 6)})}}, 'expert-core': {'ValleyEntryTreePlantAccess': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade'})}}, 'expert-lure': {'ValleyPostStompDoor': {frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'})}}, 'standard-core': {'ValleyThreeBirdLever': {frozenset({'Dash', 'ChargeJump', 'DoubleJump', 'OpenWorld'})}, 'ValleyStompFloor': {frozenset({'Glide', 'Dash', 'OpenWorld'}), frozenset({'Dash', 'DoubleJump', 'OpenWorld'})}}, 'gjump': {'ValleyThreeBirdLever': {frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'Grenade'})}}, 'standard-abilities': {'ValleyStompFloor': {frozenset({'Dash', 'ChargeJump', 'OpenWorld', ('AC', 3)})}}, 'standard-dboost': {'ValleyStompFloor': {frozenset({'OpenWorld', ('HC', 1)})}}}, 'ValleyEntryTree': {'casual-core': {'ValleyEntryTreePlantAccess': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyPostStompDoor': {frozenset({'OpenWorld'})}}, 'expert-core': {'ValleyEntryTreePlantAccess': {frozenset({'Grenade'})}}, 'expert-abilities': {'ValleyEntryTreePlantAccess': {frozenset({'Dash', ('AC', 6)})}}}, 'ValleyForlornApproach': {'casual-core': {'OutsideForlornCliff': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'ValleyStompFloor': {frozenset({'ChargeJump'})}}, 'standard-core': {'OutsideForlornCliff': {frozenset({'Stomp'})}}, 'master-core': {'ValleyStompFloor': {frozenset({'Bash'})}}}, 'ValleyMain': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Dash'}), frozenset({'Bash'}), frozenset({'DoubleJump'})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}}, 'gjump': {'WilhelmLedge': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'ValleyPostStompDoor': {'casual-core': {'ValleyRight': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'ValleyEntry': {frozenset({'OpenWorld'})}, 'ValleyEntryTree': {frozenset({'Bash', 'OpenWorld'}), frozenset({'OpenWorld', 'WallJump'}), frozenset({'ChargeJump', 'OpenWorld'}), frozenset({'OpenWorld', 'DoubleJump'}), frozenset({'Climb', 'OpenWorld'})}}, 'expert-dboost': {'ValleyRight': {frozenset({('HC', 4), 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'dbash': {'ValleyRight': {frozenset({'Bash'})}}, 'master-dboost': {'ValleyRight': {frozenset({('HC', 0), ('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({('HC', 0), ('AC', 12), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 8)})}}, 'gjump': {'ValleyRight': {frozenset({('AC', 12), 'Climb', 'Grenade', 'Stomp', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', ('HC', 2), 'Grenade', 'ChargeJump'}), frozenset({'Climb', 'Grenade', 'Stomp', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 6), 'Climb', 'Dash', 'Grenade', 'ChargeJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', 'Grenade'})}}, 'standard-core': {'ValleyEntryTree': {frozenset({'Dash', 'OpenWorld'})}}}, 'ValleyRight': {'expert-dboost': {'ValleyPostStompDoor': {frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'ValleyPostStompDoor': {frozenset({('HC', 4)}), frozenset({('AC', 12), ('HC', 2)})}}, 'casual-core': {'ValleyStomplessApproach': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 6), 'WallJump'})}}}, 'ValleyStompFloor': {'casual-core': {'ValleyForlornApproach': {frozenset({'Stomp'})}, 'ValleyThreeBirdLever': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'ValleyEntry': {frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide', 'ChargeJump', 'OpenWorld'})}}, 'standard-core': {'ValleyForlornApproach': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'ValleyForlornApproach': {frozenset({'Bash'})}}, 'standard-dboost': {'ValleyEntry': {frozenset({'ChargeJump', 'OpenWorld', ('HC', 1)})}}, 'expert-dboost': {'ValleyEntry': {frozenset({('HC', 0), 'OpenWorld', 'DoubleJump'}), frozenset({'OpenWorld', 'ChargeJump', ('HC', 0)})}}, 'expert-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}}, 'ValleyStompless': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Bash'})}, 'ValleyStomplessApproach': {frozenset({'Bash'}), frozenset({'Glide'})}, 'MistyEntrance': {frozenset({'Bash', 'OpenWorld'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'OpenWorld', 'DoubleJump'}), frozenset({'Dash', 'OpenWorld'}), frozenset({'Glide', 'OpenWorld'})}, 'LowerValley': {frozenset({'OpenWorld'})}, 'LowerValleyPlantApproach': {frozenset({'OpenWorld'})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 6), ('EC', 3)})}}, 'expert-core': {'ValleyMain': {frozenset({'Bash'})}}, 'master-core': {'ValleyMain': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-dboost': {'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'ValleyStomplessApproach': {frozenset({('HC', 7)}), frozenset({('HC', 4), 'ChargeJump'}), frozenset({('AC', 12), 'ChargeJump', ('HC', 2)}), frozenset({('HC', 4), ('AC', 12)})}}}, 'ValleyStomplessApproach': {'casual-core': {'ValleyStompless': {frozenset({'Bash'})}}, 'expert-dboost': {'ValleyStompless': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'ValleyStompless': {frozenset({('EC', 2), 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'DoubleJump', ('EC', 2)})}}, 'master-dboost': {'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}}, 'ValleyTeleporter': {'casual-core': {'ValleyPostStompDoor': {frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyRight': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Glide', 'OpenWorld'})}, 'LowerValley': {frozenset({'OpenWorld'})}, 'LowerValleyPlantApproach': {frozenset({'OpenWorld'})}, 'ValleyStompless': {frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Glide', 'OpenWorld', 'Wind'})}}, 'expert-abilities': {'ValleyPostStompDoor': {frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({'Dash', ('AC', 6), ('EC', 3)})}, 'ValleyRight': {frozenset({'Dash', ('AC', 6)})}, 'MistyEntrance': {frozenset({'Dash', 'DoubleJump', ('AC', 3), 'OpenWorld'}), frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyStompless': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}, 'master-core': {'ValleyPostStompDoor': {frozenset({'DoubleJump'})}}, 'expert-dboost': {'ValleyRight': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Glide', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', ('HC', 1)})}}, 'gjump': {'ValleyRight': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-abilities': {'ValleyRight': {frozenset({('AC', 12), 'DoubleJump'})}, 'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump', 'WallJump', 'OpenWorld'})}}, 'standard-core': {'MistyEntrance': {frozenset({'Grenade', 'Bash', 'DoubleJump', 'OpenWorld'})}}, 'standard-abilities': {'MistyEntrance': {frozenset({'OpenWorld', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'expert-core': {'MistyEntrance': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'OpenWorld'}), frozenset({'Dash', 'ChargeJump', 'DoubleJump', 'OpenWorld'}), frozenset({'Grenade', 'Bash', 'OpenWorld'})}, 'ValleyStompless': {frozenset({'Climb', 'Bash', 'Grenade', 'OpenWorld'}), frozenset({'Grenade', 'Bash', 'OpenWorld', 'WallJump'})}}, 'master-lure': {'ValleyStompless': {frozenset({'Bash', 'OpenWorld', 'WallJump'})}}}, 'ValleyThreeBirdLever': {'casual-core': {'ValleyEntry': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide'})}, 'LowerValley': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'DoubleJump'})}}, 'standard-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 3)})}, 'LowerValley': {frozenset({'Dash', ('AC', 3)})}}, 'standard-dboost': {'ValleyEntry': {frozenset({('HC', 4)})}, 'LowerValley': {frozenset({('HC', 4)})}}, 'expert-dboost': {'ValleyEntry': {frozenset({'Climb', ('HC', -1)}), frozenset({('HC', -1), 'WallJump'}), frozenset({('HC', -1), 'ChargeJump'})}, 'LowerValley': {frozenset({('HC', 2)})}}, 'standard-core': {'LowerValley': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}}, 'dbash': {'LowerValley': {frozenset({'Bash'})}}}, 'WaterVeinArea': {'casual-core': {'LeftGumoHideout': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerLeftGumoHideout': {frozenset({'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'MoonGrotto': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}}, 'standard-core': {'LeftGumoHideout': {frozenset({'Dash'})}, 'LowerLeftGumoHideout': {frozenset({'Dash'})}, 'MoonGrotto': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}}}, 'WilhelmLedge': {'casual-core': {'SorrowBashLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Bash'}), frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'ValleyStompless': {frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyMain': {frozenset({'Stomp'})}}, 'standard-core': {'SorrowBashLedge': {frozenset({'Glide', 'Dash', 'Climb', 'DoubleJump'})}, 'ValleyMain': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-abilities': {'SorrowBashLedge': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}, 'ValleyStompless': {frozenset({'Dash', ('AC', 6)})}}, 'master-abilities': {'SorrowBashLedge': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump'})}, 'ValleyMain': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-abilities': {'ValleyStompless': {frozenset({'Dash', 'DoubleJump', ('AC', 3)})}}, 'standard-lure': {'ValleyMain': {frozenset({'HoruKey'})}}, 'expert-core': {'ValleyMain': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}}, 'master-core': {'ValleyMain': {frozenset({'Bash'})}}, 'glitched': {'ValleyMain': {frozenset({'ChargeJump'})}}}} diff --git a/worlds_disabled/oribf/Types.py b/worlds_disabled/oribf/Types.py deleted file mode 100644 index 1ed2423a48..0000000000 --- a/worlds_disabled/oribf/Types.py +++ /dev/null @@ -1,5 +0,0 @@ -from typing import NamedTuple - -class Location(NamedTuple): - code: int - vanilla_item: str \ No newline at end of file diff --git a/worlds_disabled/oribf/__init__.py b/worlds_disabled/oribf/__init__.py deleted file mode 100644 index 6400961a5a..0000000000 --- a/worlds_disabled/oribf/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import Set - -from worlds.AutoWorld import World -from .Items import item_table, default_pool -from .Locations import lookup_name_to_id -from .Rules import set_rules, location_rules -from .Regions import locations_by_region, connectors -from .Options import options -from BaseClasses import Region, Item, Location, Entrance, ItemClassification - - -class OriBlindForest(World): - game: str = "Ori and the Blind Forest" - - topology_present = True - data_version = 1 - - item_name_to_id = item_table - location_name_to_id = lookup_name_to_id - - option_definitions = options - - hidden = True - - def generate_early(self): - logic_sets = {"casual-core"} - for logic_set in location_rules: - if logic_set != "casual-core" and getattr(self.multiworld, logic_set.replace("-", "_")): - logic_sets.add(logic_set) - self.logic_sets = logic_sets - - set_rules = set_rules - - def create_region(self, name: str): - return Region(name, self.player, self.multiworld) - - def create_regions(self): - world = self.multiworld - menu = self.create_region("Menu") - world.regions.append(menu) - start = Entrance(self.player, "Start Game", menu) - menu.exits.append(start) - - # workaround for now, remove duplicate locations - already_placed_locations = set() - - for region_name, locations in locations_by_region.items(): - locations -= already_placed_locations - already_placed_locations |= locations - region = self.create_region(region_name) - if region_name == "SunkenGladesRunaway": # starting point - start.connect(region) - region.locations = {Location(self.player, location, lookup_name_to_id[location], region) - for location in locations} - world.regions.append(region) - - for region_name, exits in connectors.items(): - parent = world.get_region(region_name, self.player) - for exit in exits: - connection = Entrance(self.player, exit, parent) - connection.connect(world.get_region(exit, self.player)) - parent.exits.append(connection) - - def generate_basic(self): - for item_name, count in default_pool.items(): - self.multiworld.itempool.extend([self.create_item(item_name) for _ in range(count)]) - - def create_item(self, name: str) -> Item: - return Item(name, - ItemClassification.progression if not name.startswith("EX") else ItemClassification.filler, - item_table[name], self.player) From f3e00b6d62ec773a35a1abdc867a2d95fb546d43 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Tue, 20 May 2025 16:48:24 -0700 Subject: [PATCH 149/199] Zillion: fix `read_contents` to be compatible with base class (#5015) --- worlds/zillion/patch.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/zillion/patch.py b/worlds/zillion/patch.py index 0eee3315f4..e28d70f181 100644 --- a/worlds/zillion/patch.py +++ b/worlds/zillion/patch.py @@ -1,5 +1,5 @@ import os -from typing import BinaryIO +from typing import Any, BinaryIO import zipfile from typing_extensions import override @@ -46,9 +46,10 @@ class ZillionPatch(APAutoPatchInterface): compress_type=zipfile.ZIP_DEFLATED) @override - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: - super().read_contents(opened_zipfile) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> dict[str, Any]: + manifest = super().read_contents(opened_zipfile) self.gen_data_str = opened_zipfile.read("gen_data.json").decode() + return manifest @override def patch(self, target: str) -> None: From 7f4bf71807f7b6fc2fb70082abeff4376b1a0e34 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 21 May 2025 14:12:00 +0200 Subject: [PATCH 150/199] Adventure: Update AdventureDeltaPatch.read_contents to return the manifest as required by #4331 (#5016) --- worlds/adventure/Rom.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/adventure/Rom.py b/worlds/adventure/Rom.py index 4d56cd19e5..cb104c56d8 100644 --- a/worlds/adventure/Rom.py +++ b/worlds/adventure/Rom.py @@ -182,10 +182,11 @@ class AdventureDeltaPatch(APPatch, metaclass=AutoPatchRegister): json.dumps(self.rom_deltas), compress_type=zipfile.ZIP_LZMA) - def read_contents(self, opened_zipfile: zipfile.ZipFile): - super(AdventureDeltaPatch, self).read_contents(opened_zipfile) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> dict[str, Any]: + manifest = super(AdventureDeltaPatch, self).read_contents(opened_zipfile) self.foreign_items = AdventureDeltaPatch.read_foreign_items(opened_zipfile) self.autocollect_items = AdventureDeltaPatch.read_autocollect_items(opened_zipfile) + return manifest @classmethod def get_source_data(cls) -> bytes: From 3069deb019cf06a21af4625224be78d5118d61c6 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Wed, 21 May 2025 08:12:27 -0400 Subject: [PATCH 151/199] Jak and Daxter: Implement New Game (#3291) * Jak 1: Initial commit: Cell Locations, Items, and Regions modeled. * Jak 1: Wrote Regions, Rules, init. Untested. * Jak 1: Fixed mistakes, need better understanding of Entrances. * Jak 1: Fixed bugs, refactored Regions, added missing Special Checks. First spoiler log generated. * Jak 1: Add Scout Fly Locations, code and style cleanup. * Jak 1: Add Scout Flies to Regions. * Jak 1: Add version info. * Jak 1: Reduced code smell. * Jak 1: Fixed UT bugs, added Free The Sages as Locations. * Jak 1: Refactor ID scheme to better fit game's scheme. Add more subregions and rules, but still missing one-way Entrances. * Jak 1: Add some one-ways, adjust scout fly offset. * Jak 1: Found Scout Fly ID's for first 4 maps. * Jak 1: Add more scout fly ID's, refactor game/AP ID translation for easier reading and code reuse. * Jak 1: Fixed a few things. Four maps to go. * Jak 1: Last of the scout flies mapped! * Jak 1: simplify citadel sages logic. * Jak 1: WebWorld setup, some documentation. * Jak 1: Initial checkin of Client. Removed the colon from the game name. * Jak 1: Refactored client into components, working on async communication between the client and the game. * Jak 1: In tandem with new ArchipelaGOAL memory structure, define read_memory. * Jak 1: There's magic in the air... * Jak 1: Fixed bug translating scout fly ID's. * Jak 1: Make the REPL a little more verbose, easier to debug. * Jak 1: Did you know Snowy Mountain had such specific unlock requirements? I didn't. * Jak 1: Update Documentation. * Jak 1: Simplify user interaction with agents, make process more robust/less dependent on order of ops. * Jak 1: Simplified startup process, updated docs, prayed. * Jak 1: quick fix to settings. * Jak and Daxter: Implement New Game (#1) * Jak 1: Initial commit: Cell Locations, Items, and Regions modeled. * Jak 1: Wrote Regions, Rules, init. Untested. * Jak 1: Fixed mistakes, need better understanding of Entrances. * Jak 1: Fixed bugs, refactored Regions, added missing Special Checks. First spoiler log generated. * Jak 1: Add Scout Fly Locations, code and style cleanup. * Jak 1: Add Scout Flies to Regions. * Jak 1: Add version info. * Jak 1: Reduced code smell. * Jak 1: Fixed UT bugs, added Free The Sages as Locations. * Jak 1: Refactor ID scheme to better fit game's scheme. Add more subregions and rules, but still missing one-way Entrances. * Jak 1: Add some one-ways, adjust scout fly offset. * Jak 1: Found Scout Fly ID's for first 4 maps. * Jak 1: Add more scout fly ID's, refactor game/AP ID translation for easier reading and code reuse. * Jak 1: Fixed a few things. Four maps to go. * Jak 1: Last of the scout flies mapped! * Jak 1: simplify citadel sages logic. * Jak 1: WebWorld setup, some documentation. * Jak 1: Initial checkin of Client. Removed the colon from the game name. * Jak 1: Refactored client into components, working on async communication between the client and the game. * Jak 1: In tandem with new ArchipelaGOAL memory structure, define read_memory. * Jak 1: There's magic in the air... * Jak 1: Fixed bug translating scout fly ID's. * Jak 1: Make the REPL a little more verbose, easier to debug. * Jak 1: Did you know Snowy Mountain had such specific unlock requirements? I didn't. * Jak 1: Update Documentation. * Jak 1: Simplify user interaction with agents, make process more robust/less dependent on order of ops. * Jak 1: Simplified startup process, updated docs, prayed. * Jak 1: quick fix to settings. * Jak and Daxter: Genericize Items, Update Scout Fly logic, Add Victory Condition. (#3) * Jak 1: Update to 0.4.6. Decouple locations from items, support filler items. * Jak 1: Total revamp of Items. This is where everything broke. * Jak 1: Decouple 7 scout fly checks from normal checks, update regions/rules for orb counts/traders. * Jak 1: correct regions/rules, account for sequential oracle/miner locations. * Jak 1: make nicer strings. * Jak 1: Add logic for finished game. First full run complete! * Jak 1: update group names. * Jak and Daxter - Gondola, Pontoons, Rules, Regions, and Client Update * Jak 1: Overhaul of regions, rules, and special locations. Updated game info page. * Jak 1: Preparations for Alpha. Reintroducing automatic startup in client. Updating docs, readme, codeowners. * Alpha Updates (#15) * Jak 1: Consolidate client into apworld, create launcher icon, improve setup docs. * Jak 1: Update setup guide. * Jak 1: Load title screen, save states of in/outboxes. * Logging Update (#16) * Jak 1: Separate info and debug logs. * Jak 1: Update world info to refer to Archipelago Options menu. * Deathlink (#18) * Jak 1: Implement Deathlink. TODO: make it optional... * Jak 1: Issue a proper send-event for deathlink deaths. * Jak 1: Added cause of death to deathlink, fixed typo. * Jak 1: Make Deathlink toggleable. * Jak 1: Added player name to death text, added zoomer/flut/fishing text, simplified GOAL call for deathlink. * Jak 1: Fix death text in client logger. * Move Randomizer (#26) * Finally remove debug-segment text, update Python imports to relative paths. * HUGE refactor to Regions/Rules to support move rando, first hub area coded. * More refactoring. * Another refactor - may squash. * Fix some Rules, reuse some code by returning key regions from build_regions. * More regions added. A couple of TODOs. * Fixed trade logic, added LPC regions. * Added Spider, Snowy, Boggy. Fixed Misty's orbs. * Fix circular import, assert orb counts per level, fix a few naming errors. * Citadel added, missing locs and connections fixed. First move rando seed generated. * Add Move Rando to Options class. * Fixed rules for prerequisite moves. * Implement client functionality for move rando, add blurbs to game info page. * Fix wrong address for cache checks. * Fix byte alignment of offsets, refactor read_memory for better code reuse. * Refactor memory offsets and add some unit tests. * Make green eco the filler item, also define a maximum ID. Fix Boggy tether locations. * Move rando fixes (#29) * Fix virtual regions in Snowy. Fix some GMC problems. * Fix Deathlink on sunken slides. * Removed unncessary code causing build failure. * Orbsanity (#32) * My big dumb shortcut: a 2000 item array. * A better idea: bundle orbs as a numerical option and make array variable size. * Have Item/Region generation respect the chosen Orbsanity bundle size. Fix trade logic. * Separate Global/Local Orbsanity options. TODO - re-introduce orb factory for per-level option. * Per-level Orbsanity implemented w/ orb bundle factory. * Implement Orbsanity for client, fix some things up for regions. * Fix location name/id mappings. * Fix client orb collection on connection. * Fix minor Deathlink bug, add Update instructions. * Finishing Touches (#36) * Set up connector level thresholds, completion goal choices. * Send AP sender/recipient info to game via client. * Slight refactors. * Refactor option checking, add DataStorage handling of traded orbs. * Update instructions to change order of load/connect. * Add Option check to ensure enough Locations exist for Cell Count thresholds. Fix Final Door region. * Need some height move to get LPC sunken chamber cell. * Rename completion_condition to jak_completion_condition (#41) * The Afterparty (#42) * Fixes to Jak client, rules, options, and more. * Post-rebase fixes. * Remove orbsanity reset code, optimize game text in client. * More game text optimization. * Added more specific troubleshooting/setup instructions. * Add known issue about large releases taking time. (Dodge 6,666th commit.) * Remove "Bundle of", Add location name groups, set better default RootDirectory for new players. * Make orb trade amounts configurable, make orbsanity defaults more reasonable. * Add HUD info to doc. * Exempt's Code Review Updates (#43) * Round 1 of code review updates, the easy stuff. * Factor options checking away from region/rule creation. * Code review updates round 2, more complex stuff. * Code review updates round 3: the mental health annihilator * Code review updates part 4: redemption. * More code review feedback, simplifying code, etc. * Added a host.yaml option to override friendly limits, plus a couple of code review updates. * Added singleplayer limits, player names to enforcement rules. * Updated friendly limits to be more strict, optimized recalculate logic. * Today's the big day Jak: updates docs for mod support in OpenGOAL Launcher * Rearranged and clarified some instructions, ADDED PATH-SPACE FIX TO CLIENT. * Fix deathlink reset stalls on a busy client. (#47) * Jak & Daxter Client : queue game text messages to get items faster during release (#48) * queue game text messages to write them during the main_tick function and empty the message queue faster during release * wrap comment for code style character limit Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> * remove useless blank line Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> * whitespace code style Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> * Move JsonMessageData dataclass outside of ReplClient class for code clarity --------- Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> * Item Classifications (and REPL fixes) (#49) * Changes to item classifications * Bugfixes to power cell thresholds. * Fix bugs in item_type_helper. * Refactor 100 cell door to pass unit tests. * Quick fix to ReplClient. * Not so quick fix to ReplClient. * Display friendly limits in options tooltips. * Use math.ceil like a normal person. * Missed a space. * Fix non-accessibility due to bad orb calculation. * Updated documentation. * More Options, More Docs, More Tests (#51) * Reorder cell counts, require punch for Klaww. * Friendlier friendly friendlies. * Removed custom_worlds references from docs/setup guide, focused OpenGOAL Launcher language. * Increased breadth of unit tests. * Clean imports of unit tests. * Create OptionGroups. * Fix region rule bug with Punch for Klaww. * Include Punch For Klaww in slot data. * Update worlds/jakanddaxter/__init__.py Co-authored-by: Scipio Wright * Temper and Harden Text Client (#52) * Provide config path so OpenGOAL can use mod-specific saves and settings. * Add versioning to MemoryReader. Harden the client against user errors. * Updated comments. * Add Deathlink as a "statement of intent" to the YAML. Small updates to client. * Revert deathlink changes. * Update error message. * Added color markup to log messages printed in text client. * Separate loggers by agent, write markup to GUI and non-markup to disk simultaneously. * Refactor MemoryReader callbacks from main_tick to constructor. * Make callback names more... informative. * Give users explicit instructions in error messages. * Stellar Messaging (#54) * Use new ap-messenger functions for text writing. * Remove Powershell requirement, bump memory version to 3. * Error message update w/ instructions for game crash. * Create no console window for gk. * ISO Data Enhancement (#58) * Add iso-path as argument to GOAL compiler. # Conflicts: # worlds/jakanddaxter/Client.py * More resilient handling of iso_path. * Fixed scout fly ID mismatches. * Corrected iso_data subpath. * Update memory version to 4. * Docs update for iso_data. * Auto Detect OpenGOAL Install (#63) * Auto detect OpenGOAL install path. Also fix Deathlink on server connection. * Updated docs, add instructions to error messages. * Slight tweak to error text. * J&D : add per region location groups (#64) * add per region power cells location group * add per region scout flies location group * add per zone orb bundle groups (I'm not particularly happy about this code, but I figured doing it this way was the point of least friction/duplication) * guess who forgot 9 very important characters in each line of the last commit * Rearrange location group names, quick fix to client error handling. * Fix pycharm warnings. * Fix more pycharm warnings. * Light cleanup: fix icons, add bug report page, remove py 3.8 code. * Update worlds/jakanddaxter/Options.py Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> * Update worlds/jakanddaxter/Options.py Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> * Update worlds/jakanddaxter/Options.py Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> * Update worlds/jakanddaxter/Options.py Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> * Code review updates on comments, tooltips, and type hints. * Update type hint for lists in regions. * Missed todo removal. * More type hint updates. * Small region updates for location accessibility, small updates to world guide and README.md. * Add GMC scout fly location group. * Improved sanitization of game text. * Traps 2 (#70) * Add trap items, relevant options, and citadel orb caches. * Update REPL to send traps to game. * Fix item counter. * Allow player to select which traps to use. * Fix host.yaml doc strings, ap-setup-options typing, bump memory version to 5. * Alter some trap names. * Update world doc. * Add health trap. * Added 3 more trap types. * Protect against empty trap list. * Reword traps paragraph in world doc. * Another update to trap paragraph. * Concisify trap option docstring. * Timestamp on game log file. * Update client to handle waiting on title screen. * Send slot name and seed to game. * Use self.random instead. * Update setup doc for new title screen. * Quick clarification of orb caches in world doc. * Sanitize slot info earlier. * Added to and improved unit tests. * Light cleanup on world. * Optimizations to movement rules, docs: known issues update. * Quick fixes for beta 0.5.0 release: template options and LPC logic. * Quick fix to spoiler counts. * Reorganize world guide for faster navigation. * Fix links. * Update HUD section. * Found a way to render apostrophes in item names. * March Refactors (#77) * Reorg imports, small fix to Rock Village movement. * Fix wait-on-title message never going to ready message. * Colorama init fix. * Swap trap list for a dictionary of trap weights. * The more laws, the less justice. * Quick readability update. * Have memory reader provide instructions for slow booting games. * Revert some things. * Update setup_en.md * Update HUD mode lingo for combined msgs. * Remade launcher icon, sized correctly. * I don't know why I can't be satisfied with things. * Apply suggestions from Scipio Co-authored-by: Scipio Wright * Properly use the settings API instead of Utils. * Newline on requirements.txt. * Add __init__ files for frozen builds. * Replace an ap_inform function with a CommonClient built-in. * Resize icon to match kivymd expected size. * First round of Treble code reviews. * Second round of Treble code reviews. * Third round of Treble code reviews. * Missed an unncessary if condition. * Missed unnecessary comments. * Fourth round of Treble code reviews. * Switch trap dictionary to OptionCounter. * Use existing slot name/seed from network protocol. * Violet code review updates. * Violet code review updates part 2. * Refactor to avoid floating imports (Violet part 3). * Found a few more valid characters for messaging. * Move tests out of init, add colon to game name (now that it's safe). * But don't include those chars for file text. * Implement Vi suggestion on webhost-capable friendly limits. * Revert "Implement Vi suggestion on webhost-capable friendly limits." This reverts commit 2d012b7f4a9a4c13985ecd7303bb1fc646831c86. * Rename all files for PEP8. * Refactor how maximums work on webhost. * Fix rogue UT. * Don't rush. * Fix client post-PEP8. --------- Co-authored-by: Justus Lind Co-authored-by: Romain BERNARD <30secondstodraw@gmail.com> Co-authored-by: Scipio Wright Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- README.md | 1 + docs/CODEOWNERS | 3 + worlds/jakanddaxter/__init__.py | 504 +++++++++++++++ worlds/jakanddaxter/agents/__init__.py | 0 worlds/jakanddaxter/agents/memory_reader.py | 489 ++++++++++++++ worlds/jakanddaxter/agents/repl_client.py | 527 +++++++++++++++ worlds/jakanddaxter/client.py | 600 ++++++++++++++++++ .../en_Jak and Daxter The Precursor Legacy.md | 258 ++++++++ worlds/jakanddaxter/docs/setup_en.md | 182 ++++++ worlds/jakanddaxter/game_id.py | 8 + worlds/jakanddaxter/icons/precursor_orb.ico | Bin 0 -> 6142 bytes worlds/jakanddaxter/icons/precursor_orb.png | Bin 0 -> 4698 bytes worlds/jakanddaxter/items.py | 156 +++++ worlds/jakanddaxter/levels.py | 76 +++ worlds/jakanddaxter/locations.py | 66 ++ worlds/jakanddaxter/locs/__init__.py | 0 worlds/jakanddaxter/locs/cell_locations.py | 194 ++++++ .../jakanddaxter/locs/orb_cache_locations.py | 52 ++ worlds/jakanddaxter/locs/orb_locations.py | 123 ++++ worlds/jakanddaxter/locs/scout_locations.py | 230 +++++++ worlds/jakanddaxter/locs/special_locations.py | 51 ++ worlds/jakanddaxter/options.py | 262 ++++++++ worlds/jakanddaxter/regions.py | 132 ++++ worlds/jakanddaxter/regs/__init__.py | 0 .../jakanddaxter/regs/boggy_swamp_regions.py | 174 +++++ .../jakanddaxter/regs/fire_canyon_regions.py | 38 ++ .../regs/forbidden_jungle_regions.py | 103 +++ .../jakanddaxter/regs/geyser_rock_regions.py | 48 ++ .../regs/gol_and_maias_citadel_regions.py | 137 ++++ worlds/jakanddaxter/regs/lava_tube_regions.py | 38 ++ .../regs/lost_precursor_city_regions.py | 155 +++++ .../jakanddaxter/regs/misty_island_regions.py | 131 ++++ .../regs/mountain_pass_regions.py | 67 ++ .../regs/precursor_basin_regions.py | 38 ++ worlds/jakanddaxter/regs/region_base.py | 91 +++ .../jakanddaxter/regs/rock_village_regions.py | 75 +++ .../regs/sandover_village_regions.py | 83 +++ .../regs/sentinel_beach_regions.py | 108 ++++ .../regs/snowy_mountain_regions.py | 203 ++++++ .../jakanddaxter/regs/spider_cave_regions.py | 127 ++++ .../regs/volcanic_crater_regions.py | 52 ++ worlds/jakanddaxter/requirements.txt | 1 + worlds/jakanddaxter/rules.py | 230 +++++++ worlds/jakanddaxter/test/__init__.py | 0 worlds/jakanddaxter/test/bases.py | 107 ++++ worlds/jakanddaxter/test/test_locations.py | 52 ++ worlds/jakanddaxter/test/test_moverando.py | 32 + worlds/jakanddaxter/test/test_orbsanity.py | 61 ++ .../test/test_orderedcellcounts.py | 29 + worlds/jakanddaxter/test/test_trades.py | 39 ++ worlds/jakanddaxter/test/test_traps.py | 80 +++ 51 files changed, 6213 insertions(+) create mode 100644 worlds/jakanddaxter/__init__.py create mode 100644 worlds/jakanddaxter/agents/__init__.py create mode 100644 worlds/jakanddaxter/agents/memory_reader.py create mode 100644 worlds/jakanddaxter/agents/repl_client.py create mode 100644 worlds/jakanddaxter/client.py create mode 100644 worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md create mode 100644 worlds/jakanddaxter/docs/setup_en.md create mode 100644 worlds/jakanddaxter/game_id.py create mode 100644 worlds/jakanddaxter/icons/precursor_orb.ico create mode 100644 worlds/jakanddaxter/icons/precursor_orb.png create mode 100644 worlds/jakanddaxter/items.py create mode 100644 worlds/jakanddaxter/levels.py create mode 100644 worlds/jakanddaxter/locations.py create mode 100644 worlds/jakanddaxter/locs/__init__.py create mode 100644 worlds/jakanddaxter/locs/cell_locations.py create mode 100644 worlds/jakanddaxter/locs/orb_cache_locations.py create mode 100644 worlds/jakanddaxter/locs/orb_locations.py create mode 100644 worlds/jakanddaxter/locs/scout_locations.py create mode 100644 worlds/jakanddaxter/locs/special_locations.py create mode 100644 worlds/jakanddaxter/options.py create mode 100644 worlds/jakanddaxter/regions.py create mode 100644 worlds/jakanddaxter/regs/__init__.py create mode 100644 worlds/jakanddaxter/regs/boggy_swamp_regions.py create mode 100644 worlds/jakanddaxter/regs/fire_canyon_regions.py create mode 100644 worlds/jakanddaxter/regs/forbidden_jungle_regions.py create mode 100644 worlds/jakanddaxter/regs/geyser_rock_regions.py create mode 100644 worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py create mode 100644 worlds/jakanddaxter/regs/lava_tube_regions.py create mode 100644 worlds/jakanddaxter/regs/lost_precursor_city_regions.py create mode 100644 worlds/jakanddaxter/regs/misty_island_regions.py create mode 100644 worlds/jakanddaxter/regs/mountain_pass_regions.py create mode 100644 worlds/jakanddaxter/regs/precursor_basin_regions.py create mode 100644 worlds/jakanddaxter/regs/region_base.py create mode 100644 worlds/jakanddaxter/regs/rock_village_regions.py create mode 100644 worlds/jakanddaxter/regs/sandover_village_regions.py create mode 100644 worlds/jakanddaxter/regs/sentinel_beach_regions.py create mode 100644 worlds/jakanddaxter/regs/snowy_mountain_regions.py create mode 100644 worlds/jakanddaxter/regs/spider_cave_regions.py create mode 100644 worlds/jakanddaxter/regs/volcanic_crater_regions.py create mode 100644 worlds/jakanddaxter/requirements.txt create mode 100644 worlds/jakanddaxter/rules.py create mode 100644 worlds/jakanddaxter/test/__init__.py create mode 100644 worlds/jakanddaxter/test/bases.py create mode 100644 worlds/jakanddaxter/test/test_locations.py create mode 100644 worlds/jakanddaxter/test/test_moverando.py create mode 100644 worlds/jakanddaxter/test/test_orbsanity.py create mode 100644 worlds/jakanddaxter/test/test_orderedcellcounts.py create mode 100644 worlds/jakanddaxter/test/test_trades.py create mode 100644 worlds/jakanddaxter/test/test_traps.py diff --git a/README.md b/README.md index c1e89bac7c..861a6eed1d 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ Currently, the following games are supported: * Inscryption * Civilization VI * The Legend of Zelda: The Wind Waker +* Jak and Daxter: The Precursor Legacy For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index b89f668c04..ca19d27da9 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -87,6 +87,9 @@ # Inscryption /worlds/inscryption/ @DrBibop @Glowbuzz +# Jak and Daxter: The Precursor Legacy +/worlds/jakanddaxter/ @massimilianodelliubaldini + # Kirby's Dream Land 3 /worlds/kdl3/ @Silvris diff --git a/worlds/jakanddaxter/__init__.py b/worlds/jakanddaxter/__init__.py new file mode 100644 index 0000000000..d508e967ae --- /dev/null +++ b/worlds/jakanddaxter/__init__.py @@ -0,0 +1,504 @@ +# Python standard libraries +from collections import defaultdict +from math import ceil +from typing import Any, ClassVar, Callable, Union, cast + +# Archipelago imports +import settings +from worlds.AutoWorld import World, WebWorld +from worlds.LauncherComponents import components, Component, launch_subprocess, Type, icon_paths +from BaseClasses import (Item, + ItemClassification as ItemClass, + Tutorial, + CollectionState) +from Options import OptionGroup + +# Jak imports +from . import options +from .game_id import jak1_id, jak1_name, jak1_max +from .items import (JakAndDaxterItem, + OrbAssoc, + item_table, + cell_item_table, + scout_item_table, + special_item_table, + move_item_table, + orb_item_table, + trap_item_table) +from .levels import level_table, level_table_with_global +from .locations import (JakAndDaxterLocation, + location_table, + cell_location_table, + scout_location_table, + special_location_table, + cache_location_table, + orb_location_table) +from .regions import create_regions +from .rules import (enforce_multiplayer_limits, + enforce_singleplayer_limits, + verify_orb_trade_amounts, + set_orb_trade_rule) +from .locs import (cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches, + orb_locations as orbs) +from .regs.region_base import JakAndDaxterRegion + + +def launch_client(): + from . import client + launch_subprocess(client.launch, name="JakAndDaxterClient") + + +components.append(Component("Jak and Daxter Client", + func=launch_client, + component_type=Type.CLIENT, + icon="precursor_orb")) + +icon_paths["precursor_orb"] = f"ap:{__name__}/icons/precursor_orb.png" + + +class JakAndDaxterSettings(settings.Group): + class RootDirectory(settings.UserFolderPath): + """Path to folder containing the ArchipelaGOAL mod executables (gk.exe and goalc.exe). + Ensure this path contains forward slashes (/) only. This setting only applies if + Auto Detect Root Directory is set to false.""" + description = "ArchipelaGOAL Root Directory" + + class AutoDetectRootDirectory(settings.Bool): + """Attempt to find the OpenGOAL installation and the mod executables (gk.exe and goalc.exe) + automatically. If set to true, the ArchipelaGOAL Root Directory setting is ignored.""" + description = "ArchipelaGOAL Auto Detect Root Directory" + + class EnforceFriendlyOptions(settings.Bool): + """Enforce friendly player options in both single and multiplayer seeds. Disabling this allows for + more disruptive and challenging options, but may impact seed generation. Use at your own risk!""" + description = "ArchipelaGOAL Enforce Friendly Options" + + root_directory: RootDirectory = RootDirectory( + "%programfiles%/OpenGOAL-Launcher/features/jak1/mods/JakMods/archipelagoal") + # Don't ever change these type hints again. + auto_detect_root_directory: Union[AutoDetectRootDirectory, bool] = True + enforce_friendly_options: Union[EnforceFriendlyOptions, bool] = True + + +class JakAndDaxterWebWorld(WebWorld): + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to setting up ArchipelaGOAL (Archipelago on OpenGOAL).", + "English", + "setup_en.md", + "setup/en", + ["markustulliuscicero"] + ) + + tutorials = [setup_en] + bug_report_page = "https://github.com/ArchipelaGOAL/Archipelago/issues" + + option_groups = [ + OptionGroup("Orbsanity", [ + options.EnableOrbsanity, + options.GlobalOrbsanityBundleSize, + options.PerLevelOrbsanityBundleSize, + ]), + OptionGroup("Power Cell Counts", [ + options.EnableOrderedCellCounts, + options.FireCanyonCellCount, + options.MountainPassCellCount, + options.LavaTubeCellCount, + ]), + OptionGroup("Orb Trade Counts", [ + options.CitizenOrbTradeAmount, + options.OracleOrbTradeAmount, + ]), + OptionGroup("Traps", [ + options.FillerPowerCellsReplacedWithTraps, + options.FillerOrbBundlesReplacedWithTraps, + options.TrapEffectDuration, + options.TrapWeights, + ]), + ] + + +class JakAndDaxterWorld(World): + """ + Jak and Daxter: The Precursor Legacy is a 2001 action platformer developed by Naughty Dog + for the PlayStation 2. The game follows the eponymous protagonists, a young boy named Jak + and his friend Daxter, who has been transformed into an ottsel. With the help of Samos + the Sage of Green Eco and his daughter Keira, the pair travel north in search of a cure for Daxter, + discovering artifacts created by an ancient race known as the Precursors along the way. When the + rogue sages Gol and Maia Acheron plan to flood the world with Dark Eco, they must stop their evil plan + and save the world. + """ + # ID, name, version + game = jak1_name + required_client_version = (0, 5, 0) + + # Options + settings: ClassVar[JakAndDaxterSettings] + options_dataclass = options.JakAndDaxterOptions + options: options.JakAndDaxterOptions + + # Web world + web = JakAndDaxterWebWorld() + + # Stored as {ID: Name} pairs, these must now be swapped to {Name: ID} pairs. + # Remember, the game ID and various offsets for each item type have already been calculated. + item_name_to_id = {name: k for k, name in item_table.items()} + location_name_to_id = {name: k for k, name in location_table.items()} + item_name_groups = { + "Power Cells": set(cell_item_table.values()), + "Scout Flies": set(scout_item_table.values()), + "Specials": set(special_item_table.values()), + "Moves": set(move_item_table.values()), + "Precursor Orbs": set(orb_item_table.values()), + "Traps": set(trap_item_table.values()), + } + location_name_groups = { + "Power Cells": set(cell_location_table.values()), + "Power Cells - GR": set(cells.locGR_cellTable.values()), + "Power Cells - SV": set(cells.locSV_cellTable.values()), + "Power Cells - FJ": set(cells.locFJ_cellTable.values()), + "Power Cells - SB": set(cells.locSB_cellTable.values()), + "Power Cells - MI": set(cells.locMI_cellTable.values()), + "Power Cells - FC": set(cells.locFC_cellTable.values()), + "Power Cells - RV": set(cells.locRV_cellTable.values()), + "Power Cells - PB": set(cells.locPB_cellTable.values()), + "Power Cells - LPC": set(cells.locLPC_cellTable.values()), + "Power Cells - BS": set(cells.locBS_cellTable.values()), + "Power Cells - MP": set(cells.locMP_cellTable.values()), + "Power Cells - VC": set(cells.locVC_cellTable.values()), + "Power Cells - SC": set(cells.locSC_cellTable.values()), + "Power Cells - SM": set(cells.locSM_cellTable.values()), + "Power Cells - LT": set(cells.locLT_cellTable.values()), + "Power Cells - GMC": set(cells.locGMC_cellTable.values()), + "Scout Flies": set(scout_location_table.values()), + "Scout Flies - GR": set(scouts.locGR_scoutTable.values()), + "Scout Flies - SV": set(scouts.locSV_scoutTable.values()), + "Scout Flies - FJ": set(scouts.locFJ_scoutTable.values()), + "Scout Flies - SB": set(scouts.locSB_scoutTable.values()), + "Scout Flies - MI": set(scouts.locMI_scoutTable.values()), + "Scout Flies - FC": set(scouts.locFC_scoutTable.values()), + "Scout Flies - RV": set(scouts.locRV_scoutTable.values()), + "Scout Flies - PB": set(scouts.locPB_scoutTable.values()), + "Scout Flies - LPC": set(scouts.locLPC_scoutTable.values()), + "Scout Flies - BS": set(scouts.locBS_scoutTable.values()), + "Scout Flies - MP": set(scouts.locMP_scoutTable.values()), + "Scout Flies - VC": set(scouts.locVC_scoutTable.values()), + "Scout Flies - SC": set(scouts.locSC_scoutTable.values()), + "Scout Flies - SM": set(scouts.locSM_scoutTable.values()), + "Scout Flies - LT": set(scouts.locLT_scoutTable.values()), + "Scout Flies - GMC": set(scouts.locGMC_scoutTable.values()), + "Specials": set(special_location_table.values()), + "Orb Caches": set(cache_location_table.values()), + "Precursor Orbs": set(orb_location_table.values()), + "Precursor Orbs - GR": set(orbs.locGR_orbBundleTable.values()), + "Precursor Orbs - SV": set(orbs.locSV_orbBundleTable.values()), + "Precursor Orbs - FJ": set(orbs.locFJ_orbBundleTable.values()), + "Precursor Orbs - SB": set(orbs.locSB_orbBundleTable.values()), + "Precursor Orbs - MI": set(orbs.locMI_orbBundleTable.values()), + "Precursor Orbs - FC": set(orbs.locFC_orbBundleTable.values()), + "Precursor Orbs - RV": set(orbs.locRV_orbBundleTable.values()), + "Precursor Orbs - PB": set(orbs.locPB_orbBundleTable.values()), + "Precursor Orbs - LPC": set(orbs.locLPC_orbBundleTable.values()), + "Precursor Orbs - BS": set(orbs.locBS_orbBundleTable.values()), + "Precursor Orbs - MP": set(orbs.locMP_orbBundleTable.values()), + "Precursor Orbs - VC": set(orbs.locVC_orbBundleTable.values()), + "Precursor Orbs - SC": set(orbs.locSC_orbBundleTable.values()), + "Precursor Orbs - SM": set(orbs.locSM_orbBundleTable.values()), + "Precursor Orbs - LT": set(orbs.locLT_orbBundleTable.values()), + "Precursor Orbs - GMC": set(orbs.locGMC_orbBundleTable.values()), + "Trades": {location_table[cells.to_ap_id(k)] for k in + {11, 12, 31, 32, 33, 96, 97, 98, 99, 13, 14, 34, 35, 100, 101}}, + "'Free 7 Scout Flies' Power Cells": set(cells.loc7SF_cellTable.values()), + } + + # These functions and variables are Options-driven, keep them as instance variables here so that we don't clog up + # the seed generation routines with options checking. So we set these once, and then just use them as needed. + can_trade: Callable[[CollectionState, int, int | None], bool] + total_orbs: int = 2000 + orb_bundle_item_name: str = "" + orb_bundle_size: int = 0 + total_trade_orbs: int = 0 + total_prog_orb_bundles: int = 0 + total_trap_orb_bundles: int = 0 + total_filler_orb_bundles: int = 0 + total_power_cells: int = 101 + total_prog_cells: int = 0 + total_trap_cells: int = 0 + total_filler_cells: int = 0 + power_cell_thresholds: list[int] + power_cell_thresholds_minus_one: list[int] + trap_weights: tuple[list[str], list[int]] + + # Store these dictionaries for speed improvements. + level_to_regions: dict[str, list[JakAndDaxterRegion]] # Contains all levels and regions. + level_to_orb_regions: dict[str, list[JakAndDaxterRegion]] # Contains only regions which contain orbs. + + # Handles various options validation, rules enforcement, and caching of important information. + def generate_early(self) -> None: + + # Initialize the level-region dictionary. + self.level_to_regions = defaultdict(list) + self.level_to_orb_regions = defaultdict(list) + + # Cache the power cell threshold values for quicker reference. + self.power_cell_thresholds = [ + self.options.fire_canyon_cell_count.value, + self.options.mountain_pass_cell_count.value, + self.options.lava_tube_cell_count.value, + 100, # The 100 Power Cell Door. + ] + + # Order the thresholds ascending and set the options values to the new order. + if self.options.enable_ordered_cell_counts: + self.power_cell_thresholds.sort() + self.options.fire_canyon_cell_count.value = self.power_cell_thresholds[0] + self.options.mountain_pass_cell_count.value = self.power_cell_thresholds[1] + self.options.lava_tube_cell_count.value = self.power_cell_thresholds[2] + + # Store this for remove function. + self.power_cell_thresholds_minus_one = [x - 1 for x in self.power_cell_thresholds] + + # For the fairness of other players in a multiworld game, enforce some friendly limitations on our options, + # so we don't cause chaos during seed generation. These friendly limits should **guarantee** a successful gen. + # We would have done this earlier, but we needed to sort the power cell thresholds first. + enforce_friendly_options = self.settings.enforce_friendly_options + if enforce_friendly_options: + if self.multiworld.players > 1: + enforce_multiplayer_limits(self) + else: + enforce_singleplayer_limits(self) + + # Calculate the number of power cells needed for full region access, the number being replaced by traps, + # and the number of remaining filler. + if self.options.jak_completion_condition == options.CompletionCondition.option_open_100_cell_door: + self.total_prog_cells = 100 + else: + self.total_prog_cells = max(self.power_cell_thresholds[:3]) + non_prog_cells = self.total_power_cells - self.total_prog_cells + self.total_trap_cells = min(self.options.filler_power_cells_replaced_with_traps.value, non_prog_cells) + self.options.filler_power_cells_replaced_with_traps.value = self.total_trap_cells + self.total_filler_cells = non_prog_cells - self.total_trap_cells + + # Verify that we didn't overload the trade amounts with more orbs than exist in the world. + # This is easy to do by accident even in a singleplayer world. + self.total_trade_orbs = (9 * self.options.citizen_orb_trade_amount) + (6 * self.options.oracle_orb_trade_amount) + verify_orb_trade_amounts(self) + + # Cache the orb bundle size and item name for quicker reference. + if self.options.enable_orbsanity == options.EnableOrbsanity.option_per_level: + self.orb_bundle_size = self.options.level_orbsanity_bundle_size.value + self.orb_bundle_item_name = orb_item_table[self.orb_bundle_size] + elif self.options.enable_orbsanity == options.EnableOrbsanity.option_global: + self.orb_bundle_size = self.options.global_orbsanity_bundle_size.value + self.orb_bundle_item_name = orb_item_table[self.orb_bundle_size] + else: + self.orb_bundle_size = 0 + self.orb_bundle_item_name = "" + + # Calculate the number of orb bundles needed for trades, the number being replaced by traps, + # and the number of remaining filler. If Orbsanity is off, default values of 0 will prevail for all. + if self.orb_bundle_size > 0: + total_orb_bundles = self.total_orbs // self.orb_bundle_size + self.total_prog_orb_bundles = ceil(self.total_trade_orbs / self.orb_bundle_size) + non_prog_orb_bundles = total_orb_bundles - self.total_prog_orb_bundles + self.total_trap_orb_bundles = min(self.options.filler_orb_bundles_replaced_with_traps.value, + non_prog_orb_bundles) + self.options.filler_orb_bundles_replaced_with_traps.value = self.total_trap_orb_bundles + self.total_filler_orb_bundles = non_prog_orb_bundles - self.total_trap_orb_bundles + else: + self.options.filler_orb_bundles_replaced_with_traps.value = 0 + + self.trap_weights = self.options.trap_weights.weights_pair + + # Options drive which trade rules to use, so they need to be setup before we create_regions. + set_orb_trade_rule(self) + + # This will also set Locations, Location access rules, Region access rules, etc. + def create_regions(self) -> None: + create_regions(self) + + # Don't forget to add the created regions to the multiworld! + for level in self.level_to_regions: + self.multiworld.regions.extend(self.level_to_regions[level]) + + # As a lazy measure, let's also fill level_to_orb_regions here. + # This should help speed up orbsanity calculations. + self.level_to_orb_regions[level] = [reg for reg in self.level_to_regions[level] if reg.orb_count > 0] + + # from Utils import visualize_regions + # visualize_regions(self.multiworld.get_region("Menu", self.player), "jakanddaxter.puml") + + def item_data_helper(self, item: int) -> list[tuple[int, ItemClass, OrbAssoc, int]]: + """ + Helper function to reuse some nasty if/else trees. This outputs a list of pairs of item count and class. + For instance, not all 101 power cells need to be marked progression if you only need 72 to beat the game. + So we will have 72 Progression Power Cells, and 29 Filler Power Cells. + """ + data: list[tuple[int, ItemClass, OrbAssoc, int]] = [] + + # Make N Power Cells. We only want AP's Progression Fill routine to handle the amount of cells we need + # to reach the furthest possible region. Even for early completion goals, all areas in the game must be + # reachable or generation will fail. TODO - Option-driven region creation would be an enormous refactor. + if item in range(jak1_id, jak1_id + scouts.fly_offset): + data.append((self.total_prog_cells, ItemClass.progression_skip_balancing, OrbAssoc.IS_POWER_CELL, 0)) + data.append((self.total_filler_cells, ItemClass.filler, OrbAssoc.IS_POWER_CELL, 0)) + + # Make 7 Scout Flies per level. + elif item in range(jak1_id + scouts.fly_offset, jak1_id + specials.special_offset): + data.append((7, ItemClass.progression_skip_balancing, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # Make only 1 of each Special Item. + elif item in range(jak1_id + specials.special_offset, jak1_id + caches.orb_cache_offset): + data.append((1, ItemClass.progression | ItemClass.useful, OrbAssoc.ALWAYS_UNLOCKS_ORBS, 0)) + + # Make only 1 of each Move Item. + elif item in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + data.append((1, ItemClass.progression | ItemClass.useful, OrbAssoc.ALWAYS_UNLOCKS_ORBS, 0)) + + # Make N Precursor Orb bundles. Like Power Cells, only a fraction of these will be marked as Progression + # with the remainder as Filler, but they are still entirely fungible. See collect function for why these + # are OrbAssoc.NEVER_UNLOCKS_ORBS. + elif item in range(jak1_id + orbs.orb_offset, jak1_max - max(trap_item_table)): + data.append((self.total_prog_orb_bundles, ItemClass.progression_skip_balancing, + OrbAssoc.NEVER_UNLOCKS_ORBS, self.orb_bundle_size)) + data.append((self.total_filler_orb_bundles, ItemClass.filler, + OrbAssoc.NEVER_UNLOCKS_ORBS, self.orb_bundle_size)) + + # We will manually create trap items as needed. + elif item in range(jak1_max - max(trap_item_table), jak1_max): + data.append((0, ItemClass.trap, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # We will manually create filler items as needed. + elif item == jak1_max: + data.append((0, ItemClass.filler, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # If we try to make items with ID's higher than we've defined, something has gone wrong. + else: + raise KeyError(f"Tried to fill item pool with unknown ID {item}.") + + return data + + def create_items(self) -> None: + items_made: int = 0 + for item_name in self.item_name_to_id: + item_id = self.item_name_to_id[item_name] + + # Handle Move Randomizer option. + # If it is OFF, put all moves in your starting inventory instead of the item pool, + # then fill the item pool with a corresponding amount of filler items. + if item_name in self.item_name_groups["Moves"] and not self.options.enable_move_randomizer: + self.multiworld.push_precollected(self.create_item(item_name)) + self.multiworld.itempool.append(self.create_filler()) + items_made += 1 + continue + + # Handle Orbsanity option. + # If it is OFF, don't add any orb bundles to the item pool, period. + # If it is ON, don't add any orb bundles that don't match the chosen option. + if (item_name in self.item_name_groups["Precursor Orbs"] + and (self.options.enable_orbsanity == options.EnableOrbsanity.option_off + or item_name != self.orb_bundle_item_name)): + continue + + # Skip Traps for now. + if item_name in self.item_name_groups["Traps"]: + continue + + # In almost every other scenario, do this. Not all items with the same name will have the same item class. + data = self.item_data_helper(item_id) + for (count, classification, orb_assoc, orb_amount) in data: + self.multiworld.itempool += [JakAndDaxterItem(item_name, classification, item_id, + self.player, orb_assoc, orb_amount) + for _ in range(count)] + items_made += count + + # Handle Traps (for real). + # Manually fill the item pool with a weighted assortment of trap items, equal to the sum of + # total_trap_cells + total_trap_orb_bundles. Only do this if one or more traps have weights > 0. + names, weights = self.trap_weights + if sum(weights): + total_traps = self.total_trap_cells + self.total_trap_orb_bundles + trap_list = self.random.choices(names, weights=weights, k=total_traps) + self.multiworld.itempool += [self.create_item(trap_name) for trap_name in trap_list] + items_made += total_traps + + # Handle Unfilled Locations. + # Add an amount of filler items equal to the number of locations yet to be filled. + # This is the final set of items we will add to the pool. + all_regions = self.multiworld.get_regions(self.player) + total_locations = sum(reg.location_count for reg in cast(list[JakAndDaxterRegion], all_regions)) + total_filler = total_locations - items_made + self.multiworld.itempool += [self.create_filler() for _ in range(total_filler)] + + def create_item(self, name: str) -> Item: + item_id = self.item_name_to_id[name] + + # Use first tuple (will likely be the most important). + _, classification, orb_assoc, orb_amount = self.item_data_helper(item_id)[0] + return JakAndDaxterItem(name, classification, item_id, self.player, orb_assoc, orb_amount) + + def get_filler_item_name(self) -> str: + return "Green Eco Pill" + + def collect(self, state: CollectionState, item: JakAndDaxterItem) -> bool: + change = super().collect(state, item) + if change: + # Orbsanity as an option is no-factor to these conditions. Matching the item name implies Orbsanity is ON, + # so we don't need to check the option. When Orbsanity is OFF, there won't even be any orb bundle items + # to collect. + + # Orb items do not intrinsically unlock anything that contains more Reachable Orbs, so they do not need to + # set the cache to stale. They just change how many orbs you have to trade with. + if item.orb_amount > 0: + state.prog_items[self.player]["Tradeable Orbs"] += self.orb_bundle_size # Give a bundle of Trade Orbs + + # Power Cells DO unlock new regions that contain more Reachable Orbs - the connector levels and new + # hub levels - BUT they only do that when you have a number of them equal to one of the threshold values. + elif (item.orb_assoc == OrbAssoc.ALWAYS_UNLOCKS_ORBS + or (item.orb_assoc == OrbAssoc.IS_POWER_CELL + and state.count("Power Cell", self.player) in self.power_cell_thresholds)): + state.prog_items[self.player]["Reachable Orbs Fresh"] = False + + # However, every other item that does not have an appropriate OrbAssoc that changes the CollectionState + # should NOT set the cache to stale, because they did not make it possible to reach more orb locations + # (level unlocks, region unlocks, etc.). + return change + + def remove(self, state: CollectionState, item: JakAndDaxterItem) -> bool: + change = super().remove(state, item) + if change: + + # Do the same thing we did in collect, except subtract trade orbs instead of add. + if item.orb_amount > 0: + state.prog_items[self.player]["Tradeable Orbs"] -= self.orb_bundle_size # Take a bundle of Trade Orbs + + # Ditto Power Cells, but check thresholds - 1, because we potentially crossed the threshold in the opposite + # direction. E.g. we've removed the 20th power cell, our count is now 19, so we should stale the cache. + elif (item.orb_assoc == OrbAssoc.ALWAYS_UNLOCKS_ORBS + or (item.orb_assoc == OrbAssoc.IS_POWER_CELL + and state.count("Power Cell", self.player) in self.power_cell_thresholds_minus_one)): + state.prog_items[self.player]["Reachable Orbs Fresh"] = False + + return change + + def fill_slot_data(self) -> dict[str, Any]: + options_dict = self.options.as_dict("enable_move_randomizer", + "enable_orbsanity", + "global_orbsanity_bundle_size", + "level_orbsanity_bundle_size", + "fire_canyon_cell_count", + "mountain_pass_cell_count", + "lava_tube_cell_count", + "citizen_orb_trade_amount", + "oracle_orb_trade_amount", + "filler_power_cells_replaced_with_traps", + "filler_orb_bundles_replaced_with_traps", + "trap_effect_duration", + "trap_weights", + "jak_completion_condition", + "require_punch_for_klaww", + ) + return options_dict diff --git a/worlds/jakanddaxter/agents/__init__.py b/worlds/jakanddaxter/agents/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/agents/memory_reader.py b/worlds/jakanddaxter/agents/memory_reader.py new file mode 100644 index 0000000000..01035c4a2e --- /dev/null +++ b/worlds/jakanddaxter/agents/memory_reader.py @@ -0,0 +1,489 @@ +import logging +import random +import struct +from typing import ByteString, Callable +import json +import pymem +from pymem import pattern +from pymem.exception import ProcessNotFound, ProcessError, MemoryReadError, WinAPIError +from dataclasses import dataclass + +from ..locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as flies, + special_locations as specials, + orb_cache_locations as caches) + + +logger = logging.getLogger("MemoryReader") + + +# Some helpful constants. +sizeof_uint64 = 8 +sizeof_uint32 = 4 +sizeof_uint8 = 1 +sizeof_float = 4 + + +# ***************************************************************************** +# **** This number must match (-> *ap-info-jak1* version) in ap-struct.gc! **** +# ***************************************************************************** +expected_memory_version = 5 + + +# IMPORTANT: OpenGOAL memory structures are particular about the alignment, in memory, of member elements according to +# their size in bits. The address for an N-bit field must be divisible by N. Use this class to define the memory offsets +# of important values in the struct. It will also do the byte alignment properly for you. +# See https://opengoal.dev/docs/reference/type_system/#arrays +@dataclass +class OffsetFactory: + current_offset: int = 0 + + def define(self, size: int, length: int = 1) -> int: + + # If necessary, align current_offset to the current size first. + bytes_to_alignment = self.current_offset % size + if bytes_to_alignment != 0: + self.current_offset += (size - bytes_to_alignment) + + # Increment current_offset so the next definition can be made. + offset_to_use = self.current_offset + self.current_offset += (size * length) + return offset_to_use + + +# Start defining important memory address offsets here. They must be in the same order, have the same sizes, and have +# the same lengths, as defined in `ap-info-jak1`. +offsets = OffsetFactory() + +# Cell, Buzzer, and Special information. +next_cell_index_offset = offsets.define(sizeof_uint64) +next_buzzer_index_offset = offsets.define(sizeof_uint64) +next_special_index_offset = offsets.define(sizeof_uint64) + +cells_checked_offset = offsets.define(sizeof_uint32, 101) +buzzers_checked_offset = offsets.define(sizeof_uint32, 112) +specials_checked_offset = offsets.define(sizeof_uint32, 32) + +buzzers_received_offset = offsets.define(sizeof_uint8, 16) +specials_received_offset = offsets.define(sizeof_uint8, 32) + +# Deathlink information. +death_count_offset = offsets.define(sizeof_uint32) +death_cause_offset = offsets.define(sizeof_uint8) +deathlink_enabled_offset = offsets.define(sizeof_uint8) + +# Move Rando information. +next_orb_cache_index_offset = offsets.define(sizeof_uint64) +orb_caches_checked_offset = offsets.define(sizeof_uint32, 16) +moves_received_offset = offsets.define(sizeof_uint8, 16) +moverando_enabled_offset = offsets.define(sizeof_uint8) + +# Orbsanity information. +orbsanity_option_offset = offsets.define(sizeof_uint8) +orbsanity_bundle_offset = offsets.define(sizeof_uint32) +collected_bundle_offset = offsets.define(sizeof_uint32, 17) + +# Progression and Completion information. +fire_canyon_unlock_offset = offsets.define(sizeof_float) +mountain_pass_unlock_offset = offsets.define(sizeof_float) +lava_tube_unlock_offset = offsets.define(sizeof_float) +citizen_orb_amount_offset = offsets.define(sizeof_float) +oracle_orb_amount_offset = offsets.define(sizeof_float) +completion_goal_offset = offsets.define(sizeof_uint8) +completed_offset = offsets.define(sizeof_uint8) + +# Text to display in the HUD (32 char max per string). +their_item_name_offset = offsets.define(sizeof_uint8, 32) +their_item_owner_offset = offsets.define(sizeof_uint8, 32) +my_item_name_offset = offsets.define(sizeof_uint8, 32) +my_item_finder_offset = offsets.define(sizeof_uint8, 32) + +# Version of the memory struct, to cut down on mod/apworld version mismatches. +memory_version_offset = offsets.define(sizeof_uint32) + +# Connection status to AP server (not the game!) +server_connection_offset = offsets.define(sizeof_uint8) +slot_name_offset = offsets.define(sizeof_uint8, 16) +slot_seed_offset = offsets.define(sizeof_uint8, 8) + +# Trap information. +trap_duration_offset = offsets.define(sizeof_float) + +# The End. +end_marker_offset = offsets.define(sizeof_uint8, 4) + + +# Can't believe this is easier to do in GOAL than Python but that's how it be sometimes. +def as_float(value: int) -> int: + return int(struct.unpack('f', value.to_bytes(sizeof_float, "little"))[0]) + + +# "Jak" to be replaced by player name in the Client. +def autopsy(cause: int) -> str: + if cause in [1, 2, 3, 4]: + return random.choice(["Jak said goodnight.", + "Jak stepped into the light.", + "Jak gave Daxter his insect collection.", + "Jak did not follow Step 1."]) + if cause == 5: + return "Jak fell into an endless pit." + if cause == 6: + return "Jak drowned in the spicy water." + if cause == 7: + return "Jak tried to tackle a Lurker Shark." + if cause == 8: + return "Jak hit 500 degrees." + if cause == 9: + return "Jak took a bath in a pool of dark eco." + if cause == 10: + return "Jak got bombarded with flaming 30-ton boulders." + if cause == 11: + return "Jak hit 800 degrees." + if cause == 12: + return "Jak ceased to be." + if cause == 13: + return "Jak got eaten by the dark eco plant." + if cause == 14: + return "Jak burned up." + if cause == 15: + return "Jak hit the ground hard." + if cause == 16: + return "Jak crashed the zoomer." + if cause == 17: + return "Jak got Flut Flut hurt." + if cause == 18: + return "Jak poisoned the whole darn catch." + if cause == 19: + return "Jak collided with too many obstacles." + return "Jak died." + + +class JakAndDaxterMemoryReader: + marker: ByteString + goal_address: int | None = None + connected: bool = False + initiated_connect: bool = False + + # The memory reader just needs the game running. + gk_process: pymem.process = None + + location_outbox: list[int] = [] + outbox_index: int = 0 + finished_game: bool = False + + # Deathlink handling + deathlink_enabled: bool = False + send_deathlink: bool = False + cause_of_death: str = "" + death_count: int = 0 + + # Orbsanity handling + orbsanity_enabled: bool = False + orbs_paid: int = 0 + + # Game-related callbacks (inform the AP server of changes to game state) + inform_checked_location: Callable + inform_finished_game: Callable + inform_died: Callable + inform_toggled_deathlink: Callable + inform_traded_orbs: Callable + + # Logging callbacks + # These will write to the provided logger, as well as the Client GUI with color markup. + log_error: Callable # Red + log_warn: Callable # Orange + log_success: Callable # Green + log_info: Callable # White (default) + + def __init__(self, + location_check_callback: Callable, + finish_game_callback: Callable, + send_deathlink_callback: Callable, + toggle_deathlink_callback: Callable, + orb_trade_callback: Callable, + log_error_callback: Callable, + log_warn_callback: Callable, + log_success_callback: Callable, + log_info_callback: Callable, + marker: ByteString = b'UnLiStEdStRaTs_JaK1\x00'): + self.marker = marker + + self.inform_checked_location = location_check_callback + self.inform_finished_game = finish_game_callback + self.inform_died = send_deathlink_callback + self.inform_toggled_deathlink = toggle_deathlink_callback + self.inform_traded_orbs = orb_trade_callback + + self.log_error = log_error_callback + self.log_warn = log_warn_callback + self.log_success = log_success_callback + self.log_info = log_info_callback + + async def main_tick(self): + if self.initiated_connect: + await self.connect() + self.initiated_connect = False + + if self.connected: + try: + self.gk_process.read_bool(self.gk_process.base_address) # Ping to see if it's alive. + except (ProcessError, MemoryReadError, WinAPIError): + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + else: + return + + if self.connected: + + # Save some state variables temporarily. + old_deathlink_enabled = self.deathlink_enabled + + # Read the memory address to check the state of the game. + self.read_memory() + + # Checked Locations in game. Handle the entire outbox every tick until we're up to speed. + if len(self.location_outbox) > self.outbox_index: + self.inform_checked_location(self.location_outbox) + self.save_data() + self.outbox_index += 1 + + if self.finished_game: + self.inform_finished_game() + + if old_deathlink_enabled != self.deathlink_enabled: + self.inform_toggled_deathlink() + logger.debug("Toggled DeathLink " + ("ON" if self.deathlink_enabled else "OFF")) + + if self.send_deathlink: + self.inform_died() + + if self.orbs_paid > 0: + self.inform_traded_orbs(self.orbs_paid) + self.orbs_paid = 0 + + async def connect(self): + try: + self.gk_process = pymem.Pymem("gk.exe") # The GOAL Kernel + logger.debug("Found the gk process: " + str(self.gk_process.process_id)) + except ProcessNotFound: + self.log_error(logger, "Could not find the game process.") + self.connected = False + return + + # If we don't find the marker in the first loaded module, we've failed. + modules = list(self.gk_process.list_modules()) + marker_address = pattern.pattern_scan_module(self.gk_process.process_handle, modules[0], self.marker) + if marker_address: + # At this address is another address that contains the struct we're looking for: the game's state. + # From here we need to add the length in bytes for the marker and 4 bytes of padding, + # and the struct address is 8 bytes long (it's an uint64). + goal_pointer = marker_address + len(self.marker) + 4 + self.goal_address = int.from_bytes(self.gk_process.read_bytes(goal_pointer, sizeof_uint64), + byteorder="little", + signed=False) + logger.debug("Found the archipelago memory address: " + str(self.goal_address)) + await self.verify_memory_version() + else: + self.log_error(logger, "Could not find the Archipelago marker address!") + self.connected = False + + async def verify_memory_version(self): + if self.goal_address is None: + self.log_error(logger, "Could not find the Archipelago memory address!") + self.connected = False + return + + memory_version: int | None = None + try: + memory_version = self.read_goal_address(memory_version_offset, sizeof_uint32) + if memory_version == expected_memory_version: + self.log_success(logger, "The Memory Reader is ready!") + self.connected = True + else: + raise MemoryReadError(memory_version_offset, sizeof_uint32) + except (ProcessError, MemoryReadError, WinAPIError): + if memory_version is None: + msg = (f"Could not find a version number in the OpenGOAL memory structure!\n" + f" Expected Version: {str(expected_memory_version)}\n" + f" Found Version: {str(memory_version)}\n" + f"Please follow these steps:\n" + f" If the game is running, try entering '/memr connect' in the client.\n" + f" You should see 'The Memory Reader is ready!'\n" + f" If that did not work, or the game is not running, run the OpenGOAL Launcher.\n" + f" Click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Try entering '/memr connect' in the client again.") + else: + msg = (f"The OpenGOAL memory structure is incompatible with the current Archipelago client!\n" + f" Expected Version: {str(expected_memory_version)}\n" + f" Found Version: {str(memory_version)}\n" + f"Please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Click Update (if one is available).\n" + f" Click Advanced > Compile. When this is done, click Continue.\n" + f" Click Versions and verify the latest version is marked 'Active'.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.") + self.log_error(logger, msg) + self.connected = False + + async def print_status(self): + proc_id = str(self.gk_process.process_id) if self.gk_process else "None" + last_loc = str(self.location_outbox[self.outbox_index - 1] if self.outbox_index else "None") + msg = (f"Memory Reader Status:\n" + f" Game process ID: {proc_id}\n" + f" Game state memory address: {str(self.goal_address)}\n" + f" Last location checked: {last_loc}") + await self.verify_memory_version() + self.log_info(logger, msg) + + def read_memory(self) -> list[int]: + try: + # Need to grab these first and convert to floats, see below. + citizen_orb_amount = self.read_goal_address(citizen_orb_amount_offset, sizeof_float) + oracle_orb_amount = self.read_goal_address(oracle_orb_amount_offset, sizeof_float) + + next_cell_index = self.read_goal_address(next_cell_index_offset, sizeof_uint64) + for k in range(0, next_cell_index): + next_cell = self.read_goal_address(cells_checked_offset + (k * sizeof_uint32), sizeof_uint32) + cell_ap_id = cells.to_ap_id(next_cell) + if cell_ap_id not in self.location_outbox: + self.location_outbox.append(cell_ap_id) + logger.debug("Checked power cell: " + str(next_cell)) + + # If orbsanity is ON and next_cell is one of the traders or oracles, then run a callback + # to add their amount to the DataStorage value holding our current orb trade total. + if next_cell in {11, 12, 31, 32, 33, 96, 97, 98, 99}: + citizen_orb_amount = as_float(citizen_orb_amount) + self.orbs_paid += citizen_orb_amount + logger.debug(f"Traded {citizen_orb_amount} orbs!") + + if next_cell in {13, 14, 34, 35, 100, 101}: + oracle_orb_amount = as_float(oracle_orb_amount) + self.orbs_paid += oracle_orb_amount + logger.debug(f"Traded {oracle_orb_amount} orbs!") + + next_buzzer_index = self.read_goal_address(next_buzzer_index_offset, sizeof_uint64) + for k in range(0, next_buzzer_index): + next_buzzer = self.read_goal_address(buzzers_checked_offset + (k * sizeof_uint32), sizeof_uint32) + buzzer_ap_id = flies.to_ap_id(next_buzzer) + if buzzer_ap_id not in self.location_outbox: + self.location_outbox.append(buzzer_ap_id) + logger.debug("Checked scout fly: " + str(next_buzzer)) + + next_special_index = self.read_goal_address(next_special_index_offset, sizeof_uint64) + for k in range(0, next_special_index): + next_special = self.read_goal_address(specials_checked_offset + (k * sizeof_uint32), sizeof_uint32) + special_ap_id = specials.to_ap_id(next_special) + if special_ap_id not in self.location_outbox: + self.location_outbox.append(special_ap_id) + logger.debug("Checked special: " + str(next_special)) + + death_count = self.read_goal_address(death_count_offset, sizeof_uint32) + death_cause = self.read_goal_address(death_cause_offset, sizeof_uint8) + if death_count > self.death_count: + self.cause_of_death = autopsy(death_cause) # The way he names his variables? Wack! + self.send_deathlink = True + self.death_count += 1 + + # Listen for any changes to this setting. + deathlink_flag = self.read_goal_address(deathlink_enabled_offset, sizeof_uint8) + self.deathlink_enabled = bool(deathlink_flag) + + next_cache_index = self.read_goal_address(next_orb_cache_index_offset, sizeof_uint64) + for k in range(0, next_cache_index): + next_cache = self.read_goal_address(orb_caches_checked_offset + (k * sizeof_uint32), sizeof_uint32) + cache_ap_id = caches.to_ap_id(next_cache) + if cache_ap_id not in self.location_outbox: + self.location_outbox.append(cache_ap_id) + logger.debug("Checked orb cache: " + str(next_cache)) + + # Listen for any changes to this setting. + # moverando_flag = self.read_goal_address(moverando_enabled_offset, sizeof_uint8) + # self.moverando_enabled = bool(moverando_flag) + + orbsanity_option = self.read_goal_address(orbsanity_option_offset, sizeof_uint8) + bundle_size = self.read_goal_address(orbsanity_bundle_offset, sizeof_uint32) + self.orbsanity_enabled = orbsanity_option > 0 + + # Per Level Orbsanity option. Only need to do this loop if we chose this setting. + if orbsanity_option == 1: + for level in range(0, 16): + collected_bundles = self.read_goal_address(collected_bundle_offset + (level * sizeof_uint32), + sizeof_uint32) + + # Count up from the first bundle, by bundle size, until you reach the latest collected bundle. + # e.g. {25, 50, 75, 100, 125...} + if collected_bundles > 0: + for bundle in range(bundle_size, + bundle_size + collected_bundles, # Range max is non-inclusive. + bundle_size): + + bundle_ap_id = orbs.to_ap_id(orbs.find_address(level, bundle, bundle_size)) + if bundle_ap_id not in self.location_outbox: + self.location_outbox.append(bundle_ap_id) + logger.debug(f"Checked orb bundle: L{level} {bundle}") + + # Global Orbsanity option. Index 16 refers to all orbs found regardless of level. + if orbsanity_option == 2: + collected_bundles = self.read_goal_address(collected_bundle_offset + (16 * sizeof_uint32), + sizeof_uint32) + if collected_bundles > 0: + for bundle in range(bundle_size, + bundle_size + collected_bundles, # Range max is non-inclusive. + bundle_size): + + bundle_ap_id = orbs.to_ap_id(orbs.find_address(16, bundle, bundle_size)) + if bundle_ap_id not in self.location_outbox: + self.location_outbox.append(bundle_ap_id) + logger.debug(f"Checked orb bundle: G {bundle}") + + completed = self.read_goal_address(completed_offset, sizeof_uint8) + if completed > 0 and not self.finished_game: + self.finished_game = True + self.log_success(logger, "Congratulations! You finished the game!") + + except (ProcessError, MemoryReadError, WinAPIError): + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + + return self.location_outbox + + def read_goal_address(self, offset: int, length: int) -> int: + return int.from_bytes( + self.gk_process.read_bytes(self.goal_address + offset, length), + byteorder="little", + signed=False) + + def save_data(self): + with open("jakanddaxter_location_outbox.json", "w+") as f: + dump = { + "outbox_index": self.outbox_index, + "location_outbox": self.location_outbox + } + json.dump(dump, f, indent=4) + + def load_data(self): + try: + with open("jakanddaxter_location_outbox.json", "r") as f: + load = json.load(f) + self.outbox_index = load["outbox_index"] + self.location_outbox = load["location_outbox"] + except FileNotFoundError: + pass diff --git a/worlds/jakanddaxter/agents/repl_client.py b/worlds/jakanddaxter/agents/repl_client.py new file mode 100644 index 0000000000..b207bba281 --- /dev/null +++ b/worlds/jakanddaxter/agents/repl_client.py @@ -0,0 +1,527 @@ +import json +import logging +import queue +import time +import struct +import random +from dataclasses import dataclass +from queue import Queue +from typing import Callable + +import pymem +from pymem.exception import ProcessNotFound, ProcessError + +import asyncio +from asyncio import StreamReader, StreamWriter, Lock + +from NetUtils import NetworkItem +from ..game_id import jak1_id, jak1_max +from ..items import item_table, trap_item_table +from ..locs import ( + orb_locations as orbs, + cell_locations as cells, + scout_locations as flies, + special_locations as specials, + orb_cache_locations as caches) + + +logger = logging.getLogger("ReplClient") + + +@dataclass +class JsonMessageData: + my_item_name: str | None = None + my_item_finder: str | None = None + their_item_name: str | None = None + their_item_owner: str | None = None + + +ALLOWED_CHARACTERS = frozenset({ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", + "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", + "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", + "y", "z", " ", "!", ":", ",", ".", "/", "?", "-", + "=", "+", "'", "(", ")", "\"" +}) + + +class JakAndDaxterReplClient: + ip: str + port: int + reader: StreamReader + writer: StreamWriter + lock: Lock + connected: bool = False + initiated_connect: bool = False # Signals when user tells us to try reconnecting. + received_deathlink: bool = False + balanced_orbs: bool = False + + # Variables to handle the title screen and initial game connection. + initial_item_count = -1 # Brand new games have 0 items, so initialize this to -1. + received_initial_items = False + processed_initial_items = False + + # The REPL client needs the REPL/compiler process running, but that process + # also needs the game running. Therefore, the REPL client needs both running. + gk_process: pymem.process = None + goalc_process: pymem.process = None + + item_inbox: dict[int, NetworkItem] = {} + inbox_index = 0 + json_message_queue: Queue[JsonMessageData] = queue.Queue() + + # Logging callbacks + # These will write to the provided logger, as well as the Client GUI with color markup. + log_error: Callable # Red + log_warn: Callable # Orange + log_success: Callable # Green + log_info: Callable # White (default) + + def __init__(self, + log_error_callback: Callable, + log_warn_callback: Callable, + log_success_callback: Callable, + log_info_callback: Callable, + ip: str = "127.0.0.1", + port: int = 8181): + self.ip = ip + self.port = port + self.lock = asyncio.Lock() + self.log_error = log_error_callback + self.log_warn = log_warn_callback + self.log_success = log_success_callback + self.log_info = log_info_callback + + async def main_tick(self): + if self.initiated_connect: + await self.connect() + self.initiated_connect = False + + if self.connected: + try: + self.gk_process.read_bool(self.gk_process.base_address) # Ping to see if it's alive. + except ProcessError: + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + try: + self.goalc_process.read_bool(self.goalc_process.base_address) # Ping to see if it's alive. + except ProcessError: + msg = (f"Error sending data to compiler! (Did the compiler crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + else: + return + + # When connecting the game to the AP server on the title screen, we may be processing items from starting + # inventory or items received in an async game. Once we have caught up to the initial count, tell the player + # that we are ready to start. New items may even come in during the title screen, so if we go over the count, + # we should still send the ready signal. + if not self.processed_initial_items: + if self.inbox_index >= self.initial_item_count >= 0: + self.processed_initial_items = True + await self.send_connection_status("ready") + + # Receive Items from AP. Handle 1 item per tick. + if len(self.item_inbox) > self.inbox_index: + await self.receive_item() + await self.save_data() + self.inbox_index += 1 + + if self.received_deathlink: + await self.receive_deathlink() + self.received_deathlink = False + + # Progressively empty the queue during each tick + # if text messages happen to be too slow we could pool dequeuing here, + # but it'd slow down the ItemReceived message during release + if not self.json_message_queue.empty(): + json_txt_data = self.json_message_queue.get_nowait() + await self.write_game_text(json_txt_data) + + # This helper function formats and sends `form` as a command to the REPL. + # ALL commands to the REPL should be sent using this function. + async def send_form(self, form: str, print_ok: bool = True) -> bool: + header = struct.pack(" str: + result = "".join([c if c in ALLOWED_CHARACTERS else "?" for c in text[:32]]).upper() + result = result.replace("'", "\\c12") + return f"\"{result}\"" + + # Like sanitize_game_text, but the settings file will NOT allow any whitespace in the slot_name or slot_seed data. + # And don't replace any chars with "?" for good measure. + @staticmethod + def sanitize_file_text(text: str) -> str: + allowed_chars_no_extras = ALLOWED_CHARACTERS - {" ", "'", "(", ")", "\""} + result = "".join([c if c in allowed_chars_no_extras else "" for c in text[:16]]).upper() + return f"\"{result}\"" + + # Pushes a JsonMessageData object to the json message queue to be processed during the repl main_tick + def queue_game_text(self, my_item_name, my_item_finder, their_item_name, their_item_owner): + self.json_message_queue.put(JsonMessageData(my_item_name, my_item_finder, their_item_name, their_item_owner)) + + # OpenGOAL can handle both its own string datatype and C-like character pointers (charp). + async def write_game_text(self, data: JsonMessageData): + logger.debug(f"Sending info to the in-game messenger!") + body = "" + if data.my_item_name and data.my_item_finder: + body += (f" (append-messages (-> *ap-messenger* 0) \'recv " + f" {self.sanitize_game_text(data.my_item_name)} " + f" {self.sanitize_game_text(data.my_item_finder)})") + if data.their_item_name and data.their_item_owner: + body += (f" (append-messages (-> *ap-messenger* 0) \'sent " + f" {self.sanitize_game_text(data.their_item_name)} " + f" {self.sanitize_game_text(data.their_item_owner)})") + await self.send_form(f"(begin {body} (none))", print_ok=False) + + async def receive_item(self): + ap_id = getattr(self.item_inbox[self.inbox_index], "item") + + # Determine the type of item to receive. + if ap_id in range(jak1_id, jak1_id + flies.fly_offset): + await self.receive_power_cell(ap_id) + elif ap_id in range(jak1_id + flies.fly_offset, jak1_id + specials.special_offset): + await self.receive_scout_fly(ap_id) + elif ap_id in range(jak1_id + specials.special_offset, jak1_id + caches.orb_cache_offset): + await self.receive_special(ap_id) + elif ap_id in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + await self.receive_move(ap_id) + elif ap_id in range(jak1_id + orbs.orb_offset, jak1_max - max(trap_item_table)): + await self.receive_precursor_orb(ap_id) # Ponder the orbs. + elif ap_id in range(jak1_max - max(trap_item_table), jak1_max): + await self.receive_trap(ap_id) + elif ap_id == jak1_max: + await self.receive_green_eco() # Ponder why I chose to do ID's this way. + else: + self.log_error(logger, f"Tried to receive item with unknown AP ID {ap_id}!") + + async def receive_power_cell(self, ap_id: int) -> bool: + cell_id = cells.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type fuel-cell) " + "(the float " + str(cell_id) + "))") + if ok: + logger.debug(f"Received a Power Cell!") + else: + self.log_error(logger, f"Unable to receive a Power Cell!") + return ok + + async def receive_scout_fly(self, ap_id: int) -> bool: + fly_id = flies.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type buzzer) " + "(the float " + str(fly_id) + "))") + if ok: + logger.debug(f"Received a {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive a {item_table[ap_id]}!") + return ok + + async def receive_special(self, ap_id: int) -> bool: + special_id = specials.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-special) " + "(the float " + str(special_id) + "))") + if ok: + logger.debug(f"Received special unlock {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive special unlock {item_table[ap_id]}!") + return ok + + async def receive_move(self, ap_id: int) -> bool: + move_id = caches.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-move) " + "(the float " + str(move_id) + "))") + if ok: + logger.debug(f"Received the ability to {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive the ability to {item_table[ap_id]}!") + return ok + + async def receive_precursor_orb(self, ap_id: int) -> bool: + orb_amount = orbs.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type money) " + "(the float " + str(orb_amount) + "))") + if ok: + logger.debug(f"Received {orb_amount} Precursor orbs!") + else: + self.log_error(logger, f"Unable to receive {orb_amount} Precursor orbs!") + return ok + + async def receive_trap(self, ap_id: int) -> bool: + trap_id = jak1_max - ap_id + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-trap) " + "(the float " + str(trap_id) + "))") + if ok: + logger.debug(f"Received a {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive a {item_table[ap_id]}!") + return ok + + # Green eco pills are our filler item. Use the get-pickup event instead to handle being full health. + async def receive_green_eco(self) -> bool: + ok = await self.send_form("(send-event *target* \'get-pickup (pickup-type eco-pill) (the float 1))") + if ok: + logger.debug(f"Received a green eco pill!") + else: + self.log_error(logger, f"Unable to receive a green eco pill!") + return ok + + async def receive_deathlink(self) -> bool: + + # Because it should at least be funny sometimes. + death_types = ["\'death", + "\'death", + "\'death", + "\'death", + "\'endlessfall", + "\'drown-death", + "\'melt", + "\'dark-eco-pool"] + chosen_death = random.choice(death_types) + + ok = await self.send_form("(ap-deathlink-received! " + chosen_death + ")") + if ok: + logger.debug(f"Received deathlink signal!") + else: + self.log_error(logger, f"Unable to receive deathlink signal!") + return ok + + async def subtract_traded_orbs(self, orb_count: int) -> bool: + + # To protect against momentary server disconnects, + # this should only be done once per client session. + if not self.balanced_orbs: + self.balanced_orbs = True + + ok = await self.send_form(f"(-! (-> *game-info* money) (the float {orb_count}))") + if ok: + logger.debug(f"Subtracting {orb_count} traded orbs!") + else: + self.log_error(logger, f"Unable to subtract {orb_count} traded orbs!") + return ok + + return True + + # OpenGOAL has a limit of 8 parameters per function. We've already hit this limit. So, define a new datatype + # in OpenGOAL that holds all these options, instantiate the type here, and have ap-setup-options! function take + # that instance as input. + async def setup_options(self, + os_option: int, os_bundle: int, + fc_count: int, mp_count: int, + lt_count: int, ct_amount: int, + ot_amount: int, trap_time: int, + goal_id: int, slot_name: str, + slot_seed: str) -> bool: + sanitized_name = self.sanitize_file_text(slot_name) + sanitized_seed = self.sanitize_file_text(slot_seed) + + # I didn't want to have to do this with floats but GOAL's compile-time vs runtime types leave me no choice. + ok = await self.send_form(f"(ap-setup-options! (new 'static 'ap-seed-options " + f":orbsanity-option {os_option} " + f":orbsanity-bundle {os_bundle} " + f":fire-canyon-unlock {fc_count}.0 " + f":mountain-pass-unlock {mp_count}.0 " + f":lava-tube-unlock {lt_count}.0 " + f":citizen-orb-amount {ct_amount}.0 " + f":oracle-orb-amount {ot_amount}.0 " + f":trap-duration {trap_time}.0 " + f":completion-goal {goal_id} " + f":slot-name {sanitized_name} " + f":slot-seed {sanitized_seed} ))") + message = (f"Setting options: \n" + f" orbsanity Option {os_option}, orbsanity Bundle {os_bundle}, \n" + f" FC Cell Count {fc_count}, MP Cell Count {mp_count}, \n" + f" LT Cell Count {lt_count}, Citizen Orb Amt {ct_amount}, \n" + f" Oracle Orb Amt {ot_amount}, Trap Duration {trap_time}, \n" + f" Completion GOAL {goal_id}, Slot Name {sanitized_name}, \n" + f" Slot Seed {sanitized_seed}... ") + if ok: + logger.debug(message + "Success!") + else: + self.log_error(logger, message + "Failed!") + + return ok + + async def send_connection_status(self, status: str) -> bool: + ok = await self.send_form(f"(ap-set-connection-status! (connection-status {status}))") + if ok: + logger.debug(f"Connection Status {status} set!") + else: + self.log_error(logger, f"Connection Status {status} failed to set!") + + return ok + + async def save_data(self): + with open("jakanddaxter_item_inbox.json", "w+") as f: + dump = { + "inbox_index": self.inbox_index, + "item_inbox": [{ + "item": self.item_inbox[k].item, + "location": self.item_inbox[k].location, + "player": self.item_inbox[k].player, + "flags": self.item_inbox[k].flags + } for k in self.item_inbox + ] + } + json.dump(dump, f, indent=4) + + def load_data(self): + try: + with open("jakanddaxter_item_inbox.json", "r") as f: + load = json.load(f) + self.inbox_index = load["inbox_index"] + self.item_inbox = {k: NetworkItem( + item=load["item_inbox"][k]["item"], + location=load["item_inbox"][k]["location"], + player=load["item_inbox"][k]["player"], + flags=load["item_inbox"][k]["flags"] + ) for k in range(0, len(load["item_inbox"])) + } + except FileNotFoundError: + pass diff --git a/worlds/jakanddaxter/client.py b/worlds/jakanddaxter/client.py new file mode 100644 index 0000000000..2b669d3847 --- /dev/null +++ b/worlds/jakanddaxter/client.py @@ -0,0 +1,600 @@ +# Python standard libraries +import asyncio +import json +import logging +import os +import subprocess +import sys + +from asyncio import Task +from datetime import datetime +from logging import Logger +from typing import Awaitable + +# Misc imports +import colorama +import pymem + +from pymem.exception import ProcessNotFound + +# Archipelago imports +import ModuleUpdate +import Utils + +from CommonClient import ClientCommandProcessor, CommonContext, server_loop, gui_enabled +from NetUtils import ClientStatus + +# Jak imports +from .game_id import jak1_name +from .options import EnableOrbsanity +from .agents.memory_reader import JakAndDaxterMemoryReader +from .agents.repl_client import JakAndDaxterReplClient +from . import JakAndDaxterWorld + + +ModuleUpdate.update() +logger = logging.getLogger("JakClient") +all_tasks: set[Task] = set() + + +def create_task_log_exception(awaitable: Awaitable) -> asyncio.Task: + async def _log_exception(a): + try: + return await a + except Exception as e: + logger.exception(e) + finally: + all_tasks.remove(task) + task = asyncio.create_task(_log_exception(awaitable)) + all_tasks.add(task) + return task + + +class JakAndDaxterClientCommandProcessor(ClientCommandProcessor): + ctx: "JakAndDaxterContext" + + # The command processor is not async so long-running operations like the /repl connect command + # (which takes 10-15 seconds to compile the game) have to be requested with user-initiated flags. + # The flags are checked by the agents every main_tick. + def _cmd_repl(self, *arguments: str): + """Sends a command to the OpenGOAL REPL. Arguments: + - connect : connect the client to the REPL (goalc). + - status : check internal status of the REPL.""" + if arguments: + if arguments[0] == "connect": + self.ctx.on_log_info(logger, "This may take a bit... Wait for the success audio cue before continuing!") + self.ctx.repl.initiated_connect = True + if arguments[0] == "status": + create_task_log_exception(self.ctx.repl.print_status()) + + def _cmd_memr(self, *arguments: str): + """Sends a command to the Memory Reader. Arguments: + - connect : connect the memory reader to the game process (gk). + - status : check the internal status of the Memory Reader.""" + if arguments: + if arguments[0] == "connect": + self.ctx.memr.initiated_connect = True + if arguments[0] == "status": + create_task_log_exception(self.ctx.memr.print_status()) + + +class JakAndDaxterContext(CommonContext): + game = jak1_name + items_handling = 0b111 # Full item handling + command_processor = JakAndDaxterClientCommandProcessor + + # We'll need two agents working in tandem to handle two-way communication with the game. + # The REPL Client will handle the server->game direction by issuing commands directly to the running game. + # But the REPL cannot send information back to us, it only ingests information we send it. + # Luckily OpenGOAL sets up memory addresses to write to, that AutoSplit can read from, for speedrunning. + # We'll piggyback off this system with a Memory Reader, and that will handle the game->server direction. + repl: JakAndDaxterReplClient + memr: JakAndDaxterMemoryReader + + # And two associated tasks, so we have handles on them. + repl_task: asyncio.Task + memr_task: asyncio.Task + + # Storing some information for writing save slot identifiers. + slot_seed: str + + def __init__(self, server_address: str | None, password: str | None) -> None: + self.repl = JakAndDaxterReplClient(self.on_log_error, + self.on_log_warn, + self.on_log_success, + self.on_log_info) + self.memr = JakAndDaxterMemoryReader(self.on_location_check, + self.on_finish_check, + self.on_deathlink_check, + self.on_deathlink_toggle, + self.on_orb_trade, + self.on_log_error, + self.on_log_warn, + self.on_log_success, + self.on_log_info) + # self.repl.load_data() + # self.memr.load_data() + super().__init__(server_address, password) + + def run_gui(self): + from kvui import GameManager + + class JakAndDaxterManager(GameManager): + logging_pairs = [ + ("Client", "Archipelago") + ] + base_title = "Jak and Daxter ArchipelaGOAL Client" + + self.ui = JakAndDaxterManager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(JakAndDaxterContext, self).server_auth(password_requested) + await self.get_username() + self.tags = set() + await self.send_connect() + + def on_package(self, cmd: str, args: dict): + + if cmd == "RoomInfo": + self.slot_seed = args["seed_name"] + + if cmd == "Connected": + slot_data = args["slot_data"] + orbsanity_option = slot_data["enable_orbsanity"] + if orbsanity_option == EnableOrbsanity.option_per_level: + orbsanity_bundle = slot_data["level_orbsanity_bundle_size"] + elif orbsanity_option == EnableOrbsanity.option_global: + orbsanity_bundle = slot_data["global_orbsanity_bundle_size"] + else: + orbsanity_bundle = 1 + + # Connected packet is unaware of starting inventory or if player is returning to an existing game. + # Set initial_item_count to 0, see below comments for more info. + if not self.repl.received_initial_items and self.repl.initial_item_count < 0: + self.repl.initial_item_count = 0 + + create_task_log_exception( + self.repl.setup_options(orbsanity_option, + orbsanity_bundle, + slot_data["fire_canyon_cell_count"], + slot_data["mountain_pass_cell_count"], + slot_data["lava_tube_cell_count"], + slot_data["citizen_orb_trade_amount"], + slot_data["oracle_orb_trade_amount"], + slot_data["trap_effect_duration"], + slot_data["jak_completion_condition"], + self.auth[:16], # The slot name + self.slot_seed[:8])) + + # Because Orbsanity and the orb traders in the game are intrinsically linked, we need the server + # to track our trades at all times to support async play. "Retrieved" will tell us the orbs we lost, + # while "ReceivedItems" will tell us the orbs we gained. This will give us the correct balance. + if orbsanity_option in [EnableOrbsanity.option_per_level, EnableOrbsanity.option_global]: + async def get_orb_balance(): + await self.send_msgs([{"cmd": "Get", "keys": [f"jakanddaxter_{self.auth}_orbs_paid"]}]) + + create_task_log_exception(get_orb_balance()) + + # Tell the server if Deathlink is enabled or disabled in the in-game options. + # This allows us to "remember" the user's choice. + self.on_deathlink_toggle() + + if cmd == "Retrieved": + if f"jakanddaxter_{self.auth}_orbs_paid" in args["keys"]: + orbs_traded = args["keys"][f"jakanddaxter_{self.auth}_orbs_paid"] + orbs_traded = orbs_traded if orbs_traded is not None else 0 + create_task_log_exception(self.repl.subtract_traded_orbs(orbs_traded)) + + if cmd == "ReceivedItems": + + # If you have a starting inventory or are returning to a game where you have items, a ReceivedItems will be + # in the same network packet as Connected. This guarantees it is the first of any ReceivedItems we process. + # In this case, we should set the initial_item_count to > 0, even if already set to 0 by Connected, as well + # as the received_initial_items flag. Finally, use send_connection_status to tell the player to wait while + # we process the initial items. However, we will skip all this if there was no initial ReceivedItems and + # the REPL indicates it already handled any initial items (0 or otherwise). + if not self.repl.received_initial_items and not self.repl.processed_initial_items: + self.repl.received_initial_items = True + self.repl.initial_item_count = len(args["items"]) + create_task_log_exception(self.repl.send_connection_status("wait")) + + # This enumeration should run on every ReceivedItems packet, + # regardless of it being on initial connection or midway through a game. + for index, item in enumerate(args["items"], start=args["index"]): + logger.debug(f"index: {str(index)}, item: {str(item)}") + self.repl.item_inbox[index] = item + + async def json_to_game_text(self, args: dict): + if "type" in args and args["type"] in {"ItemSend"}: + my_item_name: str | None = None + my_item_finder: str | None = None + their_item_name: str | None = None + their_item_owner: str | None = None + + item = args["item"] + recipient = args["receiving"] + + # Receiving an item from the server. + if self.slot_concerns_self(recipient): + my_item_name = self.item_names.lookup_in_game(item.item) + + # Did we find it, or did someone else? + if self.slot_concerns_self(item.player): + my_item_finder = "MYSELF" + else: + my_item_finder = self.player_names[item.player] + + # Sending an item to the server. + if self.slot_concerns_self(item.player): + their_item_name = self.item_names.lookup_in_slot(item.item, recipient) + + # Does it belong to us, or to someone else? + if self.slot_concerns_self(recipient): + their_item_owner = "MYSELF" + else: + their_item_owner = self.player_names[recipient] + + # Write to game display. + self.repl.queue_game_text(my_item_name, my_item_finder, their_item_name, their_item_owner) + + # Even though N items come in as 1 ReceivedItems packet, there are still N PrintJson packets to process, + # and they all arrive before the ReceivedItems packet does. Defer processing of these packets as + # async tasks to speed up large releases of items. + def on_print_json(self, args: dict) -> None: + create_task_log_exception(self.json_to_game_text(args)) + super(JakAndDaxterContext, self).on_print_json(args) + + # We need to do a little more than just use CommonClient's on_deathlink. + def on_deathlink(self, data: dict): + if self.memr.deathlink_enabled: + self.repl.received_deathlink = True + super().on_deathlink(data) + + # We don't need an ap_inform function because check_locations solves that need. + def on_location_check(self, location_ids: list[int]): + create_task_log_exception(self.check_locations(location_ids)) + + # CommonClient has no finished_game function, so we will have to craft our own. TODO - Update if that changes. + async def ap_inform_finished_game(self): + if not self.finished_game and self.memr.finished_game: + message = [{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}] + await self.send_msgs(message) + self.finished_game = True + + def on_finish_check(self): + create_task_log_exception(self.ap_inform_finished_game()) + + # We need to do a little more than just use CommonClient's send_death. + async def ap_inform_deathlink(self): + if self.memr.deathlink_enabled: + player = self.player_names[self.slot] if self.slot is not None else "Jak" + death_text = self.memr.cause_of_death.replace("Jak", player) + await self.send_death(death_text) + self.on_log_warn(logger, death_text) + + # Reset all flags, but leave the death count alone. + self.memr.send_deathlink = False + self.memr.cause_of_death = "" + + def on_deathlink_check(self): + create_task_log_exception(self.ap_inform_deathlink()) + + # We don't need an ap_inform function because update_death_link solves that need. + def on_deathlink_toggle(self): + create_task_log_exception(self.update_death_link(self.memr.deathlink_enabled)) + + # Orb trades are situations unique to Jak, so we have to craft our own function. + async def ap_inform_orb_trade(self, orbs_changed: int): + if self.memr.orbsanity_enabled: + await self.send_msgs([{"cmd": "Set", + "key": f"jakanddaxter_{self.auth}_orbs_paid", + "default": 0, + "want_reply": False, + "operations": [{"operation": "add", "value": orbs_changed}] + }]) + + def on_orb_trade(self, orbs_changed: int): + create_task_log_exception(self.ap_inform_orb_trade(orbs_changed)) + + def _markup_panels(self, msg: str, c: str = None): + color = self.jsontotextparser.color_codes[c] if c else None + message = f"[color={color}]{msg}[/color]" if c else msg + + self.ui.log_panels["Archipelago"].on_message_markup(message) + self.ui.log_panels["All"].on_message_markup(message) + + def on_log_error(self, lg: Logger, message: str): + lg.error(message) + if self.ui: + self._markup_panels(message, "red") + + def on_log_warn(self, lg: Logger, message: str): + lg.warning(message) + if self.ui: + self._markup_panels(message, "orange") + + def on_log_success(self, lg: Logger, message: str): + lg.info(message) + if self.ui: + self._markup_panels(message, "green") + + def on_log_info(self, lg: Logger, message: str): + lg.info(message) + if self.ui: + self._markup_panels(message) + + async def run_repl_loop(self): + while True: + await self.repl.main_tick() + await asyncio.sleep(0.1) + + async def run_memr_loop(self): + while True: + await self.memr.main_tick() + await asyncio.sleep(0.1) + + +def find_root_directory(ctx: JakAndDaxterContext): + + # The path to this file is platform-dependent. + if Utils.is_windows: + appdata = os.getenv("APPDATA") + settings_path = os.path.normpath(f"{appdata}/OpenGOAL-Launcher/settings.json") + elif Utils.is_linux: + home = os.path.expanduser("~") + settings_path = os.path.normpath(f"{home}/.config/OpenGOAL-Launcher/settings.json") + elif Utils.is_macos: + home = os.path.expanduser("~") + settings_path = os.path.normpath(f"{home}/Library/Application Support/OpenGOAL-Launcher/settings.json") + else: + ctx.on_log_error(logger, f"Unknown operating system: {sys.platform}!") + return + + # Boilerplate messages that all error messages in this function should have. + err_title = "Unable to locate the ArchipelaGOAL install directory" + alt_instructions = (f"Please verify that OpenGOAL and ArchipelaGOAL are installed properly. " + f"If the problem persists, follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Open Game Data Folder.\n" + f" Go up one folder, then copy this path.\n" + f" Run the Archipelago Launcher, click Open host.yaml.\n" + f" Set the value of 'jakanddaxter_options > root_directory' to this path.\n" + f" Replace all backslashes in the path with forward slashes.\n" + f" Set the value of 'jakanddaxter_options > auto_detect_root_directory' to false, " + f"then save and close the host.yaml file.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.") + + if not os.path.exists(settings_path): + msg = (f"{err_title}: the OpenGOAL settings file does not exist.\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + with open(settings_path, "r") as f: + load = json.load(f) + + jak1_installed = load["games"]["Jak 1"]["isInstalled"] + if not jak1_installed: + msg = (f"{err_title}: The OpenGOAL Launcher is missing a normal install of Jak 1!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + mod_sources = load["games"]["Jak 1"]["modsInstalledVersion"] + if mod_sources is None: + msg = (f"{err_title}: No mod sources have been configured in the OpenGOAL Launcher!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + # Mods can come from multiple user-defined sources. + # Make no assumptions about where ArchipelaGOAL comes from, we should find it ourselves. + archipelagoal_source = None + for src in mod_sources: + for mod in mod_sources[src].keys(): + if mod == "archipelagoal": + archipelagoal_source = src + # Using this file, we could verify the right version is installed, but we don't need to. + if archipelagoal_source is None: + msg = (f"{err_title}: The ArchipelaGOAL mod is not installed in the OpenGOAL Launcher!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + # This is just the base OpenGOAL directory, we need to go deeper. + base_path = load["installationDir"] + mod_relative_path = f"features/jak1/mods/{archipelagoal_source}/archipelagoal" + mod_path = os.path.normpath( + os.path.join( + os.path.normpath(base_path), + os.path.normpath(mod_relative_path))) + + return mod_path + + +async def run_game(ctx: JakAndDaxterContext): + + # These may already be running. If they are not running, try to start them. + # TODO - Support other OS's. 1: Pymem is Windows-only. 2: on Linux, there's no ".exe." + gk_running = False + try: + pymem.Pymem("gk.exe") # The GOAL Kernel + gk_running = True + except ProcessNotFound: + ctx.on_log_warn(logger, "Game not running, attempting to start.") + + goalc_running = False + try: + pymem.Pymem("goalc.exe") # The GOAL Compiler and REPL + goalc_running = True + except ProcessNotFound: + ctx.on_log_warn(logger, "Compiler not running, attempting to start.") + + try: + auto_detect_root_directory = JakAndDaxterWorld.settings.auto_detect_root_directory + if auto_detect_root_directory: + root_path = find_root_directory(ctx) + else: + root_path = JakAndDaxterWorld.settings.root_directory + + # Always trust your instincts... the user may not have entered their root_directory properly. + # We don't have to do this check if the root directory was auto-detected. + if "/" not in root_path: + msg = (f"The ArchipelaGOAL root directory contains no path. (Are you missing forward slashes?)\n" + f"Please check your host.yaml file.\n" + f"Verify the value of 'jakanddaxter_options > root_directory' is a valid existing path, " + f"and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Start by checking the existence of the root directory provided in the host.yaml file (or found automatically). + root_path = os.path.normpath(root_path) + if not os.path.exists(root_path): + msg = (f"The ArchipelaGOAL root directory does not exist, unable to locate the Game and Compiler.\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'. " + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Now double-check the existence of the two executables we need. + gk_path = os.path.join(root_path, "gk.exe") + goalc_path = os.path.join(root_path, "goalc.exe") + if not os.path.exists(gk_path) or not os.path.exists(goalc_path): + msg = (f"The Game and Compiler could not be found in the ArchipelaGOAL root directory.\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'. " + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Now we can FINALLY attempt to start the programs. + if not gk_running: + # Per-mod saves and settings are stored outside the ArchipelaGOAL root folder, so we have to traverse + # a relative path, normalize it, and pass it in as an argument to gk. This folder will be created if + # it does not exist. + config_relative_path = "../_settings/archipelagoal" + config_path = os.path.normpath( + os.path.join( + root_path, + os.path.normpath(config_relative_path))) + + # The game freezes if text is inadvertently selected in the stdout/stderr data streams. Let's pipe those + # streams to a file, and let's not clutter the screen with another console window. + timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + log_path = os.path.join(Utils.user_path("logs"), f"JakAndDaxterGame_{timestamp}.txt") + log_path = os.path.normpath(log_path) + with open(log_path, "w") as log_file: + gk_process = subprocess.Popen( + [gk_path, "--game", "jak1", + "--config-path", config_path, + "--", "-v", "-boot", "-fakeiso", "-debug"], + stdout=log_file, + stderr=log_file, + creationflags=subprocess.CREATE_NO_WINDOW) + + if not goalc_running: + # For the OpenGOAL Compiler, the existence of the "data" subfolder indicates you are running it from + # a built package. This subfolder is treated as its proj_path. + proj_path = os.path.join(root_path, "data") + if os.path.exists(proj_path): + + # Look for "iso_data" path to automate away an oft-forgotten manual step of mod updates. + # All relative paths should start from root_path and end with "jak1". + goalc_args = [] + possible_relative_paths = { + "../../../../../active/jak1/data/iso_data/jak1", + "./data/iso_data/jak1", + } + + for iso_relative_path in possible_relative_paths: + iso_path = os.path.normpath( + os.path.join( + root_path, + os.path.normpath(iso_relative_path))) + + if os.path.exists(iso_path): + goalc_args = [goalc_path, "--game", "jak1", "--proj-path", proj_path, "--iso-path", iso_path] + logger.debug(f"iso_data folder found: {iso_path}") + break + else: + logger.debug(f"iso_data folder not found, continuing: {iso_path}") + + if not goalc_args: + msg = (f"The iso_data folder could not be found.\n" + f"Please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Advanced > Open Game Data Folder.\n" + f" Copy the iso_data folder from this location.\n" + f" Click Jak and Daxter > Features > Mods > ArchipelaGOAL > Advanced > " + f"Open Game Data Folder.\n" + f" Paste the iso_data folder in this location.\n" + f" Click Advanced > Compile. When this is done, click Continue.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.\n" + f"(See Setup Guide for more details.)") + ctx.on_log_error(logger, msg) + return + + # The non-existence of the "data" subfolder indicates you are running it from source, as a developer. + # The compiler will traverse upward to find the project path on its own. It will also assume your + # "iso_data" folder is at the root of your repository. Therefore, we don't need any of those arguments. + else: + goalc_args = [goalc_path, "--game", "jak1"] + + # This needs to be a new console. The REPL console cannot share a window with any other process. + goalc_process = subprocess.Popen(goalc_args, creationflags=subprocess.CREATE_NEW_CONSOLE) + + except AttributeError as e: + if " " in e.args[0]: + # YAML keys in Host.yaml ought to contain no spaces, which means this is a much more important error. + ctx.on_log_error(logger, e.args[0]) + else: + ctx.on_log_error(logger, + f"Host.yaml does not contain {e.args[0]}, unable to locate game executables.") + return + except FileNotFoundError as e: + msg = (f"The following path could not be found: {e.filename}\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'." + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Auto connect the repl and memr agents. Sleep 5 because goalc takes just a little bit of time to load, + # and it's not something we can await. + ctx.on_log_info(logger, "This may take a bit... Wait for the game's title sequence before continuing!") + await asyncio.sleep(5) + ctx.repl.initiated_connect = True + ctx.memr.initiated_connect = True + + +async def main(): + Utils.init_logging("JakAndDaxterClient", exception_logger="Client") + + ctx = JakAndDaxterContext(None, None) + ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") + ctx.repl_task = create_task_log_exception(ctx.run_repl_loop()) + ctx.memr_task = create_task_log_exception(ctx.run_memr_loop()) + + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + + # Find and run the game (gk) and compiler/repl (goalc). + create_task_log_exception(run_game(ctx)) + await ctx.exit_event.wait() + await ctx.shutdown() + + +def launch(): + # use colorama to display colored text highlighting + colorama.just_fix_windows_console() + asyncio.run(main()) + colorama.deinit() diff --git a/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md b/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md new file mode 100644 index 0000000000..6cf8ae54a5 --- /dev/null +++ b/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md @@ -0,0 +1,258 @@ +# Jak And Daxter (ArchipelaGOAL) + +## FAQ +- [Where is the Options page?](#where-is-the-options-page) +- [What does randomization do to this game?](#what-does-randomization-do-to-this-game) +- [What are the Special Checks and how do I check them?](#what-are-the-special-checks-and-how-do-i-check-them) +- [What are the Special Items and what do they unlock?](#what-are-the-special-items-and-what-do-they-unlock) +- [How do I know which Special Items I have?](#how-do-i-know-which-special-items-i-have) +- [What is the goal of the game once randomized?](#what-is-the-goal-of-the-game-once-randomized) +- [What happens when I pick up or receive a Power Cell?](#what-happens-when-i-pick-up-or-receive-a-power-cell) +- [What happens when I pick up or receive a Scout Fly?](#what-happens-when-i-pick-up-or-receive-a-scout-fly) +- [How do I check the 'Free 7 Scout Flies' Power Cell?](#how-do-i-check-the-free-7-scout-flies-power-cell) +- [What does Death Link do?](#what-does-death-link-do) +- [What does Move Randomizer do?](#what-does-move-randomizer-do) +- [What are the movement options in Move Randomizer?](#what-are-the-movement-options-in-move-randomizer) +- [How do I know which moves I have?](#how-do-i-know-which-moves-i-have) +- [What does Orbsanity do?](#what-does-orbsanity-do) +- [What do Traps do?](#what-do-traps-do) +- [What kind of Traps are there?](#what-kind-of-traps-are-there) +- [I got soft-locked and cannot leave, how do I get out of here?](#i-got-soft-locked-and-cannot-leave-how-do-i-get-out-of-here) +- [Why did I get an Option Error when generating a seed, and how do I fix it?](#why-did-i-get-an-option-error-when-generating-a-seed-and-how-do-i-fix-it) +- [How do I check my player options in-game?](#how-do-i-check-my-player-options-in-game) +- [How does the HUD work?](#how-does-the-hud-work) +- [I think I found a bug, where should I report it?](#i-think-i-found-a-bug-where-should-i-report-it) + +## Where is the options page + +The [Player Options Page](../player-options) for this game contains all the options you need to configure and export +a config file. + +At this time, there are several caveats and restrictions: +- Power Cells and Scout Flies are **always** randomized. +- **All** the traders in the game become in-logic checks **if and only if** you have enough Orbs to pay all of them at once. + - This is to prevent hard locks, where an item required for progression is locked behind a trade you can't afford because you spent the orbs elsewhere. + - By default, that total is 1530. + +## What does randomization do to this game +The game now contains the following Location checks: +- All 101 Power Cells +- All 112 Scout Flies +- All 14 Orb Caches (collect every orb in the cache and let it close) + +These may contain Items for different games, as well as different Items from within Jak and Daxter. +Additionally, several special checks and corresponding items have been added that are required to complete the game. + +## What are the special checks and how do I check them +| Check Name | How To Check | +|------------------------|------------------------------------------------------------------------------| +| Fisherman's Boat | Complete the fishing minigame in Forbidden Jungle | +| Jungle Elevator | Collect the power cell at the top of the temple in Forbidden Jungle | +| Blue Eco Switch | Collect the power cell on the blue vent switch in Forbidden Jungle | +| Flut Flut | Push the egg off the cliff in Sentinel Beach and talk to the bird lady | +| Warrior's Pontoons | Talk to the Warrior in Rock Village once (you do NOT have to trade with him) | +| Snowy Mountain Gondola | Approach the gondola in Volcanic Crater | +| Yellow Eco Switch | Collect the power cell on the yellow vent switch in Snowy Mountain | +| Snowy Fort Gate | Ride the Flut Flut in Snowy Mountain and press the fort gate switch | +| Freed The Blue Sage | Free the Blue Sage in Gol and Maia's Citadel | +| Freed The Red Sage | Free the Red Sage in Gol and Maia's Citadel | +| Freed The Yellow Sage | Free the Yellow Sage in Gol and Maia's Citadel | +| Freed The Green Sage | Free the Green Sage in Gol and Maia's Citadel | + +## What are the special items and what do they unlock +| Item Name | What it Unlocks | +|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| +| Fisherman's Boat | Misty Island | +| Jungle Elevator | The blue vent switch inside the temple in Forbidden Jungle | +| Blue Eco Switch | The plant boss inside the temple in Forbidden Jungle
The cannon tower in Sentinel Beach | +| Flut Flut | The upper platforms in Boggy Swamp
The fort gate switch in Snowy Mountain | +| Warrior's Pontoons | Boggy Swamp and Mountain Pass | +| Snowy Mountain Gondola | Snowy Mountain | +| Yellow Eco Switch | The frozen box in Snowy Mountain
The shortcut in Mountain Pass | +| Snowy Fort Gate | The fort in Snowy Mountain | +| Freed The Blue Sage
Freed The Red Sage
Freed The Yellow Sage | The final staircase in Gol and Maia's Citadel | +| Freed The Green Sage | The final elevator in Gol and Maia's Citadel | + +## How do I know which special items I have +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Item Tracker`. +This will show you a list of all the special items in the game, ones not normally tracked as power cells or scout flies. +Gray items indicate you do not possess that item, light blue items indicate you possess that item. + +## What is the goal of the game once randomized +By default, to complete the game you must defeat the Gol and Maia and stop them from opening the Dark Eco silo. In order +to reach them, you will need at least 72 Power Cells to cross the Lava Tube, as well as the four special items for +freeing the Red, Blue, Yellow, and Green Sages. + +Alternatively, you can choose from a handful of other completion conditions like defeating a particular boss, crossing +a particular connector level, or opening the 100 Power Cell door after defeating the final boss. You can also customize +the thresholds for connector levels and orb trades. These options allow you to tailor the expected length and difficulty +of your run as you see fit. + +## What happens when I pick up or receive a power cell +When you pick up a power cell, Jak and Daxter will perform their victory animation. Your power cell count will +NOT change. The pause menu will say "Task Completed" below the picked-up Power Cell. If your power cell was related +to one of the special checks listed above, you will automatically check that location as well - a 2 for 1 deal! +Finally, your text client will inform you what you found and who it belongs to. + +When you receive a power cell, your power cell count will tick up by 1. Gameplay will otherwise continue as normal. +Finally, your text client will inform you where you received the power cell from. + +## What happens when I pick up or receive a scout fly +When you pick up a scout fly, your scout fly count will NOT change. The pause menu will show you the number of +scout flies you picked up per-region, and this number will have ticked up by 1 for the region that scout fly belongs to. +Finally, your text client will inform you what you found and who it belongs to. + +When you receive a scout fly, your total scout fly count will tick up by 1. The pause menu will show you the number of +scout flies you received per-region, and this number will have ticked up by 1 for the region that scout fly belongs to. +Finally, your text client will inform you where you received the scout fly from, and which one it is. + +## How do I check the Free 7 Scout Flies power cell +You will automatically check this power cell when you _receive_ your 7th scout fly, NOT when you _pick up_ your 7th +scout fly. So in short: + +- When you _pick up_ your 7th fly, the normal rules apply. +- When you _receive_ your 7th fly, 2 things will happen in quick succession. + - First, you will receive that scout fly, as normal. + - Second, you will immediately complete the "Free 7 Scout Flies" check, which will send out another item. + +## What does Death Link do +If you enable Death Link, all the other players in your Multiworld who also have it enabled will be linked by death. +That means when Jak dies in your game, the players in with Death Link also die. Likewise, if any of the other +players with Death Link die, Jak will also die in a random, possibly spectacular fashion. + +You can turn off Death Link at any time in the game by opening the game's menu and navigating to `Options`, +then `Archipelago Options`, then `Deathlink`. + +## What does Move Randomizer do +If you enable Move Randomizer, most of Jak's movement set will be added to the randomized item pool, and you will need +to receive the move in order to use it (i.e. you must find it, or another player must send it to you). Some moves have +prerequisite moves that you must also have in order to use them (e.g. Crouch Jump is dependent on Crouch). Jak will only +be able to run, swim (including underwater), perform single jumps, and shoot yellow eco from his goggles ("firing from +the hip" requires Punch). Note that Flut Flut and the Zoomer will have access to their full movement sets at all times. + +You can turn off Move Rando at any time in the game by opening the game's menu, navigate to `Options`, +then `Archipelago Options`, then `Move Randomizer`. This will give you access to the full movement set again. + +## What are the movement options in Move Randomizer +| Move Name | Prerequisite Moves | +|-----------------|--------------------| +| Crouch | | +| Crouch Jump | Crouch | +| Crouch Uppercut | Crouch | +| Roll | | +| Roll Jump | Roll | +| Double Jump | | +| Jump Dive | | +| Jump Kick | | +| Punch | | +| Punch Uppercut | Punch | +| Kick | | + +## How do I know which moves I have +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Move Tracker`. +This will show you a list of all the moves in the game. +- Gray items indicate you do not possess that move. +- Yellow items indicate you possess that move, but you are missing its prerequisites. +- Light blue items indicate you possess that move, as well as its prerequisites. + +## What does Orbsanity do +If you enable Orbsanity, bundles of Precursor Orbs will be turned into checks. Every time you collect the chosen number +of orbs, i.e. a "bundle," you will trigger another check. Likewise, the orbs will be added to the random item pool. +There are several options to change the difficulty of this challenge. + +- "Per Level" Orbsanity means the bundles are for each level in the game. (Geyser Rock, Sandover Village, etc.) +- "Global" Orbsanity means orbs collected from any level count toward the next bundle. +- The options with "Bundle Size" in the name indicate how many orbs are in a bundle. This adds a number of Items + and Locations to the pool inversely proportional to the size of the bundle. + - For example, if your bundle size is 20 orbs, you will add 100 items to the pool. If your bundle size is 250 orbs, + you will add 8 items to the pool. + +## What do Traps do +When creating your player YAML, you can choose to replace some of the game's extraneous Power Cells and Precursor Orbs +with traps. You can choose which traps you want to generate in your seed and how long they last. A random assortment +will then be chosen to populate the item pool. + +When you receive one, you will hear a buzzer and some kind of negative effect will occur in game. These effects may be +challenging, maddening, or entertaining. When the trap duration ends, the game should return to its previous state. +Multiple traps can be active at the same time, and they may interact with each other in strange ways. If they become +too frustrating, you can lower their duration by navigating to `Options`, then `Archipelago Options`, then +`Seed Options`, then `Trap Duration`. Lowering this number to zero will disable traps entirely. + +## What kind of Traps are there +| Trap Name | Effect | +|-----------------|--------------------------------------------------------------------------------| +| Trip Trap | Jak trips and falls | +| Slippery Trap | The world gains the physical properties of Snowy Mountain's ice lake | +| Gravity Trap | Jak falls to the ground faster and takes fall damage more easily | +| Camera Trap | The camera remains fixed in place no matter how far away Jak moves | +| Darkness Trap | The world gains the lighting properties of Dark Cave | +| Earthquake Trap | The world and camera shake | +| Teleport Trap | Jak immediately teleports to Samos's Hut | +| Despair Trap | The Warrior sobs profusely | +| Pacifism Trap | Jak's attacks have no effect on enemies, crates, or buttons | +| Ecoless Trap | Jak's eco is drained and he cannot collect new eco | +| Health Trap | Jak's health is set to 0 - not dead yet, but he will die to any attack or bonk | +| Ledge Trap | Jak cannot grab onto ledges | +| Zoomer Trap | Jak mounts an invisible zoomer (model loads properly depending on level) | +| Mirror Trap | The world is mirrored | + +## I got soft-locked and cannot leave how do I get out of here +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Warp To Home`. +Selecting this option will ask if you want to be teleported to Geyser Rock. From there, you can teleport back +to the nearest sage's hut to continue your journey. + +## Why did I get an Option Error when generating a seed and how do I fix it +Depending on your player YAML, Jak and Daxter can have a lot of items, which can sometimes be overwhelming or +disruptive to multiworld games. There are also options that are mutually incompatible with each other, even in a solo +game. To prevent the game from disrupting multiworlds, or generating an impossible solo seed, some options have +Singleplayer and Multiplayer Minimums and Maximums, collectively called "friendly limits." + +If you're generating a solo game, or your multiworld host agrees to your request, you can override those limits by +editing the `host.yaml`. In the Archipelago Launcher, click `Open host.yaml`, then search for `jakanddaxter_options`, +then search for `enforce_friendly_options`, then change this value from `true` to `false`. Disabling this allows for +more disruptive and challenging options, but it may cause seed generation to fail. **Use at your own risk!** + +## How do I check my player options in-game +When you connect your text client to the Archipelago Server, the server will tell the game what options were chosen +for this seed, and the game will apply those settings automatically. + +You can verify these options by navigating to `Options`, then `Archipelago Options`, then `Seed Options`. **You can open +each option to verify them, but you should NOT alter them during a run.** This may cause you to miss important +progression items and prevent you (and others) from completing the run. + +## How does the HUD work +The game's normal HUD shows you how many power cells, precursor orbs, and scout flies you currently have. But if you +hold `L2 or R2` and press a direction on the D-Pad, the HUD will show you alternate modes. Here is how the HUD works: + +| HUD Mode | Button Combo | What the HUD Shows | Text Messages | +|---------------|------------------------------|-----------------------------------|---------------------------------------| +| Per-Level | `L2 or R2` + `Down` | Locations Checked (in this level) | `SENT {Other Item} TO {Other Player}` | +| Global | `L2 or R2` + `Up` | Locations Checked (in the game) | `GOT {Your Item} FROM {Other Player}` | +| Normal | `L2 or R2` + `Left or Right` | Items Received | Both Sent and Got Messages | +| | | | | +| (In Any Mode) | | (If you sent an Item to Yourself) | `FOUND {Your Item}` | + +In all modes, the last 3 sent/received items and the player who sent/received it will be displayed in the +bottom left corner. This will help you quickly reference information about newly received or sent items. Items in blue +are Progression (or non-Jak items), in green are Filler, and in red are Traps. You can turn this off by navigating +to `Options`, then `Archipelago Options`, then set `Item Messages` to `Off`. + +## I think I found a bug where should I report it +Depending on the nature of the bug, there are a couple of different options. + +* If you found a logical error in the randomizer, please create a new Issue +[here](https://github.com/ArchipelaGOAL/Archipelago/issues). Use this page if: + * An item required for progression is unreachable. + * The randomizer did not respect one of the Options you chose. + * You see a mistake, typo, etc. on this webpage. + * You see an error or stack trace appear on the text client. + +* If you encountered an error in OpenGOAL, please create a new Issue +[here](https://github.com/ArchipelaGOAL/ArchipelaGOAL/issues). Use this page if: + * You encounter a crash, freeze, reset, etc. in the game. + * You fail to send Items you find in the game to the Archipelago server. + * You fail to receive Items the server sends to you. + * Your game disconnects from the server and cannot reconnect. + * You go looking for a game item that has already disappeared before you could reach it. + +* Please upload your config file, spoiler log file, and any other generated logs in the Issue, so we can troubleshoot the problem. \ No newline at end of file diff --git a/worlds/jakanddaxter/docs/setup_en.md b/worlds/jakanddaxter/docs/setup_en.md new file mode 100644 index 0000000000..509fb3ad8d --- /dev/null +++ b/worlds/jakanddaxter/docs/setup_en.md @@ -0,0 +1,182 @@ +# Jak And Daxter (ArchipelaGOAL) Setup Guide + +## Required Software + +- A legally purchased copy of *Jak And Daxter: The Precursor Legacy.* +- [The OpenGOAL Launcher](https://opengoal.dev/) +- [The Jak and Daxter .APWORLD package](https://github.com/ArchipelaGOAL/Archipelago/releases) + +At this time, this method of setup works on Windows only, but Linux support is a strong likelihood in the near future as OpenGOAL itself supports Linux. + +## Installation via OpenGOAL Launcher + +**You must set up a vanilla installation of Jak and Daxter before you can install mods for it.** + +- Follow the installation process for the official OpenGOAL Launcher. See [here](https://opengoal.dev/docs/usage/installation). +- Follow the setup process for adding mods to the OpenGOAL Launcher. See [here](https://jakmods.dev/). +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`. +- Under `Available Mods`, click `ArchipelaGOAL`. The mod should begin installing. When it is done, click `Continue` in the bottom right corner. +- **DO NOT PLAY AN ARCHIPELAGO GAME THROUGH THE OPENGOAL LAUNCHER.** The Archipelago Client should handle everything for you. + +### For NTSC versions of the game, follow these steps. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Compile`. + +### For PAL versions of the game, follow these steps. + +PAL versions of the game seem to require additional troubleshooting/setup in order to work properly. +Below are some instructions that may help. +If you see `-- Compilation Error! --` after pressing `Compile` or Launching the ArchipelaGOAL mod, try these steps. + +- Remove these folders if you have them: + - `/iso_data` + - `/iso_data` + - `/data/iso_data` +- Place your Jak1 ISO in `` and rename it to `JakAndDaxter.iso` +- Type `cmd` in Windows search, right click `Command Prompt`, and pick `Run as Administrator` +- Run `cd ` +- Then run `.\extractor.exe --extract --extract-path .\data\iso_data "JakAndDaxter.iso"` + - This command should end by saying `Uses Decompiler Config Version - ntsc_v1` or `... - pal`. Take note of this message. +- If you saw `ntsc_v1`: + - In cmd, run `.\decompiler.exe data\decompiler\config\jak1\jak1_config.jsonc --version "ntsc_v1" data\iso_data data\decompiler_out` +- If you saw `pal`: + - Rename `\data\iso_data\jak1` to `jak1_pal` + - Back in cmd, run `.\decompiler.exe data\decompiler\config\jak1\jak1_config.jsonc --version "pal" data\iso_data data\decompiler_out` + - Rename `\data\iso_data\jak1_pal` back to `jak1` + - Rename `\data\decompiler_out\jak1_pal` back to `jak1` +- Open a **brand new** console window and launch the compiler: + - `cd ` + - `.\goalc.exe --user-auto --game jak1` + - From the compiler (in the same window): `(mi)`. This should compile the game. **Note that the parentheses are important.** + - **Don't close this first terminal, you will need it at the end.** +- Then, open **another brand new** console window and execute the game: + - `cd ` + - `.\gk.exe -v --game jak1 -- -boot -fakeiso -debug` +- Finally, **from the first console still in the GOALC compiler**, connect to the game: `(lt)`. + +## Updates and New Releases via OpenGOAL Launcher + +If you are in the middle of an async game, and you do not want to update the mod, you do not need to do this step. The mod will only update when you tell it to. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- Click `Update` to download and install any new updates that have been released. +- You can verify your version by clicking `Versions`. The version you are using will say `(Active)` next to it. +- **Then you must click `Advanced`, then click `Compile` to make the update take effect.** + +## Starting a Game + +### New Game + +- Run the Archipelago Launcher. +- From the right-most list, find and click `Jak and Daxter Client`. +- 3 new windows should appear: + - The OpenGOAL compiler will launch and compile the game. They should take about 30 seconds to compile. + - You should hear a musical cue to indicate the compilation was a success. If you do not, see the Troubleshooting section. + - You can **MINIMIZE** the Compiler window, **BUT DO NOT CLOSE IT.** It is required for Archipelago and the game to communicate with each other. + - The game window itself will launch, and Jak will be standing outside Samos's Hut. + - Once compilation is complete, the title sequence will start. + - Finally, the Archipelago text client will open. + - If you see **BOTH** `The REPL is ready!` and `The Memory Reader is ready!` then that should indicate a successful startup. If you do not, see the Troubleshooting section. +- Once you see `CONNECT TO ARCHIPELAGO NOW` on the title screen, use the text client to connect to the Archipelago server. This will communicate your current settings and slot info to the game. +- If you see `RECEIVING ITEMS, PLEASE WAIT...`, the game is busy receiving items from your starting inventory, assuming you have some. +- Once you see `READY! PRESS START TO CONTINUE` on the title screen, you can press Start. +- Choose `New Game`, choose a save file, and play through the opening cutscenes. +- Once you reach Geyser Rock, the game has begun! + - You can leave Geyser Rock immediately if you so choose - just step on the warp gate button. + +### Returning / Async Game +The same steps as New Game apply, with some exceptions: + +- Once you reach the title screen, connect to the Archipelago server **BEFORE** you load your save file. + - This is to allow AP to give the game your current settings and all the items you had previously. + - **THESE SETTINGS AFFECT LOADING AND SAVING OF SAVE FILES, SO IT IS IMPORTANT TO DO THIS FIRST.** +- Once you see `READY! PRESS START TO CONTINUE` on the title screen, you can press Start. +- Instead of choosing `New Game` in the title menu, choose `Load Game`, then choose the save file **THAT HAS YOUR CURRENT SLOT NAME.** + - To help you find the correct save file, highlighting a save will show you that save's slot name and the first 8 digits of the multiworld seed number. + +## Troubleshooting + +### The Text Client Says "Unable to locate the OpenGOAL install directory" + +Normally, the Archipelago client should be able to find your OpenGOAL installation automatically. + +If it cannot, you may have to tell it yourself. Follow these instructions. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- Click `Advanced` in the bottom right corner, then click `Open Game Data Folder`. You should see a new File Explorer open to that directory. +- In the File Explorer, go to the parent directory called `archipelagoal`, and you should see the `gk.exe` and `goalc.exe` executables. Copy this path. +- Run the Archipelago Launcher, then click on `Open host.yaml`. You should see a new text editor open that file. +- Search for `jakanddaxter_options`, and you will need to make 2 changes here. +- First, find the `root_directory` entry. Paste the path you noted earlier (the one containing gk.exe and goalc.exe) inside the double quotes. +- **MAKE SURE YOU CHANGE ALL BACKSLASHES `\ ` TO FORWARD SLASHES `/`.** + +```yaml + root_directory: "%programfiles%/OpenGOAL-Launcher/features/jak1/mods/JakMods/archipelagoal" +``` + +- Second, find the `root_directory` entry. Change this to `false`. You do not need to use double quotes. + +```yaml + auto_detect_root_directory: true +``` + +- Save the file and close it. + +### The Game Fails To Load The Title Screen + +You may start the game via the Text Client, but it never loads in the title screen. Check the Compiler window: you may see red and yellow errors like this. + +``` +-- Compilation Error! -- +``` + +If this happens, follow these instructions. If you are using a PAL version of the game, you should skip these instructions and follow the `Special PAL Instructions` above. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar, then click `Advanced`, then click `Open Game Data Folder`. Copy the `iso_data` folder from this directory. +- Back in the OpenGOAL Launcher, click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Open Game Data Folder`. +- Paste the `iso_data` folder you copied earlier. +- Back in the OpenGOAL Launcher, click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Compile`. + +### The Text Client Says "Error reading game memory!" or "Error sending data to compiler" + +If at any point the text client says this, you will need to restart the **all** of these applications. + +- Close all open windows: the client, the compiler, and the game. +- Run the OpenGOAL Launcher, then click `Features`, then click `Mods`, then click `ArchipelaGOAL`. +- Click `Advanced`, then click `Play in Debug Mode`. +- Click `Advanced`, then click `Open REPL`. +- Then close and reopen the Jak and Daxter Client from the Archipelago Launcher. +- Once these are done, you can enter `/repl status` and `/memr status` in the text client to verify. + +### The Client Cannot Open A REPL Connection + +If the client cannot open a REPL connection to the game, you may need to check the following steps: + +- Ensure you are not hosting anything on ports `8181` and `8112`. Those are for the REPL (goalc) and the game (gk) respectively. +- Ensure that Windows Defender and Windows Firewall are not blocking those programs from hosting or listening on those ports. +- You can use Windows Resource Monitor to verify those ports are open when the programs are running. +- Ensure that you only opened those ports for your local network, not the wider internet. + +## Known Issues + +- The game needs to boot in debug mode in order to allow the compiler to connect to it. **Clicking "Play" on the mod page in the OpenGOAL Launcher will not work.** +- The Compiler console window is orphaned once you close the game - you will have to kill it manually when you stop playing. +- The console windows cannot be run as background processes due to how the REPL works, so the best we can do is minimize them. +- Orbsanity checks may show up out of order in the text client. +- Large item releases may take up to several minutes for the game to process them all. Item Messages will usually take longer to appear than Items themselves. +- In Lost Precursor City, if you die in the Color Platforms room, the game may crash after you respawn. The cause is unknown. +- Darkness Trap may cause some visual glitches on certain levels. This is temporary, and terrain and object collision are unaffected. diff --git a/worlds/jakanddaxter/game_id.py b/worlds/jakanddaxter/game_id.py new file mode 100644 index 0000000000..d596a6cc82 --- /dev/null +++ b/worlds/jakanddaxter/game_id.py @@ -0,0 +1,8 @@ +# All Jak And Daxter Archipelago IDs must be offset by this number. +jak1_id = 741000000 + +# This is maximum ID we will allow. +jak1_max = jak1_id + 999999 + +# The name of the game. +jak1_name = "Jak and Daxter: The Precursor Legacy" diff --git a/worlds/jakanddaxter/icons/precursor_orb.ico b/worlds/jakanddaxter/icons/precursor_orb.ico new file mode 100644 index 0000000000000000000000000000000000000000..f0cd1a0eec251f861be3798a5c5059f236c4e786 GIT binary patch literal 6142 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 communication. +scout_item_table = { + 95: "Scout Fly - Geyser Rock", + 75: "Scout Fly - Sandover Village", + 7: "Scout Fly - Forbidden Jungle", + 20: "Scout Fly - Sentinel Beach", + 28: "Scout Fly - Misty Island", + 68: "Scout Fly - Fire Canyon", + 76: "Scout Fly - Rock Village", + 57: "Scout Fly - Precursor Basin", + 49: "Scout Fly - Lost Precursor City", + 43: "Scout Fly - Boggy Swamp", + 88: "Scout Fly - Mountain Pass", + 77: "Scout Fly - Volcanic Crater", + 85: "Scout Fly - Spider Cave", + 65: "Scout Fly - Snowy Mountain", + 90: "Scout Fly - Lava Tube", + 91: "Scout Fly - Citadel", # Had to shorten, it was >32 characters. +} + +# Orbs are also generic and interchangeable. +# These items are only used by Orbsanity, and only one of these +# items will be used corresponding to the chosen bundle size. +orb_item_table = { + 1: "1 Precursor Orb", + 2: "2 Precursor Orbs", + 4: "4 Precursor Orbs", + 5: "5 Precursor Orbs", + 8: "8 Precursor Orbs", + 10: "10 Precursor Orbs", + 16: "16 Precursor Orbs", + 20: "20 Precursor Orbs", + 25: "25 Precursor Orbs", + 40: "40 Precursor Orbs", + 50: "50 Precursor Orbs", + 80: "80 Precursor Orbs", + 100: "100 Precursor Orbs", + 125: "125 Precursor Orbs", + 200: "200 Precursor Orbs", + 250: "250 Precursor Orbs", + 400: "400 Precursor Orbs", + 500: "500 Precursor Orbs", + 1000: "1000 Precursor Orbs", + 2000: "2000 Precursor Orbs", +} + +# These are special items representing unique unlocks in the world. Notice that their Item ID equals their +# respective Location ID. Like scout flies, this is necessary for game<->archipelago communication. +special_item_table = { + 5: "Fisherman's Boat", # Unlocks Misty Island + 4: "Jungle Elevator", # Unlocks the Forbidden Jungle Temple + 2: "Blue Eco Switch", # Unlocks Blue Eco Vents + 17: "Flut Flut", # Unlocks Flut Flut sections in Boggy Swamp and Snowy Mountain + 33: "Warrior's Pontoons", # Unlocks Boggy Swamp and everything post-Rock Village + 105: "Snowy Mountain Gondola", # Unlocks Snowy Mountain + 60: "Yellow Eco Switch", # Unlocks Yellow Eco Vents + 63: "Snowy Fort Gate", # Unlocks the Snowy Mountain Fort + 71: "Freed The Blue Sage", # 1 of 3 unlocks for the final staircase in Citadel + 72: "Freed The Red Sage", # 1 of 3 unlocks for the final staircase in Citadel + 73: "Freed The Yellow Sage", # 1 of 3 unlocks for the final staircase in Citadel + 70: "Freed The Green Sage", # Unlocks the final boss elevator in Citadel +} + +# These are the move items for move randomizer. Notice that their Item ID equals some of the Orb Cache Location ID's. +# This was 100% arbitrary. There's no reason to tie moves to orb caches except that I need a place to put them. ;_; +move_item_table = { + 10344: "Crouch", + 10369: "Crouch Jump", + 11072: "Crouch Uppercut", + 12634: "Roll", + 12635: "Roll Jump", + 10945: "Double Jump", + 14507: "Jump Dive", + 14838: "Jump Kick", + 23348: "Punch", + 23349: "Punch Uppercut", + 23350: "Kick", + # 24038: "Orb Cache at End of Blast Furnace", # Hold onto these ID's for future use. + # 24039: "Orb Cache at End of Launch Pad Room", + # 24040: "Orb Cache at Start of Launch Pad Room", +} + +# These are trap items. Their Item ID is to be subtracted from the base game ID. They do not have corresponding +# game locations because they are intended to replace other items that have been marked as filler. +trap_item_table = { + 1: "Trip Trap", + 2: "Slippery Trap", + 3: "Gravity Trap", + 4: "Camera Trap", + 5: "Darkness Trap", + 6: "Earthquake Trap", + 7: "Teleport Trap", + 8: "Despair Trap", + 9: "Pacifism Trap", + 10: "Ecoless Trap", + 11: "Health Trap", + 12: "Ledge Trap", + 13: "Zoomer Trap", + 14: "Mirror Trap", +} + +# All Items +# While we're here, do all the ID conversions needed. +item_table = { + **{cells.to_ap_id(k): name for k, name in cell_item_table.items()}, + **{scouts.to_ap_id(k): name for k, name in scout_item_table.items()}, + **{specials.to_ap_id(k): name for k, name in special_item_table.items()}, + **{caches.to_ap_id(k): name for k, name in move_item_table.items()}, + **{orbs.to_ap_id(k): name for k, name in orb_item_table.items()}, + **{jak1_max - k: name for k, name in trap_item_table.items()}, + jak1_max: "Green Eco Pill" # Filler item. +} diff --git a/worlds/jakanddaxter/levels.py b/worlds/jakanddaxter/levels.py new file mode 100644 index 0000000000..2deb2d2087 --- /dev/null +++ b/worlds/jakanddaxter/levels.py @@ -0,0 +1,76 @@ +# This contains the list of levels in Jak and Daxter. +# Not to be confused with Regions - there can be multiple Regions in every Level. +level_table = { + "Geyser Rock": { + "level_index": 0, + "orbs": 50 + }, + "Sandover Village": { + "level_index": 1, + "orbs": 50 + }, + "Sentinel Beach": { + "level_index": 2, + "orbs": 150 + }, + "Forbidden Jungle": { + "level_index": 3, + "orbs": 150 + }, + "Misty Island": { + "level_index": 4, + "orbs": 150 + }, + "Fire Canyon": { + "level_index": 5, + "orbs": 50 + }, + "Rock Village": { + "level_index": 6, + "orbs": 50 + }, + "Lost Precursor City": { + "level_index": 7, + "orbs": 200 + }, + "Boggy Swamp": { + "level_index": 8, + "orbs": 200 + }, + "Precursor Basin": { + "level_index": 9, + "orbs": 200 + }, + "Mountain Pass": { + "level_index": 10, + "orbs": 50 + }, + "Volcanic Crater": { + "level_index": 11, + "orbs": 50 + }, + "Snowy Mountain": { + "level_index": 12, + "orbs": 200 + }, + "Spider Cave": { + "level_index": 13, + "orbs": 200 + }, + "Lava Tube": { + "level_index": 14, + "orbs": 50 + }, + "Gol and Maia's Citadel": { + "level_index": 15, + "orbs": 200 + } +} + +level_table_with_global = { + **level_table, + "": { + "level_index": 16, # Global + "orbs": 2000 + } +} diff --git a/worlds/jakanddaxter/locations.py b/worlds/jakanddaxter/locations.py new file mode 100644 index 0000000000..901c9811db --- /dev/null +++ b/worlds/jakanddaxter/locations.py @@ -0,0 +1,66 @@ +from BaseClasses import Location +from .game_id import jak1_name +from .locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches) + + +class JakAndDaxterLocation(Location): + game: str = jak1_name + + +# Different tables for location groups. +# Each Item ID == its corresponding Location ID. While we're here, do all the ID conversions needed. +cell_location_table = { + **{cells.to_ap_id(k): name for k, name in cells.loc7SF_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locGR_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSV_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locFJ_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSB_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locMI_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locFC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locRV_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locPB_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locLPC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locBS_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locMP_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locVC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSM_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locLT_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locGMC_cellTable.items()}, +} + +scout_location_table = { + **{scouts.to_ap_id(k): name for k, name in scouts.locGR_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSV_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locFJ_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSB_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locMI_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locFC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locRV_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locPB_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locLPC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locBS_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locMP_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locVC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSM_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locLT_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locGMC_scoutTable.items()}, +} + +special_location_table = {specials.to_ap_id(k): name for k, name in specials.loc_specialTable.items()} +cache_location_table = {caches.to_ap_id(k): name for k, name in caches.loc_orbCacheTable.items()} +orb_location_table = {orbs.to_ap_id(k): name for k, name in orbs.loc_orbBundleTable.items()} + +# All Locations +location_table = { + **cell_location_table, + **scout_location_table, + **special_location_table, + **cache_location_table, + **orb_location_table +} diff --git a/worlds/jakanddaxter/locs/__init__.py b/worlds/jakanddaxter/locs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/locs/cell_locations.py b/worlds/jakanddaxter/locs/cell_locations.py new file mode 100644 index 0000000000..62f63e07df --- /dev/null +++ b/worlds/jakanddaxter/locs/cell_locations.py @@ -0,0 +1,194 @@ +from ..game_id import jak1_id + +# Power Cells are given ID's between 0 and 116 by the game. + +# The game tracks all game-tasks as integers. +# 101 of these ID's correspond directly to power cells, but they are not +# necessarily ordered, nor are they the first 101 in the task list. +# The remaining ones are cutscenes and other events. + + +# These helper functions do all the math required to get information about each +# power cell and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + game_id + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id + + +# The ID's you see below correspond directly to that cell's game-task ID. + +# The "Free 7 Scout Flies" Power Cells will be unlocked separately from their respective levels. +loc7SF_cellTable = { + 95: "GR: Free 7 Scout Flies", + 75: "SV: Free 7 Scout Flies", + 7: "FJ: Free 7 Scout Flies", + 20: "SB: Free 7 Scout Flies", + 28: "MI: Free 7 Scout Flies", + 68: "FC: Free 7 Scout Flies", + 76: "RV: Free 7 Scout Flies", + 57: "PB: Free 7 Scout Flies", + 49: "LPC: Free 7 Scout Flies", + 43: "BS: Free 7 Scout Flies", + 88: "MP: Free 7 Scout Flies", + 77: "VC: Free 7 Scout Flies", + 85: "SC: Free 7 Scout Flies", + 65: "SM: Free 7 Scout Flies", + 90: "LT: Free 7 Scout Flies", + 91: "GMC: Free 7 Scout Flies", +} + +# Geyser Rock +locGR_cellTable = { + 92: "GR: Find The Cell On The Path", + 93: "GR: Open The Precursor Door", + 94: "GR: Climb Up The Cliff", +} + +# Sandover Village +locSV_cellTable = { + 11: "SV: Bring 90 Orbs To The Mayor", + 12: "SV: Bring 90 Orbs to Your Uncle", + 10: "SV: Herd The Yakows Into The Pen", + 13: "SV: Bring 120 Orbs To The Oracle (1)", + 14: "SV: Bring 120 Orbs To The Oracle (2)", +} + +# Forbidden Jungle +locFJ_cellTable = { + 3: "FJ: Connect The Eco Beams", + 4: "FJ: Get To The Top Of The Temple", + 2: "FJ: Find The Blue Vent Switch", + 6: "FJ: Defeat The Dark Eco Plant", + 5: "FJ: Catch 200 Pounds Of Fish", + 8: "FJ: Follow The Canyon To The Sea", + 9: "FJ: Open The Locked Temple Door", +} + +# Sentinel Beach +locSB_cellTable = { + 15: "SB: Unblock The Eco Harvesters", + 17: "SB: Push The Flut Flut Egg Off The Cliff", + 16: "SB: Get The Power Cell From The Pelican", + 18: "SB: Chase The Seagulls", + 19: "SB: Launch Up To The Cannon Tower", + 21: "SB: Explore The Beach", + 22: "SB: Climb The Sentinel", +} + +# Misty Island +locMI_cellTable = { + 23: "MI: Catch The Sculptor's Muse", + 24: "MI: Climb The Lurker Ship", + 26: "MI: Stop The Cannon", + 25: "MI: Return To The Dark Eco Pool", + 27: "MI: Destroy the Balloon Lurkers", + 29: "MI: Use Zoomer To Reach Power Cell", + 30: "MI: Use Blue Eco To Reach Power Cell", +} + +# Fire Canyon +locFC_cellTable = { + 69: "FC: Reach The End Of Fire Canyon", +} + +# Rock Village +locRV_cellTable = { + 31: "RV: Bring 90 Orbs To The Gambler", + 32: "RV: Bring 90 Orbs To The Geologist", + 33: "RV: Bring 90 Orbs To The Warrior", + 34: "RV: Bring 120 Orbs To The Oracle (1)", + 35: "RV: Bring 120 Orbs To The Oracle (2)", +} + +# Precursor Basin +locPB_cellTable = { + 54: "PB: Herd The Moles Into Their Hole", + 53: "PB: Catch The Flying Lurkers", + 52: "PB: Beat Record Time On The Gorge", + 56: "PB: Get The Power Cell Over The Lake", + 55: "PB: Cure Dark Eco Infected Plants", + 58: "PB: Navigate The Purple Precursor Rings", + 59: "PB: Navigate The Blue Precursor Rings", +} + +# Lost Precursor City +locLPC_cellTable = { + 47: "LPC: Raise The Chamber", + 45: "LPC: Follow The Colored Pipes", + 46: "LPC: Reach The Bottom Of The City", + 48: "LPC: Quickly Cross The Dangerous Pool", + 44: "LPC: Match The Platform Colors", + 50: "LPC: Climb The Slide Tube", + 51: "LPC: Reach The Center Of The Complex", +} + +# Boggy Swamp +locBS_cellTable = { + 37: "BS: Ride The Flut Flut", + 36: "BS: Protect Farthy's Snacks", + 38: "BS: Defeat The Lurker Ambush", + 39: "BS: Break The Tethers To The Zeppelin (1)", + 40: "BS: Break The Tethers To The Zeppelin (2)", + 41: "BS: Break The Tethers To The Zeppelin (3)", + 42: "BS: Break The Tethers To The Zeppelin (4)", +} + +# Mountain Pass +locMP_cellTable = { + 86: "MP: Defeat Klaww", + 87: "MP: Reach The End Of The Mountain Pass", + 110: "MP: Find The Hidden Power Cell", +} + +# Volcanic Crater +locVC_cellTable = { + 96: "VC: Bring 90 Orbs To The Miners (1)", + 97: "VC: Bring 90 Orbs To The Miners (2)", + 98: "VC: Bring 90 Orbs To The Miners (3)", + 99: "VC: Bring 90 Orbs To The Miners (4)", + 100: "VC: Bring 120 Orbs To The Oracle (1)", + 101: "VC: Bring 120 Orbs To The Oracle (2)", + 74: "VC: Find The Hidden Power Cell", +} + +# Spider Cave +locSC_cellTable = { + 78: "SC: Use Your Goggles To Shoot The Gnawing Lurkers", + 79: "SC: Destroy The Dark Eco Crystals", + 80: "SC: Explore The Dark Cave", + 81: "SC: Climb The Giant Robot", + 82: "SC: Launch To The Poles", + 83: "SC: Navigate The Spider Tunnel", + 84: "SC: Climb the Precursor Platforms", +} + +# Snowy Mountain +locSM_cellTable = { + 60: "SM: Find The Yellow Vent Switch", + 61: "SM: Stop The 3 Lurker Glacier Troops", + 66: "SM: Deactivate The Precursor Blockers", + 67: "SM: Open The Frozen Crate", + 63: "SM: Open The Lurker Fort Gate", + 62: "SM: Get Through The Lurker Fort", + 64: "SM: Survive The Lurker Infested Cave", +} + +# Lava Tube +locLT_cellTable = { + 89: "LT: Cross The Lava Tube", +} + +# Gol and Maias Citadel +locGMC_cellTable = { + 71: "GMC: Free The Blue Sage", + 72: "GMC: Free The Red Sage", + 73: "GMC: Free The Yellow Sage", + 70: "GMC: Free The Green Sage", +} diff --git a/worlds/jakanddaxter/locs/orb_cache_locations.py b/worlds/jakanddaxter/locs/orb_cache_locations.py new file mode 100644 index 0000000000..b0ed6c1c97 --- /dev/null +++ b/worlds/jakanddaxter/locs/orb_cache_locations.py @@ -0,0 +1,52 @@ +from ..game_id import jak1_id + +# These are the locations of Orb Caches throughout the game, unlockable only with blue eco. +# They are not game collectables and thus don't have the same kinds of game ID's. They do, however, have actor ID's. +# There are a total of 14 in the game. + +# When these are opened, we can execute a hook in the mod that might be able to tell us which orb cache we opened, +# by ID, and that will allow us to map a Location object to it. We'll be using these for Move Randomizer, +# where each move is "mapped" to an Orb Cache being unlocked. Obviously, they will then be randomized, but with moves +# not being considered Items by the game, we need to conjure SOME kind of Location for them, and Orb Caches is the best +# we can do. + +# We can use 2^12 to offset these from special checks, just like we offset those from scout flies +# by 2^11. Special checks don't exceed an ID of (jak1_id + 2153). +orb_cache_offset = 4096 + + +# These helper functions do all the math required to get information about each +# special check and translate its ID between AP and OpenGOAL. Similar to Scout Flies, these large numbers are not +# necessary, and we can flatten out the range in which these numbers lie. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + uncompressed_id = jak1_id + orb_cache_offset + game_id # Add the offsets and the orb cache Actor ID. + return uncompressed_id - 10344 # Subtract the smallest Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + uncompressed_id = ap_id + 10344 # Reverse process, add back the smallest Actor ID. + return uncompressed_id - jak1_id - orb_cache_offset # Subtract the offsets. + + +# The ID's you see below correlate to the Actor ID of each Orb Cache. + +loc_orbCacheTable = { + 10344: "Orb Cache in Sandover Village", + 10369: "Orb Cache in Forbidden Jungle", + 11072: "Orb Cache on Misty Island", + 12634: "Orb Cache near Flut Flut Egg", + 12635: "Orb Cache near Pelican's Nest", + 10945: "Orb Cache in Rock Village", + 14507: "Orb Cache in First Sunken Chamber", + 14838: "Orb Cache in Second Sunken Chamber", + 23348: "Orb Cache in Snowy Fort (1)", + 23349: "Orb Cache in Snowy Fort (2)", + 23350: "Orb Cache in Snowy Fort (3)", + 24038: "Orb Cache at End of Blast Furnace", + 24039: "Orb Cache at End of Launch Pad Room", + 24040: "Orb Cache at Start of Launch Pad Room", +} diff --git a/worlds/jakanddaxter/locs/orb_locations.py b/worlds/jakanddaxter/locs/orb_locations.py new file mode 100644 index 0000000000..2b69465a98 --- /dev/null +++ b/worlds/jakanddaxter/locs/orb_locations.py @@ -0,0 +1,123 @@ +from ..game_id import jak1_id +from ..levels import level_table_with_global + +# Precursor Orbs are not necessarily given ID's by the game. + +# Of the 2000 orbs (or "money") you can pick up, only 1233 are standalone ones you find in the overworld. +# We can identify them by Actor ID's, which run from 549 to 24433. Other actors reside in this range, +# so like Power Cells these are not ordered, nor contiguous, nor exclusively orbs. + +# In fact, other ID's in this range belong to actors that spawn orbs when they are activated or when they die, +# like steel crates, orb caches, Spider Cave gnawers, or jumping on the Plant Boss's head. These orbs that spawn +# from parent actors DON'T have an Actor ID themselves - the parent object keeps track of how many of its orbs +# have been picked up. + +# In order to deal with this mess, we're creating 2 extra functions that will create and identify Orb Locations for us. +# These will be compatible with both Global Orbsanity and Per-Level Orbsanity, allowing us to create any +# number of Locations depending on the bundle size chosen, while also guaranteeing that each has a unique address. + +# We can use 2^15 to offset them from Orb Caches, because Orb Cache ID's max out at (jak1_id + 17792). +orb_offset = 32768 + + +# These helper functions do all the math required to get information about each +# precursor orb and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + orb_offset + game_id # Add the offsets and the orb Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id - orb_offset # Reverse process, subtract the offsets. + + +# Use this when the Memory Reader learns that you checked a specific bundle. +# Offset each level by 200 orbs (max number in any level), {200, 400, ...} +# then divide orb count by bundle size, {201, 202, ...} +# then subtract 1. {200, 201, ...} +def find_address(level_index: int, orb_count: int, bundle_size: int) -> int: + result = (level_index * 200) + (orb_count // bundle_size) - 1 + return result + + +# Use this when assigning addresses during region generation. +def create_address(level_index: int, bundle_index: int) -> int: + result = (level_index * 200) + bundle_index + return result + + +# What follows is our methods of generating all the name/ID pairs for location_name_to_id. +# Remember that not every bundle will be used in the actual seed, we just need a static map of strings to ints. +locGR_orbBundleTable = {create_address(level_table_with_global["Geyser Rock"]["level_index"], index): + f"Geyser Rock Orb Bundle {index + 1}" + for index in range(level_table_with_global["Geyser Rock"]["orbs"])} +locSV_orbBundleTable = {create_address(level_table_with_global["Sandover Village"]["level_index"], index): + f"Sandover Village Orb Bundle {index + 1}" + for index in range(level_table_with_global["Sandover Village"]["orbs"])} +locFJ_orbBundleTable = {create_address(level_table_with_global["Forbidden Jungle"]["level_index"], index): + f"Forbidden Jungle Orb Bundle {index + 1}" + for index in range(level_table_with_global["Forbidden Jungle"]["orbs"])} +locSB_orbBundleTable = {create_address(level_table_with_global["Sentinel Beach"]["level_index"], index): + f"Sentinel Beach Orb Bundle {index + 1}" + for index in range(level_table_with_global["Sentinel Beach"]["orbs"])} +locMI_orbBundleTable = {create_address(level_table_with_global["Misty Island"]["level_index"], index): + f"Misty Island Orb Bundle {index + 1}" + for index in range(level_table_with_global["Misty Island"]["orbs"])} +locFC_orbBundleTable = {create_address(level_table_with_global["Fire Canyon"]["level_index"], index): + f"Fire Canyon Orb Bundle {index + 1}" + for index in range(level_table_with_global["Fire Canyon"]["orbs"])} +locRV_orbBundleTable = {create_address(level_table_with_global["Rock Village"]["level_index"], index): + f"Rock Village Orb Bundle {index + 1}" + for index in range(level_table_with_global["Rock Village"]["orbs"])} +locLPC_orbBundleTable = {create_address(level_table_with_global["Lost Precursor City"]["level_index"], index): + f"Lost Precursor City Orb Bundle {index + 1}" + for index in range(level_table_with_global["Lost Precursor City"]["orbs"])} +locBS_orbBundleTable = {create_address(level_table_with_global["Boggy Swamp"]["level_index"], index): + f"Boggy Swamp Orb Bundle {index + 1}" + for index in range(level_table_with_global["Boggy Swamp"]["orbs"])} +locPB_orbBundleTable = {create_address(level_table_with_global["Precursor Basin"]["level_index"], index): + f"Precursor Basin Orb Bundle {index + 1}" + for index in range(level_table_with_global["Precursor Basin"]["orbs"])} +locMP_orbBundleTable = {create_address(level_table_with_global["Mountain Pass"]["level_index"], index): + f"Mountain Pass Orb Bundle {index + 1}" + for index in range(level_table_with_global["Mountain Pass"]["orbs"])} +locVC_orbBundleTable = {create_address(level_table_with_global["Volcanic Crater"]["level_index"], index): + f"Volcanic Crater Orb Bundle {index + 1}" + for index in range(level_table_with_global["Volcanic Crater"]["orbs"])} +locSM_orbBundleTable = {create_address(level_table_with_global["Snowy Mountain"]["level_index"], index): + f"Snowy Mountain Orb Bundle {index + 1}" + for index in range(level_table_with_global["Snowy Mountain"]["orbs"])} +locSC_orbBundleTable = {create_address(level_table_with_global["Spider Cave"]["level_index"], index): + f"Spider Cave Orb Bundle {index + 1}" + for index in range(level_table_with_global["Spider Cave"]["orbs"])} +locLT_orbBundleTable = {create_address(level_table_with_global["Lava Tube"]["level_index"], index): + f"Lava Tube Orb Bundle {index + 1}" + for index in range(level_table_with_global["Lava Tube"]["orbs"])} +locGMC_orbBundleTable = {create_address(level_table_with_global["Gol and Maia's Citadel"]["level_index"], index): + f"Gol and Maia's Citadel Orb Bundle {index + 1}" + for index in range(level_table_with_global["Gol and Maia's Citadel"]["orbs"])} +locGlobal_orbBundleTable = {create_address(level_table_with_global[""]["level_index"], index): + f"Orb Bundle {index + 1}" + for index in range(level_table_with_global[""]["orbs"])} +loc_orbBundleTable = { + **locGR_orbBundleTable, + **locSV_orbBundleTable, + **locSB_orbBundleTable, + **locFJ_orbBundleTable, + **locMI_orbBundleTable, + **locFC_orbBundleTable, + **locRV_orbBundleTable, + **locLPC_orbBundleTable, + **locBS_orbBundleTable, + **locPB_orbBundleTable, + **locMP_orbBundleTable, + **locVC_orbBundleTable, + **locSM_orbBundleTable, + **locSC_orbBundleTable, + **locLT_orbBundleTable, + **locGMC_orbBundleTable, + **locGlobal_orbBundleTable +} diff --git a/worlds/jakanddaxter/locs/scout_locations.py b/worlds/jakanddaxter/locs/scout_locations.py new file mode 100644 index 0000000000..892bb973e0 --- /dev/null +++ b/worlds/jakanddaxter/locs/scout_locations.py @@ -0,0 +1,230 @@ +from ..game_id import jak1_id + +# Scout Flies are given ID's between 0 and 393311 by the game, explanation below. + +# Each fly (or "buzzer") is given a unique 32-bit number broken into two 16-bit numbers. +# The lower 16 bits are the game-task ID of the power cell the fly corresponds to. +# The higher 16 bits are the index of the fly itself, from 000 (0) to 110 (6). + +# Ex: The final scout fly on Geyser Rock +# 0000000000000110 0000000001011111 +# ( Index: 6 ) ( Cell: 95 ) + +# Because flies are indexed from 0, each 0th fly's full ID == the power cell's ID. +# So we need to offset all of their ID's in order for Archipelago to separate them +# from their power cells. We can use 1024 (2^10) for this purpose, because scout flies +# only ever need 10 bits to identify themselves (3 for the index, 7 for the cell ID). + +# We're also going to compress the ID by bit-shifting the fly index down to lower bits, +# keeping the scout fly ID range to a smaller set of numbers (1000 -> 2000, instead of 1 -> 400000). +fly_offset = 1024 + + +# These helper functions do all the math required to get information about each +# scout fly and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + cell_id = get_cell_id(game_id) # Get the power cell ID from the lowest 7 bits. + buzzer_index = (game_id - cell_id) >> 9 # Get the index, bit shift it down 9 places. + compressed_id = fly_offset + buzzer_index + cell_id # Add the offset, the bit-shifted index, and the cell ID. + return jak1_id + compressed_id # Last thing: add the game's ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + compressed_id = ap_id - jak1_id # Reverse process. First thing: subtract the game's ID. + cell_id = get_cell_id(compressed_id) # Get the power cell ID from the lowest 7 bits. + buzzer_index = compressed_id - fly_offset - cell_id # Get the bit-shifted index. + return (buzzer_index << 9) + cell_id # Return the index to its normal place, re-add the cell ID. + + +# Get the power cell ID from the lowest 7 bits. +# Make sure to use this function ONLY when the input argument does NOT include jak1_id, +# because that number may flip some of the bottom 7 bits, and that will throw off this bit mask. +def get_cell_id(buzzer_id: int) -> int: + if buzzer_id >= jak1_id: + raise ValueError(f"Attempted to bit mask {buzzer_id}, but it is polluted by the game's ID {jak1_id}.") + return buzzer_id & 0b1111111 + + +# The ID's you see below correspond directly to that fly's 32-bit ID in the game. +# I used the decompiled entity JSON's and Jak's X/Y coordinates in Debug Mode +# to determine which box ID is which location. + +# Geyser Rock +locGR_scoutTable = { + 95: "GR: Scout Fly On Ground, Front", + 327775: "GR: Scout Fly On Ground, Back", + 393311: "GR: Scout Fly On Left Ledge", + 65631: "GR: Scout Fly On Right Ledge", + 262239: "GR: Scout Fly On Middle Ledge, Left", + 131167: "GR: Scout Fly On Middle Ledge, Right", + 196703: "GR: Scout Fly On Top Ledge" +} + +# Sandover Village +locSV_scoutTable = { + 262219: "SV: Scout Fly In Fisherman's House", + 327755: "SV: Scout Fly In Mayor's House", + 131147: "SV: Scout Fly Under Bridge", + 65611: "SV: Scout Fly Behind Sculptor's House", + 75: "SV: Scout Fly Overlooking Farmer's House", + 393291: "SV: Scout Fly Near Oracle", + 196683: "SV: Scout Fly In Farmer's House" +} + +# Forbidden Jungle +locFJ_scoutTable = { + 393223: "FJ: Scout Fly At End Of Path", + 262151: "FJ: Scout Fly On Spiral Of Stumps", + 7: "FJ: Scout Fly Near Dark Eco Boxes", + 196615: "FJ: Scout Fly At End Of River", + 131079: "FJ: Scout Fly Behind Lurker Machine", + 327687: "FJ: Scout Fly Around Temple Spire", + 65543: "FJ: Scout Fly On Top Of Temple" +} + +# Sentinel Beach +locSB_scoutTable = { + 327700: "SB: Scout Fly At Entrance", + 20: "SB: Scout Fly Overlooking Locked Boxes", + 65556: "SB: Scout Fly On Path To Flut Flut", + 262164: "SB: Scout Fly Under Wood Pillars", + 196628: "SB: Scout Fly Overlooking Blue Eco Vent", + 131092: "SB: Scout Fly Overlooking Green Eco Vents", + 393236: "SB: Scout Fly On Sentinel" +} + +# Misty Island +locMI_scoutTable = { + 327708: "MI: Scout Fly Overlooking Entrance", + 65564: "MI: Scout Fly On Ledge Near Arena Entrance", + 262172: "MI: Scout Fly Near Arena Door", + 28: "MI: Scout Fly On Ledge Near Arena Exit", + 131100: "MI: Scout Fly On Ship", + 196636: "MI: Scout Fly On Barrel Ramps", + 393244: "MI: Scout Fly On Zoomer Ramps" +} + +# Fire Canyon +locFC_scoutTable = { + 393284: "FC: Scout Fly 1", + 68: "FC: Scout Fly 2", + 65604: "FC: Scout Fly 3", + 196676: "FC: Scout Fly 4", + 131140: "FC: Scout Fly 5", + 262212: "FC: Scout Fly 6", + 327748: "FC: Scout Fly 7" +} + +# Rock Village +locRV_scoutTable = { + 76: "RV: Scout Fly Behind Sage's Hut", + 131148: "RV: Scout Fly Near Waterfall", + 196684: "RV: Scout Fly Behind Geologist", + 262220: "RV: Scout Fly Behind Fiery Boulder", + 65612: "RV: Scout Fly On Dock", + 327756: "RV: Scout Fly At Pontoon Bridge", + 393292: "RV: Scout Fly At Boggy Swamp Entrance" +} + +# Precursor Basin +locPB_scoutTable = { + 196665: "PB: Scout Fly Overlooking Entrance", + 393273: "PB: Scout Fly Near Mole Hole", + 131129: "PB: Scout Fly At Purple Ring Start", + 65593: "PB: Scout Fly Near Dark Eco Plant, Above", + 57: "PB: Scout Fly At Blue Ring Start", + 262201: "PB: Scout Fly Before Big Jump", + 327737: "PB: Scout Fly Near Dark Eco Plant, Below" +} + +# Lost Precursor City +locLPC_scoutTable = { + 262193: "LPC: Scout Fly First Room", + 131121: "LPC: Scout Fly Before Second Room", + 393265: "LPC: Scout Fly Second Room, Near Orb Vent", + 196657: "LPC: Scout Fly Second Room, On Path To Cell", + 49: "LPC: Scout Fly Second Room, Green Pipe", # Sunken Pipe Game, special cases. See `got-buzzer?` + 65585: "LPC: Scout Fly Second Room, Blue Pipe", # Sunken Pipe Game, special cases. See `got-buzzer?` + 327729: "LPC: Scout Fly Across Steam Vents" +} + +# Boggy Swamp +locBS_scoutTable = { + 43: "BS: Scout Fly Near Entrance", + 393259: "BS: Scout Fly Over First Jump Pad", + 65579: "BS: Scout Fly Over Second Jump Pad", + 262187: "BS: Scout Fly Across Black Swamp", + 327723: "BS: Scout Fly Overlooking Flut Flut", + 131115: "BS: Scout Fly On Flut Flut Platforms", + 196651: "BS: Scout Fly In Field Of Boxes" +} + +# Mountain Pass +locMP_scoutTable = { + 88: "MP: Scout Fly 1", + 65624: "MP: Scout Fly 2", + 131160: "MP: Scout Fly 3", + 196696: "MP: Scout Fly 4", + 262232: "MP: Scout Fly 5", + 327768: "MP: Scout Fly 6", + 393304: "MP: Scout Fly 7" +} + +# Volcanic Crater +locVC_scoutTable = { + 262221: "VC: Scout Fly In Miner's Cave", + 393293: "VC: Scout Fly Near Oracle", + 196685: "VC: Scout Fly On Stone Platforms", + 131149: "VC: Scout Fly Near Lava Tube", + 77: "VC: Scout Fly At Minecart Junction", + 65613: "VC: Scout Fly Near Spider Cave", + 327757: "VC: Scout Fly Near Mountain Pass" +} + +# Spider Cave +locSC_scoutTable = { + 327765: "SC: Scout Fly Near Dark Cave Entrance", + 262229: "SC: Scout Fly In Dark Cave", + 393301: "SC: Scout Fly Main Cave, Overlooking Entrance", + 196693: "SC: Scout Fly Main Cave, Near Dark Crystal", + 131157: "SC: Scout Fly Main Cave, Near Robot Cave Entrance", + 85: "SC: Scout Fly Robot Cave, At Bottom Level", + 65621: "SC: Scout Fly Robot Cave, At Top Level", +} + +# Snowy Mountain +locSM_scoutTable = { + 65: "SM: Scout Fly Near Entrance", + 327745: "SM: Scout Fly Near Frozen Box", + 65601: "SM: Scout Fly Near Yellow Eco Switch", + 131137: "SM: Scout Fly On Cliff near Flut Flut", + 393281: "SM: Scout Fly Under Bridge To Fort", + 196673: "SM: Scout Fly On Top Of Fort Tower", + 262209: "SM: Scout Fly On Top Of Fort" +} + +# Lava Tube +locLT_scoutTable = { + 90: "LT: Scout Fly 1", + 65626: "LT: Scout Fly 2", + 327770: "LT: Scout Fly 3", + 262234: "LT: Scout Fly 4", + 131162: "LT: Scout Fly 5", + 196698: "LT: Scout Fly 6", + 393306: "LT: Scout Fly 7" +} + +# Gol and Maias Citadel +locGMC_scoutTable = { + 91: "GMC: Scout Fly At Entrance", + 65627: "GMC: Scout Fly Main Room, Left of Robot", + 196699: "GMC: Scout Fly Main Room, Right of Robot", + 262235: "GMC: Scout Fly Before Jumping Lurkers", + 393307: "GMC: Scout Fly At Blast Furnace", + 131163: "GMC: Scout Fly At Launch Pad Room", + 327771: "GMC: Scout Fly Top Of Rotating Tower" +} diff --git a/worlds/jakanddaxter/locs/special_locations.py b/worlds/jakanddaxter/locs/special_locations.py new file mode 100644 index 0000000000..95081eb2e3 --- /dev/null +++ b/worlds/jakanddaxter/locs/special_locations.py @@ -0,0 +1,51 @@ +from ..game_id import jak1_id + +# These are special checks that the game normally does not track. They are not game entities and thus +# don't have game ID's. + +# Normally, for example, completing the fishing minigame is what gives you access to the +# fisherman's boat to get to Misty Island. The game treats completion of the fishing minigame as well as the +# power cell you receive as one and the same. The fisherman only gives you one item, a power cell. + +# We're significantly altering the game logic here to decouple these concepts. First, completing the fishing minigame +# now counts as 2 Location checks. Second, the fisherman should give you a power cell (a generic item) as well as +# the "keys" to his boat (a special item). It is the "keys" that we are defining in this file, and the respective +# Item representing those keys will be defined in Items.py. These aren't real in the sense that +# they have a model and texture, they are just the logical representation of the boat unlock. + +# We can use 2^11 to offset these from scout flies, just like we offset scout flies from power cells +# by 2^10. Even with the high-16 reminder bits, scout flies don't exceed an ID of (jak1_id + 1887). +special_offset = 2048 + + +# These helper functions do all the math required to get information about each +# special check and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + special_offset + game_id # Add the offsets and the orb Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id - special_offset # Reverse process, subtract the offsets. + + +# The ID's you see below correlate to each of their respective game-tasks, even though they are separate. +# This makes it easier for the new game logic to know what relates to what. I hope. God I hope. + +loc_specialTable = { + 5: "Fisherman's Boat", + 4: "Jungle Elevator", + 2: "Blue Eco Switch", + 17: "Flut Flut", + 33: "Warrior's Pontoons", + 105: "Snowy Mountain Gondola", + 60: "Yellow Eco Switch", + 63: "Snowy Fort Gate", + 71: "Freed The Blue Sage", + 72: "Freed The Red Sage", + 73: "Freed The Yellow Sage", + 70: "Freed The Green Sage", +} diff --git a/worlds/jakanddaxter/options.py b/worlds/jakanddaxter/options.py new file mode 100644 index 0000000000..bd007e264a --- /dev/null +++ b/worlds/jakanddaxter/options.py @@ -0,0 +1,262 @@ +from dataclasses import dataclass +from functools import cached_property +from Options import PerGameCommonOptions, StartInventoryPool, Toggle, Choice, Range, DefaultOnToggle, OptionCounter +from .items import trap_item_table + + +class StaticGetter: + def __init__(self, func): + self.fget = func + + def __get__(self, instance, owner): + return self.fget(owner) + + +@StaticGetter +def determine_range_end(cls) -> int: + from . import JakAndDaxterWorld + enforce_friendly_options = JakAndDaxterWorld.settings.enforce_friendly_options + return cls.friendly_maximum if enforce_friendly_options else cls.absolute_maximum + + +class EnableMoveRandomizer(Toggle): + """Include movement options as items in the randomizer. Until you find his other moves, Jak is limited to + running, swimming, single-jumping, and shooting yellow eco through his goggles. + + This adds 11 items to the pool.""" + display_name = "Enable Move Randomizer" + + +class EnableOrbsanity(Choice): + """Include bundles of Precursor Orbs as checks. Every time you collect the chosen number of orbs, you will trigger + another check. + + Per Level: bundles are for each level in the game. + Global: bundles carry over level to level. + + This adds a number of Items and Locations to the pool inversely proportional to the size of the bundle. + For example, if your bundle size is 20 orbs, you will add 100 items to the pool. If your bundle size is 250 orbs, + you will add 8 items to the pool.""" + display_name = "Enable Orbsanity" + option_off = 0 + option_per_level = 1 + option_global = 2 + default = 0 + + +class GlobalOrbsanityBundleSize(Choice): + """The orb bundle size for Global Orbsanity. This only applies if "Enable Orbsanity" is set to "Global." + There are 2000 orbs in the game, so your bundle size must be a factor of 2000. + + Multiplayer Minimum: 10 + Multiplayer Maximum: 200""" + display_name = "Global Orbsanity Bundle Size" + option_1_orb = 1 + option_2_orbs = 2 + option_4_orbs = 4 + option_5_orbs = 5 + option_8_orbs = 8 + option_10_orbs = 10 + option_16_orbs = 16 + option_20_orbs = 20 + option_25_orbs = 25 + option_40_orbs = 40 + option_50_orbs = 50 + option_80_orbs = 80 + option_100_orbs = 100 + option_125_orbs = 125 + option_200_orbs = 200 + option_250_orbs = 250 + option_400_orbs = 400 + option_500_orbs = 500 + option_1000_orbs = 1000 + option_2000_orbs = 2000 + friendly_minimum = 10 + friendly_maximum = 200 + default = 20 + + +class PerLevelOrbsanityBundleSize(Choice): + """The orb bundle size for Per Level Orbsanity. This only applies if "Enable Orbsanity" is set to "Per Level." + There are 50, 150, or 200 orbs per level, so your bundle size must be a factor of 50. + + Multiplayer Minimum: 10""" + display_name = "Per Level Orbsanity Bundle Size" + option_1_orb = 1 + option_2_orbs = 2 + option_5_orbs = 5 + option_10_orbs = 10 + option_25_orbs = 25 + option_50_orbs = 50 + friendly_minimum = 10 + default = 25 + + +class FireCanyonCellCount(Range): + """The number of power cells you need to cross Fire Canyon. This value is restricted to a safe maximum value to + ensure valid singleplayer games and non-disruptive multiplayer games, but the host can remove this restriction by + turning off enforce_friendly_options in host.yaml.""" + display_name = "Fire Canyon Cell Count" + friendly_maximum = 30 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 20 + + +class MountainPassCellCount(Range): + """The number of power cells you need to reach Klaww and cross Mountain Pass. This value is restricted to a safe + maximum value to ensure valid singleplayer games and non-disruptive multiplayer games, but the host can + remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Mountain Pass Cell Count" + friendly_maximum = 60 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 45 + + +class LavaTubeCellCount(Range): + """The number of power cells you need to cross Lava Tube. This value is restricted to a safe maximum value to + ensure valid singleplayer games and non-disruptive multiplayer games, but the host can remove this restriction by + turning off enforce_friendly_options in host.yaml.""" + display_name = "Lava Tube Cell Count" + friendly_maximum = 90 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 72 + + +class EnableOrderedCellCounts(DefaultOnToggle): + """Reorder the Cell Count requirements for vehicle sections to be in ascending order. + + For example, if Fire Canyon Cell Count, Mountain Pass Cell Count, and Lava Tube Cell Count are 60, 30, and 40 + respectively, they will be reordered to 30, 40, and 60.""" + display_name = "Enable Ordered Cell Counts" + + +class RequirePunchForKlaww(DefaultOnToggle): + """Force the Punch move to come before Klaww. Disabling this setting may require Jak to fight Klaww + and Gol and Maia by shooting yellow eco through his goggles. This only applies if "Enable Move Randomizer" is ON.""" + display_name = "Require Punch For Klaww" + + +# 222 is the absolute maximum because there are 9 citizen trades and 2000 orbs to trade (2000/9 = 222). +class CitizenOrbTradeAmount(Range): + """The number of orbs you need to trade to citizens for a power cell (Mayor, Uncle, etc.). + + Along with Oracle Orb Trade Amount, this setting cannot exceed the total number of orbs in the game (2000). + The equation to determine the total number of trade orbs is (9 * Citizen Trades) + (6 * Oracle Trades). + + This value is restricted to a safe maximum value to ensure valid singleplayer games and non-disruptive + multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Citizen Orb Trade Amount" + friendly_maximum = 120 + absolute_maximum = 222 + range_start = 0 + range_end = determine_range_end + default = 90 + + +# 333 is the absolute maximum because there are 6 oracle trades and 2000 orbs to trade (2000/6 = 333). +class OracleOrbTradeAmount(Range): + """The number of orbs you need to trade to the Oracles for a power cell. + + Along with Citizen Orb Trade Amount, this setting cannot exceed the total number of orbs in the game (2000). + The equation to determine the total number of trade orbs is (9 * Citizen Trades) + (6 * Oracle Trades). + + This value is restricted to a safe maximum value to ensure valid singleplayer games and non-disruptive + multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Oracle Orb Trade Amount" + friendly_maximum = 150 + absolute_maximum = 333 + range_start = 0 + range_end = determine_range_end + default = 120 + + +class FillerPowerCellsReplacedWithTraps(Range): + """ + The number of filler power cells that will be replaced with traps. This does not affect the number of progression + power cells. + + If this value is greater than the number of filler power cells, then they will all be replaced with traps. + """ + display_name = "Filler Power Cells Replaced With Traps" + range_start = 0 + range_end = 100 + default = 0 + + +class FillerOrbBundlesReplacedWithTraps(Range): + """ + The number of filler orb bundles that will be replaced with traps. This does not affect the number of progression + orb bundles. This only applies if "Enable Orbsanity" is set to "Per Level" or "Global." + + If this value is greater than the number of filler orb bundles, then they will all be replaced with traps. + """ + display_name = "Filler Orb Bundles Replaced With Traps" + range_start = 0 + range_end = 2000 + default = 0 + + +class TrapEffectDuration(Range): + """ + The length of time, in seconds, that a trap effect lasts. + """ + display_name = "Trap Effect Duration" + range_start = 5 + range_end = 60 + default = 30 + + +class TrapWeights(OptionCounter): + """ + The list of traps and corresponding weights that will be randomly added to the item pool. A trap with weight 10 is + twice as likely to appear as a trap with weight 5. Set a weight to 0 to prevent that trap from appearing altogether. + If all weights are 0, no traps are created, overriding the values of "Filler * Replaced With Traps." + """ + display_name = "Trap Weights" + min = 0 + default = {trap: 1 for trap in trap_item_table.values()} + valid_keys = sorted({trap for trap in trap_item_table.values()}) + + @cached_property + def weights_pair(self) -> tuple[list[str], list[int]]: + return list(self.value.keys()), list(self.value.values()) + + +class CompletionCondition(Choice): + """Set the goal for completing the game.""" + display_name = "Completion Condition" + option_cross_fire_canyon = 69 + option_cross_mountain_pass = 87 + option_cross_lava_tube = 89 + option_defeat_dark_eco_plant = 6 + option_defeat_klaww = 86 + option_defeat_gol_and_maia = 112 + option_open_100_cell_door = 116 + default = 112 + + +@dataclass +class JakAndDaxterOptions(PerGameCommonOptions): + enable_move_randomizer: EnableMoveRandomizer + enable_orbsanity: EnableOrbsanity + global_orbsanity_bundle_size: GlobalOrbsanityBundleSize + level_orbsanity_bundle_size: PerLevelOrbsanityBundleSize + fire_canyon_cell_count: FireCanyonCellCount + mountain_pass_cell_count: MountainPassCellCount + lava_tube_cell_count: LavaTubeCellCount + enable_ordered_cell_counts: EnableOrderedCellCounts + require_punch_for_klaww: RequirePunchForKlaww + citizen_orb_trade_amount: CitizenOrbTradeAmount + oracle_orb_trade_amount: OracleOrbTradeAmount + filler_power_cells_replaced_with_traps: FillerPowerCellsReplacedWithTraps + filler_orb_bundles_replaced_with_traps: FillerOrbBundlesReplacedWithTraps + trap_effect_duration: TrapEffectDuration + trap_weights: TrapWeights + jak_completion_condition: CompletionCondition + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/jakanddaxter/regions.py b/worlds/jakanddaxter/regions.py new file mode 100644 index 0000000000..8447f72e8e --- /dev/null +++ b/worlds/jakanddaxter/regions.py @@ -0,0 +1,132 @@ +import typing +from Options import OptionError +from .items import item_table +from .options import EnableOrbsanity, CompletionCondition +from .rules import can_reach_orbs_global +from .locs import cell_locations as cells, scout_locations as scouts +from .regs import (geyser_rock_regions as geyser_rock, + sandover_village_regions as sandover_village, + forbidden_jungle_regions as forbidden_jungle, + sentinel_beach_regions as sentinel_beach, + misty_island_regions as misty_island, + fire_canyon_regions as fire_canyon, + rock_village_regions as rock_village, + precursor_basin_regions as precursor_basin, + lost_precursor_city_regions as lost_precursor_city, + boggy_swamp_regions as boggy_swamp, + mountain_pass_regions as mountain_pass, + volcanic_crater_regions as volcanic_crater, + spider_cave_regions as spider_cave, + snowy_mountain_regions as snowy_mountain, + lava_tube_regions as lava_tube, + gol_and_maias_citadel_regions as gol_and_maias_citadel) +from .regs.region_base import JakAndDaxterRegion + +if typing.TYPE_CHECKING: + from . import JakAndDaxterWorld + + +def create_regions(world: "JakAndDaxterWorld"): + multiworld = world.multiworld + options = world.options + player = world.player + + # Always start with Menu. + menu = JakAndDaxterRegion("Menu", player, multiworld) + multiworld.regions.append(menu) + + # Build the special "Free 7 Scout Flies" Region. This is a virtual region always accessible to Menu. + # The Locations within are automatically checked when you receive the 7th scout fly for the corresponding cell. + free7 = JakAndDaxterRegion("'Free 7 Scout Flies' Power Cells", player, multiworld) + free7.add_cell_locations(cells.loc7SF_cellTable.keys()) + for scout_fly_cell in free7.locations: + + # Translate from Cell AP ID to Scout AP ID using game ID as an intermediary. + scout_fly_id = scouts.to_ap_id(cells.to_game_id(typing.cast(int, scout_fly_cell.address))) + scout_fly_cell.access_rule = lambda state, flies=scout_fly_id: state.has(item_table[flies], player, 7) + multiworld.regions.append(free7) + menu.connect(free7) + + # If Global Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Menu. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_global: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld) + + bundle_count = 2000 // world.orb_bundle_size + for bundle_index in range(bundle_count): + + # Unlike Per-Level Orbsanity, Global Orbsanity Locations always have a level_index of 16. + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(16, + bundle_index, + access_rule=lambda state, orb_amount=amount: + can_reach_orbs_global(state, player, world, orb_amount)) + multiworld.regions.append(orbs) + menu.connect(orbs) + + # Build all regions. Include their intra-connecting Rules, their Locations, and their Location access rules. + gr = geyser_rock.build_regions("Geyser Rock", world) + sv = sandover_village.build_regions("Sandover Village", world) + fj, fjp = forbidden_jungle.build_regions("Forbidden Jungle", world) + sb = sentinel_beach.build_regions("Sentinel Beach", world) + mi = misty_island.build_regions("Misty Island", world) + fc = fire_canyon.build_regions("Fire Canyon", world) + rv, rvp, rvc = rock_village.build_regions("Rock Village", world) + pb = precursor_basin.build_regions("Precursor Basin", world) + lpc = lost_precursor_city.build_regions("Lost Precursor City", world) + bs = boggy_swamp.build_regions("Boggy Swamp", world) + mp, mpr = mountain_pass.build_regions("Mountain Pass", world) + vc = volcanic_crater.build_regions("Volcanic Crater", world) + sc = spider_cave.build_regions("Spider Cave", world) + sm = snowy_mountain.build_regions("Snowy Mountain", world) + lt = lava_tube.build_regions("Lava Tube", world) + gmc, fb, fd = gol_and_maias_citadel.build_regions("Gol and Maia's Citadel", world) + + # Configurable counts of cells for connector levels. + fc_count = options.fire_canyon_cell_count.value + mp_count = options.mountain_pass_cell_count.value + lt_count = options.lava_tube_cell_count.value + + # Define the interconnecting rules. + menu.connect(gr) + gr.connect(sv) # Geyser Rock modified to let you leave at any time. + sv.connect(fj) + sv.connect(sb) + sv.connect(mi, rule=lambda state: state.has("Fisherman's Boat", player)) + sv.connect(fc, rule=lambda state: state.has("Power Cell", player, fc_count)) # Normally 20. + fc.connect(rv) + rv.connect(pb) + rv.connect(lpc) + rvp.connect(bs) # rv->rvp/rvc connections defined internally by RockVillageRegions. + rvc.connect(mp, rule=lambda state: state.has("Power Cell", player, mp_count)) # Normally 45. + mpr.connect(vc) # mp->mpr connection defined internally by MountainPassRegions. + vc.connect(sc) + vc.connect(sm, rule=lambda state: state.has("Snowy Mountain Gondola", player)) + vc.connect(lt, rule=lambda state: state.has("Power Cell", player, lt_count)) # Normally 72. + lt.connect(gmc) # gmc->fb connection defined internally by GolAndMaiasCitadelRegions. + + # Set the completion condition. + if options.jak_completion_condition == CompletionCondition.option_cross_fire_canyon: + multiworld.completion_condition[player] = lambda state: state.can_reach(rv, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_cross_mountain_pass: + multiworld.completion_condition[player] = lambda state: state.can_reach(vc, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_cross_lava_tube: + multiworld.completion_condition[player] = lambda state: state.can_reach(gmc, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_defeat_dark_eco_plant: + multiworld.completion_condition[player] = lambda state: state.can_reach(fjp, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_defeat_klaww: + multiworld.completion_condition[player] = lambda state: state.can_reach(mp, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_defeat_gol_and_maia: + multiworld.completion_condition[player] = lambda state: state.can_reach(fb, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_open_100_cell_door: + multiworld.completion_condition[player] = lambda state: state.can_reach(fd, "Region", player) + + else: + raise OptionError(f"{world.player_name}: Unknown completion goal ID " + f"({options.jak_completion_condition.value}).") diff --git a/worlds/jakanddaxter/regs/__init__.py b/worlds/jakanddaxter/regs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/regs/boggy_swamp_regions.py b/worlds/jakanddaxter/regs/boggy_swamp_regions.py new file mode 100644 index 0000000000..a548f2e410 --- /dev/null +++ b/worlds/jakanddaxter/regs/boggy_swamp_regions.py @@ -0,0 +1,174 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # This level is full of short-medium gaps that cannot be crossed by single jump alone. + # These helper functions list out the moves that can cross all these gaps (painting with a broad brush but...) + def can_jump_farther(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + def can_jump_higher(state: CollectionState, p: int) -> bool: + return (state.has("Double Jump", p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Crouch", "Crouch Uppercut"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + # Orb crates and fly box in this area can be gotten with yellow eco and goggles. + # Start with the first yellow eco cluster near first_bats and work your way backward toward the entrance. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 23) + main_area.add_fly_locations([43]) + + # Includes 4 orbs collectable with the blue eco vent. + first_bats = JakAndDaxterRegion("First Bats Area", player, multiworld, level_name, 4) + + first_jump_pad = JakAndDaxterRegion("First Jump Pad", player, multiworld, level_name, 0) + first_jump_pad.add_fly_locations([393259]) + + # The tethers in this level are all out of order... a casual playthrough has the following order for the cell ID's: + # 42, 39, 40, 41. So that is the order we're calling "first, second, third, fourth". + + # First tether cell is collectable with yellow eco and goggles. + first_tether = JakAndDaxterRegion("First Tether", player, multiworld, level_name, 7) + first_tether.add_cell_locations([42]) + + # This rat colony has 3 orbs on top of it, requires special movement. + first_tether_rat_colony = JakAndDaxterRegion("First Tether Rat Colony", player, multiworld, level_name, 3) + + # If quick enough, combat not required. + second_jump_pad = JakAndDaxterRegion("Second Jump Pad", player, multiworld, level_name, 0) + second_jump_pad.add_fly_locations([65579]) + + first_pole_course = JakAndDaxterRegion("First Pole Course", player, multiworld, level_name, 28) + + # You can break this tether with a yellow eco vent and goggles, + # but you can't reach the platform unless you can jump high. + second_tether = JakAndDaxterRegion("Second Tether", player, multiworld, level_name, 0) + second_tether.add_cell_locations([39], access_rule=lambda state: can_jump_higher(state, player)) + + # Fly and orbs are collectable with nearby blue eco cluster. + second_bats = JakAndDaxterRegion("Second Bats Area", player, multiworld, level_name, 27) + second_bats.add_fly_locations([262187], access_rule=lambda state: can_jump_farther(state, player)) + + third_jump_pad = JakAndDaxterRegion("Third Jump Pad (Arena)", player, multiworld, level_name, 0) + third_jump_pad.add_cell_locations([38], access_rule=lambda state: can_fight(state, player)) + + # The platform for the third tether might look high, but you can get a boost from the yellow eco vent. + fourth_jump_pad = JakAndDaxterRegion("Fourth Jump Pad (Third Tether)", player, multiworld, level_name, 9) + fourth_jump_pad.add_cell_locations([40]) + + # Orbs collectable here with yellow eco and goggles. + flut_flut_pad = JakAndDaxterRegion("Flut Flut Pad", player, multiworld, level_name, 36) + + flut_flut_course = JakAndDaxterRegion("Flut Flut Course", player, multiworld, level_name, 23) + flut_flut_course.add_cell_locations([37]) + flut_flut_course.add_fly_locations([327723, 131115]) + + # Includes some orbs on the way to the cabin, blue+yellow eco to collect. + farthy_snacks = JakAndDaxterRegion("Farthy's Snacks", player, multiworld, level_name, 7) + farthy_snacks.add_cell_locations([36]) + + # Scout fly in this field can be broken with yellow eco. + box_field = JakAndDaxterRegion("Field of Boxes", player, multiworld, level_name, 10) + box_field.add_fly_locations([196651]) + + last_tar_pit = JakAndDaxterRegion("Last Tar Pit", player, multiworld, level_name, 12) + + fourth_tether = JakAndDaxterRegion("Fourth Tether", player, multiworld, level_name, 11) + fourth_tether.add_cell_locations([41], access_rule=lambda state: can_jump_higher(state, player)) + + main_area.connect(first_bats, rule=lambda state: can_jump_farther(state, player)) + + first_bats.connect(main_area) + first_bats.connect(first_jump_pad) + first_bats.connect(first_tether) + + first_jump_pad.connect(first_bats) + + first_tether.connect(first_bats) + first_tether.connect(first_tether_rat_colony, rule=lambda state: + (state.has_all(("Roll", "Roll Jump"), player) + or state.has_all(("Double Jump", "Jump Kick"), player))) + first_tether.connect(second_jump_pad) + first_tether.connect(first_pole_course) + + first_tether_rat_colony.connect(first_tether) + + second_jump_pad.connect(first_tether) + + first_pole_course.connect(first_tether) + first_pole_course.connect(second_tether) + + second_tether.connect(first_pole_course, rule=lambda state: can_jump_higher(state, player)) + second_tether.connect(second_bats) + + second_bats.connect(second_tether) + second_bats.connect(third_jump_pad) + second_bats.connect(fourth_jump_pad) + second_bats.connect(flut_flut_pad) + + third_jump_pad.connect(second_bats) + fourth_jump_pad.connect(second_bats) + + flut_flut_pad.connect(second_bats) + flut_flut_pad.connect(flut_flut_course, rule=lambda state: state.has("Flut Flut", player)) # Naturally. + flut_flut_pad.connect(farthy_snacks) + + flut_flut_course.connect(flut_flut_pad) + + farthy_snacks.connect(flut_flut_pad) + farthy_snacks.connect(box_field, rule=lambda state: can_jump_higher(state, player)) + + box_field.connect(farthy_snacks, rule=lambda state: can_jump_higher(state, player)) + box_field.connect(last_tar_pit, rule=lambda state: can_jump_farther(state, player)) + + last_tar_pit.connect(box_field, rule=lambda state: can_jump_farther(state, player)) + last_tar_pit.connect(fourth_tether, rule=lambda state: can_jump_farther(state, player)) + + fourth_tether.connect(last_tar_pit, rule=lambda state: can_jump_farther(state, player)) + fourth_tether.connect(main_area) # Fall down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(first_bats) + world.level_to_regions[level_name].append(first_jump_pad) + world.level_to_regions[level_name].append(first_tether) + world.level_to_regions[level_name].append(first_tether_rat_colony) + world.level_to_regions[level_name].append(second_jump_pad) + world.level_to_regions[level_name].append(first_pole_course) + world.level_to_regions[level_name].append(second_tether) + world.level_to_regions[level_name].append(second_bats) + world.level_to_regions[level_name].append(third_jump_pad) + world.level_to_regions[level_name].append(fourth_jump_pad) + world.level_to_regions[level_name].append(flut_flut_pad) + world.level_to_regions[level_name].append(flut_flut_course) + world.level_to_regions[level_name].append(farthy_snacks) + world.level_to_regions[level_name].append(box_field) + world.level_to_regions[level_name].append(last_tar_pit) + world.level_to_regions[level_name].append(fourth_tether) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(8, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/fire_canyon_regions.py b/worlds/jakanddaxter/regs/fire_canyon_regions.py new file mode 100644 index 0000000000..9ce0f5dae2 --- /dev/null +++ b/worlds/jakanddaxter/regs/fire_canyon_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locFC_cellTable.keys()) + main_area.add_fly_locations(scouts.locFC_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(5, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/forbidden_jungle_regions.py b/worlds/jakanddaxter/regs/forbidden_jungle_regions.py new file mode 100644 index 0000000000..601a802e55 --- /dev/null +++ b/worlds/jakanddaxter/regs/forbidden_jungle_regions.py @@ -0,0 +1,103 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 25) + + # You can get this scout fly by running from the blue eco vent across the temple bridge, + # falling onto the river, collecting the 3 blue clusters, using the jump pad, and running straight to the box. + main_area.add_fly_locations([393223]) + + lurker_machine = JakAndDaxterRegion("Lurker Machine", player, multiworld, level_name, 5) + lurker_machine.add_cell_locations([3], access_rule=lambda state: can_fight(state, player)) + + # This cell and this scout fly can both be gotten with the blue eco clusters near the jump pad. + lurker_machine.add_cell_locations([9]) + lurker_machine.add_fly_locations([131079]) + + river = JakAndDaxterRegion("River", player, multiworld, level_name, 42) + + # All of these can be gotten with blue eco, hitting the dark eco boxes, or by running. + river.add_cell_locations([5, 8]) + river.add_fly_locations([7, 196615]) + river.add_special_locations([5]) + river.add_cache_locations([10369]) + + temple_exit = JakAndDaxterRegion("Temple Exit", player, multiworld, level_name, 12) + + # This fly is too far from accessible blue eco sources. + temple_exit.add_fly_locations([262151], access_rule=lambda state: can_free_scout_flies(state, player)) + + temple_exterior = JakAndDaxterRegion("Temple Exterior", player, multiworld, level_name, 10) + + # All of these can be gotten with blue eco and running. + temple_exterior.add_cell_locations([4]) + temple_exterior.add_fly_locations([327687, 65543]) + temple_exterior.add_special_locations([4]) + + temple_int_pre_blue = JakAndDaxterRegion("Temple Interior (Pre Blue Eco)", player, multiworld, level_name, 17) + temple_int_pre_blue.add_cell_locations([2]) + temple_int_pre_blue.add_special_locations([2]) + + temple_int_post_blue = JakAndDaxterRegion("Temple Interior (Post Blue Eco)", player, multiworld, level_name, 39) + temple_int_post_blue.add_cell_locations([6], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(lurker_machine) # Run and jump (tree stump platforms). + main_area.connect(river) # Jump down. + main_area.connect(temple_exit) # Run and jump (bridges). + + lurker_machine.connect(main_area) # Jump down. + lurker_machine.connect(river) # Jump down. + lurker_machine.connect(temple_exterior) # Jump down (ledge). + + river.connect(main_area) # Jump up (ledges near fisherman). + river.connect(lurker_machine) # Jump pad (aim toward machine). + river.connect(temple_exit) # Run and jump (trampolines). + river.connect(temple_exterior) # Jump pad (aim toward temple door). + + temple_exit.connect(main_area) # Run and jump (bridges). + temple_exit.connect(river) # Jump down. + temple_exit.connect(temple_exterior) # Run and jump (bridges, dodge spikes). + + # Requires Jungle Elevator. + temple_exterior.connect(temple_int_pre_blue, rule=lambda state: state.has("Jungle Elevator", player)) + + # Requires Blue Eco Switch. + temple_int_pre_blue.connect(temple_int_post_blue, rule=lambda state: state.has("Blue Eco Switch", player)) + + # Requires defeating the plant boss (combat). + temple_int_post_blue.connect(temple_exit, rule=lambda state: can_fight(state, player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(lurker_machine) + world.level_to_regions[level_name].append(river) + world.level_to_regions[level_name].append(temple_exit) + world.level_to_regions[level_name].append(temple_exterior) + world.level_to_regions[level_name].append(temple_int_pre_blue) + world.level_to_regions[level_name].append(temple_int_post_blue) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(3, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area, temple_int_post_blue diff --git a/worlds/jakanddaxter/regs/geyser_rock_regions.py b/worlds/jakanddaxter/regs/geyser_rock_regions.py new file mode 100644 index 0000000000..10783067c3 --- /dev/null +++ b/worlds/jakanddaxter/regs/geyser_rock_regions.py @@ -0,0 +1,48 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 48) + main_area.add_cell_locations([92, 93]) + main_area.add_fly_locations(scouts.locGR_scoutTable.keys()) # All Flies here are accessible with blue eco. + + # The last 2 orbs are barely gettable with the blue eco vent, but it's pushing accessibility. So I moved them here. + cliff = JakAndDaxterRegion("Cliff", player, multiworld, level_name, 2) + cliff.add_cell_locations([94]) + + main_area.connect(cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut"), player)) + + cliff.connect(main_area) # Jump down or ride blue eco elevator. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(cliff) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(0, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py b/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py new file mode 100644 index 0000000000..83d2d51f1d --- /dev/null +++ b/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py @@ -0,0 +1,137 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity, CompletionCondition +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +# God help me... here we go. +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion | None, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This level is full of short-medium gaps that cannot be crossed by single jump alone. + # These helper functions list out the moves that can cross all these gaps (painting with a broad brush but...) + def can_jump_farther(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + def can_triple_jump(state: CollectionState, p: int) -> bool: + return state.has_all(("Double Jump", "Jump Kick"), p) + + def can_jump_stairs(state: CollectionState, p: int) -> bool: + return (state.has("Double Jump", p) + or state.has("Jump Dive", p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Crouch", "Crouch Uppercut"), p)) + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_fly_locations([91], access_rule=lambda state: can_free_scout_flies(state, player)) + + robot_scaffolding = JakAndDaxterRegion("Scaffolding Around Robot", player, multiworld, level_name, 8) + robot_scaffolding.add_fly_locations([196699], access_rule=lambda state: can_free_scout_flies(state, player)) + + jump_pad_room = JakAndDaxterRegion("Jump Pad Chamber", player, multiworld, level_name, 88) + jump_pad_room.add_cell_locations([73], access_rule=lambda state: can_fight(state, player)) + jump_pad_room.add_special_locations([73], access_rule=lambda state: can_fight(state, player)) + jump_pad_room.add_fly_locations([131163]) # Blue eco vent is right next to it. + jump_pad_room.add_fly_locations([65627], access_rule=lambda state: + can_free_scout_flies(state, player) and can_jump_farther(state, player)) + jump_pad_room.add_cache_locations([24039, 24040]) # First, blue eco vent, second, blue eco cluster near sage. + + blast_furnace = JakAndDaxterRegion("Blast Furnace", player, multiworld, level_name, 39) + blast_furnace.add_cell_locations([71], access_rule=lambda state: can_fight(state, player)) + blast_furnace.add_special_locations([71], access_rule=lambda state: can_fight(state, player)) + blast_furnace.add_fly_locations([393307]) # Blue eco vent nearby. + blast_furnace.add_cache_locations([24038]) # Blue eco cluster near sage. + + bunny_room = JakAndDaxterRegion("Bunny Chamber", player, multiworld, level_name, 45) + bunny_room.add_cell_locations([72], access_rule=lambda state: can_fight(state, player)) + bunny_room.add_special_locations([72], access_rule=lambda state: can_fight(state, player)) + bunny_room.add_fly_locations([262235], access_rule=lambda state: can_free_scout_flies(state, player)) + + rotating_tower = JakAndDaxterRegion("Rotating Tower", player, multiworld, level_name, 20) + rotating_tower.add_cell_locations([70], access_rule=lambda state: can_fight(state, player)) + rotating_tower.add_special_locations([70], access_rule=lambda state: can_fight(state, player)) + rotating_tower.add_fly_locations([327771], access_rule=lambda state: can_free_scout_flies(state, player)) + + final_boss = JakAndDaxterRegion("Final Boss", player, multiworld, level_name, 0) + + # Jump Dive required for a lot of buttons, prepare yourself. + main_area.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) or state.has_all(("Roll", "Roll Jump"), player)) + main_area.connect(jump_pad_room) + + robot_scaffolding.connect(main_area, rule=lambda state: state.has("Jump Dive", player)) + robot_scaffolding.connect(blast_furnace, rule=lambda state: + state.has("Jump Dive", player) + and can_jump_farther(state, player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + robot_scaffolding.connect(bunny_room, rule=lambda state: + state.has("Jump Dive", player) + and can_jump_farther(state, player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + jump_pad_room.connect(main_area) + jump_pad_room.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + blast_furnace.connect(robot_scaffolding) # Blue eco elevator takes you right back. + + bunny_room.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) + and (can_jump_farther(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + # Final climb. + robot_scaffolding.connect(rotating_tower, rule=lambda state: + can_jump_stairs(state, player) + and state.has_all(("Freed The Blue Sage", + "Freed The Red Sage", + "Freed The Yellow Sage"), player)) + + rotating_tower.connect(main_area) # Take stairs back down. + + # Final elevator. Need to break boxes at summit to get blue eco for platform. + rotating_tower.connect(final_boss, rule=lambda state: + can_fight(state, player) + and state.has("Freed The Green Sage", player)) + + final_boss.connect(rotating_tower) # Take elevator back down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(robot_scaffolding) + world.level_to_regions[level_name].append(jump_pad_room) + world.level_to_regions[level_name].append(blast_furnace) + world.level_to_regions[level_name].append(bunny_room) + world.level_to_regions[level_name].append(rotating_tower) + world.level_to_regions[level_name].append(final_boss) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(15, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Final door. Need 100 power cells. + if options.jak_completion_condition == CompletionCondition.option_open_100_cell_door: + final_door = JakAndDaxterRegion("Final Door", player, multiworld, level_name, 0) + final_boss.connect(final_door, rule=lambda state: state.has("Power Cell", player, 100)) + + world.level_to_regions[level_name].append(final_door) + + return main_area, final_boss, final_door + else: + return main_area, final_boss, None diff --git a/worlds/jakanddaxter/regs/lava_tube_regions.py b/worlds/jakanddaxter/regs/lava_tube_regions.py new file mode 100644 index 0000000000..c3a4c5b24d --- /dev/null +++ b/worlds/jakanddaxter/regs/lava_tube_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locLT_cellTable.keys()) + main_area.add_fly_locations(scouts.locLT_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(14, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/lost_precursor_city_regions.py b/worlds/jakanddaxter/regs/lost_precursor_city_regions.py new file mode 100644 index 0000000000..f4a2ed6b51 --- /dev/null +++ b/worlds/jakanddaxter/regs/lost_precursor_city_regions.py @@ -0,0 +1,155 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # Just the starting area. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 4) + + first_room_upper = JakAndDaxterRegion("First Chamber (Upper)", player, multiworld, level_name, 21) + + first_room_lower = JakAndDaxterRegion("First Chamber (Lower)", player, multiworld, level_name, 0) + first_room_lower.add_fly_locations([262193], access_rule=lambda state: can_free_scout_flies(state, player)) + + first_room_orb_cache = JakAndDaxterRegion("First Chamber Orb Cache", player, multiworld, level_name, 22) + + # Need jump dive to activate button, double jump to reach blue eco to unlock cache. + first_room_orb_cache.add_cache_locations([14507], access_rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + + first_hallway = JakAndDaxterRegion("First Hallway", player, multiworld, level_name, 10) + first_hallway.add_fly_locations([131121], access_rule=lambda state: can_free_scout_flies(state, player)) + + # This entire room is accessible with floating platforms and single jump. + second_room = JakAndDaxterRegion("Second Chamber", player, multiworld, level_name, 28) + + # These items can only be gotten with jump dive to activate a button. + second_room.add_cell_locations([45], access_rule=lambda state: state.has("Jump Dive", player)) + second_room.add_fly_locations([49, 65585], access_rule=lambda state: state.has("Jump Dive", player)) + + # This is the scout fly on the way to the pipe cell, requires normal breaking moves. + second_room.add_fly_locations([196657], access_rule=lambda state: can_free_scout_flies(state, player)) + + # This orb vent and scout fly are right next to each other, can be gotten with blue eco and the floating platforms. + second_room.add_fly_locations([393265]) + second_room.add_cache_locations([14838]) + + # Named after the cell, includes the armored lurker room. + center_complex = JakAndDaxterRegion("Center of the Complex", player, multiworld, level_name, 17) + center_complex.add_cell_locations([51]) + + color_platforms = JakAndDaxterRegion("Color Platforms", player, multiworld, level_name, 6) + color_platforms.add_cell_locations([44], access_rule=lambda state: can_fight(state, player)) + + quick_platforms = JakAndDaxterRegion("Quick Platforms", player, multiworld, level_name, 3) + + # Jump dive to activate button. + quick_platforms.add_cell_locations([48], access_rule=lambda state: state.has("Jump Dive", player)) + + first_slide = JakAndDaxterRegion("First Slide", player, multiworld, level_name, 22) + + # Raised chamber room, includes vent room with scout fly prior to second slide. + capsule_room = JakAndDaxterRegion("Capsule Chamber", player, multiworld, level_name, 6) + + # Use jump dive to activate button inside the capsule. Blue eco vent can ready the chamber and get the scout fly. + capsule_room.add_cell_locations([47], access_rule=lambda state: + state.has("Jump Dive", player) + and (state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player))) + capsule_room.add_fly_locations([327729]) + + # You can slide to the bottom of the city, but if you spawn down there, you have no momentum from the slide. + # So you need some kind of jump to reach this cell. + second_slide = JakAndDaxterRegion("Second Slide", player, multiworld, level_name, 31) + second_slide.add_cell_locations([46], access_rule=lambda state: + state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player)) + + # If you can enter the helix room, you can jump or fight your way to the top. But you need some kind of movement + # to enter it in the first place. + helix_room = JakAndDaxterRegion("Helix Chamber", player, multiworld, level_name, 30) + helix_room.add_cell_locations([50], access_rule=lambda state: + state.has("Double Jump", player) + or can_fight(state, player)) + + main_area.connect(first_room_upper) # Run. + + first_room_upper.connect(main_area) # Run. + first_room_upper.connect(first_hallway) # Run and jump (floating platforms). + first_room_upper.connect(first_room_lower) # Run and jump down. + + first_room_lower.connect(first_room_upper) # Run and jump (floating platforms). + + # Needs some movement to reach these orbs and orb cache. + first_room_lower.connect(first_room_orb_cache, rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + first_room_orb_cache.connect(first_room_lower, rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + + first_hallway.connect(first_room_upper) # Run and jump down. + first_hallway.connect(second_room) # Run and jump (floating platforms). + + second_room.connect(first_hallway) # Run and jump. + second_room.connect(center_complex) # Run and jump down. + + center_complex.connect(second_room) # Run and jump (swim). + center_complex.connect(color_platforms) # Run and jump (swim). + center_complex.connect(quick_platforms) # Run and jump (swim). + + color_platforms.connect(center_complex) # Run and jump (swim). + + quick_platforms.connect(center_complex) # Run and jump (swim). + quick_platforms.connect(first_slide) # Slide. + + first_slide.connect(capsule_room) # Slide. + + capsule_room.connect(second_slide) # Slide. + capsule_room.connect(main_area, rule=lambda state: # Chamber goes back to surface. + state.has("Jump Dive", player)) # (Assume one-way for sanity.) + + second_slide.connect(helix_room, rule=lambda state: # As stated above, you need to jump + state.has_any(("Double Jump", "Jump Kick"), player) # across the dark eco pool before + or state.has_all(("Punch", "Punch Uppercut"), player)) # you can climb the helix room. + + helix_room.connect(quick_platforms, rule=lambda state: # Escape to get back to here. + state.has("Double Jump", player) # Capsule is a convenient exit to the level. + or can_fight(state, player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(first_room_upper) + world.level_to_regions[level_name].append(first_room_lower) + world.level_to_regions[level_name].append(first_room_orb_cache) + world.level_to_regions[level_name].append(first_hallway) + world.level_to_regions[level_name].append(second_room) + world.level_to_regions[level_name].append(center_complex) + world.level_to_regions[level_name].append(color_platforms) + world.level_to_regions[level_name].append(quick_platforms) + world.level_to_regions[level_name].append(first_slide) + world.level_to_regions[level_name].append(capsule_room) + world.level_to_regions[level_name].append(second_slide) + world.level_to_regions[level_name].append(helix_room) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(7, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/misty_island_regions.py b/worlds/jakanddaxter/regs/misty_island_regions.py new file mode 100644 index 0000000000..a6ae612247 --- /dev/null +++ b/worlds/jakanddaxter/regs/misty_island_regions.py @@ -0,0 +1,131 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 9) + + muse_course = JakAndDaxterRegion("Muse Course", player, multiworld, level_name, 21) + muse_course.add_cell_locations([23]) + muse_course.add_fly_locations([327708], access_rule=lambda state: can_free_scout_flies(state, player)) + + zoomer = JakAndDaxterRegion("Zoomer", player, multiworld, level_name, 32) + zoomer.add_cell_locations([27, 29]) + zoomer.add_fly_locations([393244]) + + ship = JakAndDaxterRegion("Ship", player, multiworld, level_name, 10) + ship.add_cell_locations([24]) + ship.add_fly_locations([131100], access_rule=lambda state: can_free_scout_flies(state, player)) + + far_side = JakAndDaxterRegion("Far Side", player, multiworld, level_name, 16) + + # In order to even reach this fly, you must use the seesaw or crouch jump. + far_side_cliff = JakAndDaxterRegion("Far Side Cliff", player, multiworld, level_name, 5) + far_side_cliff.add_fly_locations([28], access_rule=lambda state: can_free_scout_flies(state, player)) + + # To carry the blue eco fast enough to open this cache, you need to break the bone bridges along the way. + far_side_cache = JakAndDaxterRegion("Far Side Orb Cache", player, multiworld, level_name, 15) + far_side_cache.add_cache_locations([11072], access_rule=lambda state: can_fight(state, player)) + + barrel_course = JakAndDaxterRegion("Barrel Course", player, multiworld, level_name, 10) + barrel_course.add_fly_locations([196636], access_rule=lambda state: can_free_scout_flies(state, player)) + + # 14 orbs for the boxes you can only break with the cannon. + cannon = JakAndDaxterRegion("Cannon", player, multiworld, level_name, 14) + cannon.add_cell_locations([26], access_rule=lambda state: can_fight(state, player)) + + upper_approach = JakAndDaxterRegion("Upper Arena Approach", player, multiworld, level_name, 6) + upper_approach.add_fly_locations([65564, 262172], access_rule=lambda state: + can_free_scout_flies(state, player)) + + lower_approach = JakAndDaxterRegion("Lower Arena Approach", player, multiworld, level_name, 7) + lower_approach.add_cell_locations([30]) + + arena = JakAndDaxterRegion("Arena", player, multiworld, level_name, 5) + arena.add_cell_locations([25], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(muse_course) # TODO - What do you need to chase the muse the whole way around? + main_area.connect(zoomer) # Run and jump down. + main_area.connect(ship) # Run and jump. + main_area.connect(lower_approach) # Run and jump. + + # Need to break the bone bridge to access. + main_area.connect(upper_approach, rule=lambda state: can_fight(state, player)) + + muse_course.connect(main_area) # Run and jump down. + + # The zoomer pad is low enough that it requires Crouch Jump specifically. + zoomer.connect(main_area, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) + + ship.connect(main_area) # Run and jump down. + ship.connect(far_side) # Run and jump down. + ship.connect(barrel_course) # Run and jump (dodge barrels). + + far_side.connect(ship) # Run and jump. + far_side.connect(arena) # Run and jump. + + # Only if you can use the seesaw or Crouch Jump from the seesaw's edge. + far_side.connect(far_side_cliff, rule=lambda state: + state.has("Jump Dive", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + + # Only if you can break the bone bridges to carry blue eco over the mud pit. + far_side.connect(far_side_cache, rule=lambda state: can_fight(state, player)) + + far_side_cliff.connect(far_side) # Run and jump down. + + barrel_course.connect(cannon) # Run and jump (dodge barrels). + + cannon.connect(barrel_course) # Run and jump (dodge barrels). + cannon.connect(arena) # Run and jump down. + cannon.connect(upper_approach) # Run and jump down. + + upper_approach.connect(lower_approach) # Jump down. + upper_approach.connect(arena) # Jump down. + + # One cliff is accessible, but only via Crouch Jump. + lower_approach.connect(upper_approach, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) + + # Requires breaking bone bridges. + lower_approach.connect(arena, rule=lambda state: can_fight(state, player)) + + arena.connect(lower_approach) # Run. + arena.connect(far_side) # Run. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(muse_course) + world.level_to_regions[level_name].append(zoomer) + world.level_to_regions[level_name].append(ship) + world.level_to_regions[level_name].append(far_side) + world.level_to_regions[level_name].append(far_side_cliff) + world.level_to_regions[level_name].append(far_side_cache) + world.level_to_regions[level_name].append(barrel_course) + world.level_to_regions[level_name].append(cannon) + world.level_to_regions[level_name].append(upper_approach) + world.level_to_regions[level_name].append(lower_approach) + world.level_to_regions[level_name].append(arena) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(4, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/mountain_pass_regions.py b/worlds/jakanddaxter/regs/mountain_pass_regions.py new file mode 100644 index 0000000000..bd26be8dd2 --- /dev/null +++ b/worlds/jakanddaxter/regs/mountain_pass_regions.py @@ -0,0 +1,67 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import scout_locations as scouts +from worlds.generic.Rules import add_rule + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This is basically just Klaww. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_cell_locations([86]) + + # Some folks prefer firing Yellow Eco from the hip, so optionally put this rule before Klaww. Klaww is the only + # location in main_area, so he's at index 0. + if world.options.require_punch_for_klaww: + add_rule(main_area.locations[0], lambda state: state.has("Punch", player)) + + race = JakAndDaxterRegion("Race", player, multiworld, level_name, 50) + race.add_cell_locations([87]) + + # All scout flies can be broken with the zoomer. + race.add_fly_locations(scouts.locMP_scoutTable.keys()) + + shortcut = JakAndDaxterRegion("Shortcut", player, multiworld, level_name, 0) + shortcut.add_cell_locations([110]) + + # Of course, in order to make it to the race region, you must defeat Klaww. He's not optional. + # So we need to set up this inter-region rule as well (or make it free if the setting is off). + if world.options.require_punch_for_klaww: + main_area.connect(race, rule=lambda state: state.has("Punch", player)) + else: + main_area.connect(race) + + # You actually can go backwards from the race back to Klaww's area. + race.connect(main_area) + race.connect(shortcut, rule=lambda state: state.has("Yellow Eco Switch", player)) + + shortcut.connect(race) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(race) + world.level_to_regions[level_name].append(shortcut) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(10, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Return race required for inter-level connections. + return main_area, race diff --git a/worlds/jakanddaxter/regs/precursor_basin_regions.py b/worlds/jakanddaxter/regs/precursor_basin_regions.py new file mode 100644 index 0000000000..25a109155b --- /dev/null +++ b/worlds/jakanddaxter/regs/precursor_basin_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 200) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locPB_cellTable.keys()) + main_area.add_fly_locations(scouts.locPB_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(9, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/region_base.py b/worlds/jakanddaxter/regs/region_base.py new file mode 100644 index 0000000000..cb1005aa7a --- /dev/null +++ b/worlds/jakanddaxter/regs/region_base.py @@ -0,0 +1,91 @@ +from typing import Iterable +from BaseClasses import MultiWorld, Region +from ..game_id import jak1_name +from ..locations import JakAndDaxterLocation, location_table +from ..locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches) +from worlds.generic.Rules import CollectionRule + + +class JakAndDaxterRegion(Region): + """ + Holds region information such as name, level name, number of orbs available, etc. + We especially need orb counts to be tracked because we need to know when you can + afford the Citizen and Oracle orb payments for more checks. + """ + game: str = jak1_name + level_name: str + orb_count: int + location_count: int = 0 + + def __init__(self, name: str, player: int, multiworld: MultiWorld, level_name: str = "", orb_count: int = 0): + formatted_name = f"{level_name} {name}".strip() + super().__init__(formatted_name, player, multiworld) + self.level_name = level_name + self.orb_count = orb_count + + def add_cell_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Power Cell Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = cells.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_fly_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Scout Fly Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = scouts.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_special_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Special Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + Special Locations should be matched alongside their respective + Power Cell Locations, so you get 2 unlocks for these rather than 1. + """ + for loc in locations: + ap_id = specials.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_cache_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds an Orb Cache Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = caches.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_orb_locations(self, level_index: int, bundle_index: int, access_rule: CollectionRule | None = None) -> None: + """ + Adds Orb Bundle Locations to this region equal to `bundle_count`. Used only when Per-Level Orbsanity is enabled. + The orb factory class will handle AP ID enumeration. + """ + bundle_address = orbs.create_address(level_index, bundle_index) + location = JakAndDaxterLocation(self.player, + f"{self.level_name} Orb Bundle {bundle_index + 1}".strip(), + orbs.to_ap_id(bundle_address), + self) + if access_rule: + location.access_rule = access_rule + self.locations.append(location) + self.location_count += 1 + + def add_jak_location(self, ap_id: int, name: str, access_rule: CollectionRule | None = None) -> None: + """ + Helper function to add Locations. Not to be used directly. + """ + location = JakAndDaxterLocation(self.player, name, ap_id, self) + if access_rule: + location.access_rule = access_rule + self.locations.append(location) + self.location_count += 1 diff --git a/worlds/jakanddaxter/regs/rock_village_regions.py b/worlds/jakanddaxter/regs/rock_village_regions.py new file mode 100644 index 0000000000..2138eb1194 --- /dev/null +++ b/worlds/jakanddaxter/regs/rock_village_regions.py @@ -0,0 +1,75 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This includes most of the area surrounding LPC as well, for orb_count purposes. You can swim and single jump. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 23) + main_area.add_cell_locations([31], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([32], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([33], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([34], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([35], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 34)) + + # These 2 scout fly boxes can be broken by running with nearby blue eco. + main_area.add_fly_locations([196684, 262220]) + main_area.add_fly_locations([76, 131148, 65612, 327756], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Warrior Pontoon check. You just talk to him and get his introduction. + main_area.add_special_locations([33]) + + orb_cache = JakAndDaxterRegion("Orb Cache", player, multiworld, level_name, 20) + + # You need roll jump to be able to reach this before the blue eco runs out. + orb_cache.add_cache_locations([10945], access_rule=lambda state: state.has_all(("Roll", "Roll Jump"), player)) + + # Fly here can be gotten with Yellow Eco from Boggy, goggles, and no extra movement options (see fly ID 43). + pontoon_bridge = JakAndDaxterRegion("Pontoon Bridge", player, multiworld, level_name, 7) + pontoon_bridge.add_fly_locations([393292]) + + klaww_cliff = JakAndDaxterRegion("Klaww's Cliff", player, multiworld, level_name, 0) + + main_area.connect(orb_cache, rule=lambda state: state.has_all(("Roll", "Roll Jump"), player)) + main_area.connect(pontoon_bridge, rule=lambda state: state.has("Warrior's Pontoons", player)) + + orb_cache.connect(main_area) + + pontoon_bridge.connect(main_area, rule=lambda state: state.has("Warrior's Pontoons", player)) + pontoon_bridge.connect(klaww_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + klaww_cliff.connect(pontoon_bridge) # Just jump back down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(orb_cache) + world.level_to_regions[level_name].append(pontoon_bridge) + world.level_to_regions[level_name].append(klaww_cliff) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(6, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Return klaww_cliff required for inter-level connections. + return main_area, pontoon_bridge, klaww_cliff diff --git a/worlds/jakanddaxter/regs/sandover_village_regions.py b/worlds/jakanddaxter/regs/sandover_village_regions.py new file mode 100644 index 0000000000..3969cdb41a --- /dev/null +++ b/worlds/jakanddaxter/regs/sandover_village_regions.py @@ -0,0 +1,83 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 26) + + # Yakows requires no combat. + main_area.add_cell_locations([10]) + main_area.add_cell_locations([11], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([12], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + + # These 4 scout fly boxes can be broken by running with all the blue eco from Sentinel Beach. + main_area.add_fly_locations([262219, 327755, 131147, 65611]) + + # The farmer's scout fly. You can either get the Orb Cache Cliff blue eco, or break it normally. + main_area.add_fly_locations([196683], access_rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or can_free_scout_flies(state, player)) + + orb_cache_cliff = JakAndDaxterRegion("Orb Cache Cliff", player, multiworld, level_name, 15) + orb_cache_cliff.add_cache_locations([10344]) + + yakow_cliff = JakAndDaxterRegion("Yakow Cliff", player, multiworld, level_name, 3) + yakow_cliff.add_fly_locations([75], access_rule=lambda state: can_free_scout_flies(state, player)) + + oracle_platforms = JakAndDaxterRegion("Oracle Platforms", player, multiworld, level_name, 6) + oracle_platforms.add_cell_locations([13], access_rule=lambda state: + world.can_trade(state, world.total_trade_orbs, None)) + oracle_platforms.add_cell_locations([14], access_rule=lambda state: + world.can_trade(state, world.total_trade_orbs, 13)) + oracle_platforms.add_fly_locations([393291], access_rule=lambda state: + can_free_scout_flies(state, player)) + + main_area.connect(orb_cache_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + main_area.connect(yakow_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + main_area.connect(oracle_platforms, rule=lambda state: + state.has_all(("Roll", "Roll Jump"), player) + or state.has_all(("Double Jump", "Jump Kick"), player)) + + # All these can go back to main_area immediately. + orb_cache_cliff.connect(main_area) + yakow_cliff.connect(main_area) + oracle_platforms.connect(main_area) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(orb_cache_cliff) + world.level_to_regions[level_name].append(yakow_cliff) + world.level_to_regions[level_name].append(oracle_platforms) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(1, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/sentinel_beach_regions.py b/worlds/jakanddaxter/regs/sentinel_beach_regions.py new file mode 100644 index 0000000000..293215ea82 --- /dev/null +++ b/worlds/jakanddaxter/regs/sentinel_beach_regions.py @@ -0,0 +1,108 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 128) + main_area.add_cell_locations([18, 21, 22]) + + # These scout fly boxes can be broken by running with freely accessible blue eco. + # The 3 clusters by the Flut Flut egg can go surprisingly far. + main_area.add_fly_locations([327700, 20, 65556, 262164]) + + # This scout fly box can be broken with the locked blue eco vent, or by normal combat tricks. + main_area.add_fly_locations([393236], access_rule=lambda state: + state.has("Blue Eco Switch", player) + or can_free_scout_flies(state, player)) + + # No need for the blue eco vent for either of the orb caches. + main_area.add_cache_locations([12634, 12635]) + + pelican = JakAndDaxterRegion("Pelican", player, multiworld, level_name, 0) + pelican.add_cell_locations([16], access_rule=lambda state: can_fight(state, player)) + + # Only these specific attacks can push the flut flut egg off the cliff. + flut_flut_egg = JakAndDaxterRegion("Flut Flut Egg", player, multiworld, level_name, 0) + flut_flut_egg.add_cell_locations([17], access_rule=lambda state: + state.has_any(("Punch", "Kick", "Jump Kick"), player)) + flut_flut_egg.add_special_locations([17], access_rule=lambda state: + state.has_any(("Punch", "Kick", "Jump Kick"), player)) + + eco_harvesters = JakAndDaxterRegion("Eco Harvesters", player, multiworld, level_name, 0) + eco_harvesters.add_cell_locations([15], access_rule=lambda state: can_fight(state, player)) + + green_ridge = JakAndDaxterRegion("Ridge Near Green Vents", player, multiworld, level_name, 5) + green_ridge.add_fly_locations([131092], access_rule=lambda state: can_free_scout_flies(state, player)) + + blue_ridge = JakAndDaxterRegion("Ridge Near Blue Vent", player, multiworld, level_name, 5) + blue_ridge.add_fly_locations([196628], access_rule=lambda state: + state.has("Blue Eco Switch", player) + or can_free_scout_flies(state, player)) + + cannon_tower = JakAndDaxterRegion("Cannon Tower", player, multiworld, level_name, 12) + cannon_tower.add_cell_locations([19], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(pelican) # Swim and jump. + main_area.connect(flut_flut_egg) # Run and jump. + main_area.connect(eco_harvesters) # Run. + + # We need a helper function for the uppercut logs. + def can_uppercut_and_jump_logs(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + and (state.has_all(("Crouch", "Crouch Uppercut"), p) + or state.has_all(("Punch", "Punch Uppercut"), p))) + + # If you have double jump or crouch jump, you don't need the logs to reach this place. + main_area.connect(green_ridge, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or can_uppercut_and_jump_logs(state, player)) + + # If you have the blue eco jump pad, you don't need the logs to reach this place. + main_area.connect(blue_ridge, rule=lambda state: + state.has("Blue Eco Switch", player) + or can_uppercut_and_jump_logs(state, player)) + + main_area.connect(cannon_tower, rule=lambda state: state.has("Blue Eco Switch", player)) + + # All these can go back to main_area immediately. + pelican.connect(main_area) + flut_flut_egg.connect(main_area) + eco_harvesters.connect(main_area) + green_ridge.connect(main_area) + blue_ridge.connect(main_area) + cannon_tower.connect(main_area) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(pelican) + world.level_to_regions[level_name].append(flut_flut_egg) + world.level_to_regions[level_name].append(eco_harvesters) + world.level_to_regions[level_name].append(green_ridge) + world.level_to_regions[level_name].append(blue_ridge) + world.level_to_regions[level_name].append(cannon_tower) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(2, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/snowy_mountain_regions.py b/worlds/jakanddaxter/regs/snowy_mountain_regions.py new file mode 100644 index 0000000000..5adc3e9d22 --- /dev/null +++ b/worlds/jakanddaxter/regs/snowy_mountain_regions.py @@ -0,0 +1,203 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +# God help me... here we go. +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # We need a few helper functions. + def can_cross_long_gap(state: CollectionState, p: int) -> bool: + return (state.has_all(("Roll", "Roll Jump"), p) + or state.has_all(("Double Jump", "Jump Kick"), p)) + + def can_jump_blockers(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_fly_locations([65], access_rule=lambda state: can_free_scout_flies(state, player)) + + # We need a few virtual regions like we had for Dark Crystals in Spider Cave. + # First, a virtual region for the glacier lurkers. + glacier_lurkers = JakAndDaxterRegion("Glacier Lurkers", player, multiworld, level_name, 0) + + # Need to fight all the troops. + # Troop in snowball_canyon: cross main_area. + # Troop in ice_skating_rink: cross main_area and fort_exterior. + # Troop in fort_exterior: cross main_area and fort_exterior. + glacier_lurkers.add_cell_locations([61], access_rule=lambda state: + can_fight(state, player) + and can_cross_long_gap(state, player)) + + # Second, a virtual region for the precursor blockers. Unlike the others, this contains orbs: + # the total number of orbs that sit on top of the blockers. Yes, there are only 8. + blockers = JakAndDaxterRegion("Precursor Blockers", player, multiworld, level_name, 8) + + # 1 in main_area + # 2 in snowball_canyon + # 4 in ice_skating_rink + # 3 in fort_exterior + # 3 in bunny_cave_start + blockers.add_cell_locations([66], access_rule=lambda state: + can_fight(state, player) + and can_cross_long_gap(state, player)) + + snowball_canyon = JakAndDaxterRegion("Snowball Canyon", player, multiworld, level_name, 28) + + # The scout fly box *can* be broken without YES, so leave it in this region. + frozen_box_cave = JakAndDaxterRegion("Frozen Box Cave", player, multiworld, level_name, 12) + frozen_box_cave.add_fly_locations([327745], access_rule=lambda state: + state.has("Yellow Eco Switch", player) + or can_free_scout_flies(state, player)) + + # This region has crates that can *only* be broken with YES. + frozen_box_cave_crates = JakAndDaxterRegion("Frozen Box Cave Orb Crates", player, multiworld, level_name, 8) + frozen_box_cave_crates.add_cell_locations([67], access_rule=lambda state: + state.has("Yellow Eco Switch", player)) + + # Include 6 orbs on the twin elevator ice ramp. + ice_skating_rink = JakAndDaxterRegion("Ice Skating Rink", player, multiworld, level_name, 20) + ice_skating_rink.add_fly_locations([131137], access_rule=lambda state: can_free_scout_flies(state, player)) + + flut_flut_course = JakAndDaxterRegion("Flut Flut Course", player, multiworld, level_name, 15) + flut_flut_course.add_cell_locations([63], access_rule=lambda state: state.has("Flut Flut", player)) + flut_flut_course.add_special_locations([63], access_rule=lambda state: state.has("Flut Flut", player)) + + # Includes the bridge from snowball_canyon, the area beneath that bridge, and the areas around the fort. + fort_exterior = JakAndDaxterRegion("Fort Exterior", player, multiworld, level_name, 20) + fort_exterior.add_fly_locations([65601, 393281], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Includes the icy island and bridge outside the cave entrance. + bunny_cave_start = JakAndDaxterRegion("Bunny Cave (Start)", player, multiworld, level_name, 10) + + # Includes the cell and 3 orbs at the exit. + bunny_cave_end = JakAndDaxterRegion("Bunny Cave (End)", player, multiworld, level_name, 3) + bunny_cave_end.add_cell_locations([64]) + + switch_cave = JakAndDaxterRegion("Yellow Eco Switch Cave", player, multiworld, level_name, 4) + switch_cave.add_cell_locations([60]) + switch_cave.add_special_locations([60]) + + # Only what can be covered by single jump. + fort_interior = JakAndDaxterRegion("Fort Interior (Main)", player, multiworld, level_name, 19) + + # Reaching the top of the watch tower, getting the fly with the blue eco, and falling down to get the caches. + fort_interior_caches = JakAndDaxterRegion("Fort Interior (Caches)", player, multiworld, level_name, 51) + fort_interior_caches.add_fly_locations([196673]) + fort_interior_caches.add_cache_locations([23348, 23349, 23350]) + + # Need higher jump. + fort_interior_base = JakAndDaxterRegion("Fort Interior (Base)", player, multiworld, level_name, 0) + fort_interior_base.add_fly_locations([262209], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Need farther jump. + fort_interior_course_end = JakAndDaxterRegion("Fort Interior (Course End)", player, multiworld, level_name, 2) + fort_interior_course_end.add_cell_locations([62]) + + # Wire up the virtual regions first. + main_area.connect(blockers, rule=lambda state: can_jump_blockers(state, player)) + main_area.connect(glacier_lurkers, rule=lambda state: can_fight(state, player)) + + # Yes, the only way into the rest of the level requires advanced movement. + main_area.connect(snowball_canyon, rule=lambda state: can_cross_long_gap(state, player)) + + snowball_canyon.connect(main_area) # But you can just jump down and run up the ramp. + snowball_canyon.connect(bunny_cave_start) # Jump down from the glacier troop cliff. + snowball_canyon.connect(fort_exterior) # Jump down, to the left of frozen box cave. + snowball_canyon.connect(frozen_box_cave, rule=lambda state: # More advanced movement. + can_cross_long_gap(state, player)) + + frozen_box_cave.connect(snowball_canyon, rule=lambda state: # Same movement to go back. + can_cross_long_gap(state, player)) + frozen_box_cave.connect(frozen_box_cave_crates, rule=lambda state: # YES to get these crates. + state.has("Yellow Eco Switch", player)) + frozen_box_cave.connect(ice_skating_rink, rule=lambda state: # Same movement to go forward. + can_cross_long_gap(state, player)) + + frozen_box_cave_crates.connect(frozen_box_cave) # Semi-virtual region, no moves req'd. + + ice_skating_rink.connect(frozen_box_cave, rule=lambda state: # Same movement to go back. + can_cross_long_gap(state, player)) + ice_skating_rink.connect(flut_flut_course, rule=lambda state: # Duh. + state.has("Flut Flut", player)) + ice_skating_rink.connect(fort_exterior) # Just slide down the elevator ramp. + + fort_exterior.connect(ice_skating_rink, rule=lambda state: # Twin elevators OR scout fly ledge. + can_cross_long_gap(state, player)) # Both doable with main_gap logic. + fort_exterior.connect(snowball_canyon) # Run across bridge. + fort_exterior.connect(fort_interior, rule=lambda state: # Duh. + state.has("Snowy Fort Gate", player)) + fort_exterior.connect(bunny_cave_start) # Run across bridge. + fort_exterior.connect(switch_cave, rule=lambda state: # Yes, blocker jumps work here. + can_jump_blockers(state, player)) + + fort_interior.connect(fort_interior_caches, rule=lambda state: # Just need a little height. + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + fort_interior.connect(fort_interior_base, rule=lambda state: # Just need a little height. + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + fort_interior.connect(fort_interior_course_end, rule=lambda state: # Just need a little distance. + state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player)) + + flut_flut_course.connect(fort_exterior) # Ride the elevator. + + # Must fight way through cave, but there is also a grab-less ledge we must jump over. + bunny_cave_start.connect(bunny_cave_end, rule=lambda state: + can_fight(state, player) + and (state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player))) + + # All jump down. + fort_interior_caches.connect(fort_interior) + fort_interior_base.connect(fort_interior) + fort_interior_course_end.connect(fort_interior) + switch_cave.connect(fort_exterior) + bunny_cave_end.connect(fort_exterior) + + # I really hope that is everything. + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(glacier_lurkers) + world.level_to_regions[level_name].append(blockers) + world.level_to_regions[level_name].append(snowball_canyon) + world.level_to_regions[level_name].append(frozen_box_cave) + world.level_to_regions[level_name].append(frozen_box_cave_crates) + world.level_to_regions[level_name].append(ice_skating_rink) + world.level_to_regions[level_name].append(flut_flut_course) + world.level_to_regions[level_name].append(fort_exterior) + world.level_to_regions[level_name].append(bunny_cave_start) + world.level_to_regions[level_name].append(bunny_cave_end) + world.level_to_regions[level_name].append(switch_cave) + world.level_to_regions[level_name].append(fort_interior) + world.level_to_regions[level_name].append(fort_interior_caches) + world.level_to_regions[level_name].append(fort_interior_base) + world.level_to_regions[level_name].append(fort_interior_course_end) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(12, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/spider_cave_regions.py b/worlds/jakanddaxter/regs/spider_cave_regions.py new file mode 100644 index 0000000000..6069bbb80c --- /dev/null +++ b/worlds/jakanddaxter/regs/spider_cave_regions.py @@ -0,0 +1,127 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # A large amount of this area can be covered by single jump, floating platforms, web trampolines, and goggles. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 63) + main_area.add_cell_locations([78, 84]) + main_area.add_fly_locations([327765, 393301, 196693, 131157]) + + # This is a virtual region describing what you need to DO to get the Dark Crystal power cell, + # rather than describing where each of the crystals ARE, because you can destroy them in any order, + # and you need to destroy ALL of them to get the cell. + dark_crystals = JakAndDaxterRegion("Dark Crystals", player, multiworld, level_name, 0) + + # can_fight = The underwater crystal in dark cave. + # Roll Jump = The underwater crystal across a long dark eco pool. + # The rest of the crystals can be destroyed with yellow eco in main_area. + dark_crystals.add_cell_locations([79], access_rule=lambda state: + can_fight(state, player) + and state.has_all(("Roll", "Roll Jump"), player)) + + dark_cave = JakAndDaxterRegion("Dark Cave", player, multiworld, level_name, 5) + dark_cave.add_cell_locations([80]) + dark_cave.add_fly_locations([262229], access_rule=lambda state: can_free_scout_flies(state, player)) + + robot_cave = JakAndDaxterRegion("Robot Cave", player, multiworld, level_name, 0) + + # Need double jump for orbs. + scaffolding_level_zero = JakAndDaxterRegion("Robot Scaffolding Level 0", player, multiworld, level_name, 12) + + scaffolding_level_one = JakAndDaxterRegion("Robot Scaffolding Level 1", player, multiworld, level_name, 53) + scaffolding_level_one.add_fly_locations([85]) # Shootable. + + scaffolding_level_two = JakAndDaxterRegion("Robot Scaffolding Level 2", player, multiworld, level_name, 4) + + # Using the blue eco from the pole course, you can single jump to the scout fly up here. + scaffolding_level_three = JakAndDaxterRegion("Robot Scaffolding Level 3", player, multiworld, level_name, 29) + scaffolding_level_three.add_cell_locations([81]) + scaffolding_level_three.add_fly_locations([65621]) + + pole_course = JakAndDaxterRegion("Pole Course", player, multiworld, level_name, 18) + pole_course.add_cell_locations([82]) + + # You only need combat to fight through the spiders, but to collect the orb crates, + # you will need the yellow eco vent unlocked. + spider_tunnel = JakAndDaxterRegion("Spider Tunnel", player, multiworld, level_name, 4) + spider_tunnel.add_cell_locations([83]) + + spider_tunnel_crates = JakAndDaxterRegion("Spider Tunnel Orb Crates", player, multiworld, level_name, 12) + + main_area.connect(dark_crystals) + main_area.connect(robot_cave) + main_area.connect(dark_cave, rule=lambda state: + can_fight(state, player) + and (state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player))) + + robot_cave.connect(main_area) + robot_cave.connect(pole_course) # Nothing special required. + robot_cave.connect(scaffolding_level_one) # Ramps lead to level 1. + robot_cave.connect(spider_tunnel) # Web trampolines (bounce twice on each to gain momentum). + + pole_course.connect(robot_cave) # Blue eco platform down. + + scaffolding_level_one.connect(robot_cave) # All scaffolding (level 1+) connects back by jumping down. + + # Elevator, but the orbs need double jump or jump kick. + scaffolding_level_one.connect(scaffolding_level_zero, rule=lambda state: + state.has_any(("Double Jump", "Jump Kick"), player)) + + # Narrow enough that enemies are unavoidable. + scaffolding_level_one.connect(scaffolding_level_two, rule=lambda state: can_fight(state, player)) + + scaffolding_level_zero.connect(scaffolding_level_one) # Elevator. + + scaffolding_level_two.connect(robot_cave) # Jump down. + scaffolding_level_two.connect(scaffolding_level_one) # Elevator. + + # Elevator, but narrow enough that enemies are unavoidable. + scaffolding_level_two.connect(scaffolding_level_three, rule=lambda state: can_fight(state, player)) + + scaffolding_level_three.connect(robot_cave) # Jump down. + scaffolding_level_three.connect(scaffolding_level_two) # Elevator. + + spider_tunnel.connect(robot_cave) # Back to web trampolines. + spider_tunnel.connect(main_area) # Escape with jump pad. + + # Requires yellow eco switch. + spider_tunnel.connect(spider_tunnel_crates, rule=lambda state: state.has("Yellow Eco Switch", player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(dark_crystals) + world.level_to_regions[level_name].append(dark_cave) + world.level_to_regions[level_name].append(robot_cave) + world.level_to_regions[level_name].append(scaffolding_level_zero) + world.level_to_regions[level_name].append(scaffolding_level_one) + world.level_to_regions[level_name].append(scaffolding_level_two) + world.level_to_regions[level_name].append(scaffolding_level_three) + world.level_to_regions[level_name].append(pole_course) + world.level_to_regions[level_name].append(spider_tunnel) + world.level_to_regions[level_name].append(spider_tunnel_crates) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(13, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/volcanic_crater_regions.py b/worlds/jakanddaxter/regs/volcanic_crater_regions.py new file mode 100644 index 0000000000..47bfccfd2b --- /dev/null +++ b/worlds/jakanddaxter/regs/volcanic_crater_regions.py @@ -0,0 +1,52 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level +from ..locs import scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # No area is inaccessible in VC even with only running and jumping. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + main_area.add_cell_locations([96], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([97], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 96)) + main_area.add_cell_locations([98], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 97)) + main_area.add_cell_locations([99], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 98)) + main_area.add_cell_locations([100], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([101], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 100)) + + # Hidden Power Cell: you can carry yellow eco from Spider Cave just by running and jumping + # and using your Goggles to shoot the box (you do not need Punch to shoot from FP mode). + main_area.add_cell_locations([74]) + + # No blue eco sources in this area, all boxes must be broken by hand (yellow eco can't be carried far enough). + main_area.add_fly_locations(scouts.locVC_scoutTable.keys(), access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Approach the gondola to get this check. + main_area.add_special_locations([105]) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(11, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/requirements.txt b/worlds/jakanddaxter/requirements.txt new file mode 100644 index 0000000000..ca36764fbf --- /dev/null +++ b/worlds/jakanddaxter/requirements.txt @@ -0,0 +1 @@ +Pymem>=1.13.0 diff --git a/worlds/jakanddaxter/rules.py b/worlds/jakanddaxter/rules.py new file mode 100644 index 0000000000..71b94df885 --- /dev/null +++ b/worlds/jakanddaxter/rules.py @@ -0,0 +1,230 @@ +import typing +from BaseClasses import CollectionState +from Options import OptionError +from .options import (EnableOrbsanity, + GlobalOrbsanityBundleSize, + PerLevelOrbsanityBundleSize, + FireCanyonCellCount, + MountainPassCellCount, + LavaTubeCellCount, + CitizenOrbTradeAmount, + OracleOrbTradeAmount) +from .locs import cell_locations as cells +from .locations import location_table +from .levels import level_table + +if typing.TYPE_CHECKING: + from . import JakAndDaxterWorld + + +def set_orb_trade_rule(world: "JakAndDaxterWorld"): + options = world.options + player = world.player + + if options.enable_orbsanity == EnableOrbsanity.option_off: + world.can_trade = lambda state, required_orbs, required_previous_trade: ( + can_trade_vanilla(state, player, world, required_orbs, required_previous_trade)) + else: + world.can_trade = lambda state, required_orbs, required_previous_trade: ( + can_trade_orbsanity(state, player, world, required_orbs, required_previous_trade)) + + +def recalculate_reachable_orbs(state: CollectionState, player: int, world: "JakAndDaxterWorld") -> None: + + # Recalculate every level, every time the cache is stale, because you don't know + # when a specific bundle of orbs in one level may unlock access to another. + accessible_total_orbs = 0 + for level in level_table: + accessible_level_orbs = count_reachable_orbs_level(state, world, level) + accessible_total_orbs += accessible_level_orbs + state.prog_items[player][f"{level} Reachable Orbs".lstrip()] = accessible_level_orbs + + # Also recalculate the global count, still used even when Orbsanity is Off. + state.prog_items[player]["Reachable Orbs"] = accessible_total_orbs + state.prog_items[player]["Reachable Orbs Fresh"] = True + + +def count_reachable_orbs_global(state: CollectionState, + world: "JakAndDaxterWorld") -> int: + + accessible_orbs = 0 + for level_regions in world.level_to_orb_regions.values(): + for region in level_regions: + if region.can_reach(state): + accessible_orbs += region.orb_count + return accessible_orbs + + +def count_reachable_orbs_level(state: CollectionState, + world: "JakAndDaxterWorld", + level_name: str = "") -> int: + + accessible_orbs = 0 + for region in world.level_to_orb_regions[level_name]: + if region.can_reach(state): + accessible_orbs += region.orb_count + return accessible_orbs + + +def can_reach_orbs_global(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + orb_amount: int) -> bool: + + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + return state.has("Reachable Orbs", player, orb_amount) + + +def can_reach_orbs_level(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + level_name: str, + orb_amount: int) -> bool: + + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + return state.has(f"{level_name} Reachable Orbs", player, orb_amount) + + +def can_trade_vanilla(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + required_orbs: int, + required_previous_trade: typing.Optional[int] = None) -> bool: + + # With Orbsanity Off, Reachable Orbs are in fact Tradeable Orbs. + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + if required_previous_trade: + name_of_previous_trade = location_table[cells.to_ap_id(required_previous_trade)] + return (state.has("Reachable Orbs", player, required_orbs) + and state.can_reach_location(name_of_previous_trade, player=player)) + return state.has("Reachable Orbs", player, required_orbs) + + +def can_trade_orbsanity(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + required_orbs: int, + required_previous_trade: typing.Optional[int] = None) -> bool: + + # Yes, even Orbsanity trades may unlock access to new Reachable Orbs. + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + if required_previous_trade: + name_of_previous_trade = location_table[cells.to_ap_id(required_previous_trade)] + return (state.has("Tradeable Orbs", player, required_orbs) + and state.can_reach_location(name_of_previous_trade, player=player)) + return state.has("Tradeable Orbs", player, required_orbs) + + +def can_free_scout_flies(state: CollectionState, player: int) -> bool: + return state.has("Jump Dive", player) or state.has_all({"Crouch", "Crouch Uppercut"}, player) + + +def can_fight(state: CollectionState, player: int) -> bool: + return state.has_any(("Jump Dive", "Jump Kick", "Punch", "Kick"), player) + + +def enforce_multiplayer_limits(world: "JakAndDaxterWorld"): + options = world.options + friendly_message = "" + + if (options.enable_orbsanity == EnableOrbsanity.option_global + and (options.global_orbsanity_bundle_size.value < GlobalOrbsanityBundleSize.friendly_minimum + or options.global_orbsanity_bundle_size.value > GlobalOrbsanityBundleSize.friendly_maximum)): + friendly_message += (f" " + f"{options.global_orbsanity_bundle_size.display_name} must be no less than " + f"{GlobalOrbsanityBundleSize.friendly_minimum} and no greater than " + f"{GlobalOrbsanityBundleSize.friendly_maximum} (currently " + f"{options.global_orbsanity_bundle_size.value}).\n") + + if (options.enable_orbsanity == EnableOrbsanity.option_per_level + and options.level_orbsanity_bundle_size.value < PerLevelOrbsanityBundleSize.friendly_minimum): + friendly_message += (f" " + f"{options.level_orbsanity_bundle_size.display_name} must be no less than " + f"{PerLevelOrbsanityBundleSize.friendly_minimum} (currently " + f"{options.level_orbsanity_bundle_size.value}).\n") + + if options.fire_canyon_cell_count.value > FireCanyonCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.fire_canyon_cell_count.display_name} must be no greater than " + f"{FireCanyonCellCount.friendly_maximum} (currently " + f"{options.fire_canyon_cell_count.value}).\n") + + if options.mountain_pass_cell_count.value > MountainPassCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.mountain_pass_cell_count.display_name} must be no greater than " + f"{MountainPassCellCount.friendly_maximum} (currently " + f"{options.mountain_pass_cell_count.value}).\n") + + if options.lava_tube_cell_count.value > LavaTubeCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.lava_tube_cell_count.display_name} must be no greater than " + f"{LavaTubeCellCount.friendly_maximum} (currently " + f"{options.lava_tube_cell_count.value}).\n") + + if options.citizen_orb_trade_amount.value > CitizenOrbTradeAmount.friendly_maximum: + friendly_message += (f" " + f"{options.citizen_orb_trade_amount.display_name} must be no greater than " + f"{CitizenOrbTradeAmount.friendly_maximum} (currently " + f"{options.citizen_orb_trade_amount.value}).\n") + + if options.oracle_orb_trade_amount.value > OracleOrbTradeAmount.friendly_maximum: + friendly_message += (f" " + f"{options.oracle_orb_trade_amount.display_name} must be no greater than " + f"{OracleOrbTradeAmount.friendly_maximum} (currently " + f"{options.oracle_orb_trade_amount.value}).\n") + + if friendly_message != "": + raise OptionError(f"{world.player_name}: The options you have chosen may disrupt the multiworld. \n" + f"Please adjust the following Options for a multiplayer game. \n" + f"{friendly_message}" + f"Or use 'random-range-x-y' instead of 'random' in your player yaml.\n" + f"Or set 'enforce_friendly_options' in the seed generator's host.yaml to false. " + f"(Use at your own risk!)") + + +def enforce_singleplayer_limits(world: "JakAndDaxterWorld"): + options = world.options + friendly_message = "" + + if options.fire_canyon_cell_count.value > FireCanyonCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.fire_canyon_cell_count.display_name} must be no greater than " + f"{FireCanyonCellCount.friendly_maximum} (currently " + f"{options.fire_canyon_cell_count.value}).\n") + + if options.mountain_pass_cell_count.value > MountainPassCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.mountain_pass_cell_count.display_name} must be no greater than " + f"{MountainPassCellCount.friendly_maximum} (currently " + f"{options.mountain_pass_cell_count.value}).\n") + + if options.lava_tube_cell_count.value > LavaTubeCellCount.friendly_maximum: + friendly_message += (f" " + f"{options.lava_tube_cell_count.display_name} must be no greater than " + f"{LavaTubeCellCount.friendly_maximum} (currently " + f"{options.lava_tube_cell_count.value}).\n") + + if friendly_message != "": + raise OptionError(f"The options you have chosen may result in seed generation failures. \n" + f"Please adjust the following Options for a singleplayer game. \n" + f"{friendly_message}" + f"Or use 'random-range-x-y' instead of 'random' in your player yaml.\n" + f"Or set 'enforce_friendly_options' in your host.yaml to false. " + f"(Use at your own risk!)") + + +def verify_orb_trade_amounts(world: "JakAndDaxterWorld"): + + if world.total_trade_orbs > 2000: + raise OptionError(f"{world.player_name}: Required number of orbs for all trades ({world.total_trade_orbs}) " + f"is more than all the orbs in the game (2000). Reduce the value of either " + f"{world.options.citizen_orb_trade_amount.display_name} " + f"or {world.options.oracle_orb_trade_amount.display_name}.") diff --git a/worlds/jakanddaxter/test/__init__.py b/worlds/jakanddaxter/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/test/bases.py b/worlds/jakanddaxter/test/bases.py new file mode 100644 index 0000000000..73d18b80bf --- /dev/null +++ b/worlds/jakanddaxter/test/bases.py @@ -0,0 +1,107 @@ +from worlds.jakanddaxter import JakAndDaxterWorld +from ..game_id import jak1_name +from test.bases import WorldTestBase + + +class JakAndDaxterTestBase(WorldTestBase): + game = jak1_name + world: JakAndDaxterWorld + + level_info = { + "Geyser Rock": { + "cells": 4, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Sandover Village": { + "cells": 6, + "flies": 7, + "orbs": 50, + "caches": 1, + }, + "Forbidden Jungle": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 1, + }, + "Sentinel Beach": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 2, + }, + "Misty Island": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 1, + }, + "Fire Canyon": { + "cells": 2, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Rock Village": { + "cells": 6, + "flies": 7, + "orbs": 50, + "caches": 1, + }, + "Precursor Basin": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Lost Precursor City": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 2, + }, + "Boggy Swamp": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Mountain Pass": { + "cells": 4, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Volcanic Crater": { + "cells": 8, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Spider Cave": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Snowy Mountain": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 3, + }, + "Lava Tube": { + "cells": 2, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Gol and Maia's Citadel": { + "cells": 5, + "flies": 7, + "orbs": 200, + "caches": 3, + }, + } diff --git a/worlds/jakanddaxter/test/test_locations.py b/worlds/jakanddaxter/test/test_locations.py new file mode 100644 index 0000000000..1d47066b93 --- /dev/null +++ b/worlds/jakanddaxter/test/test_locations.py @@ -0,0 +1,52 @@ +import typing + +from .bases import JakAndDaxterTestBase +from ..game_id import jak1_id +from ..regs.region_base import JakAndDaxterRegion +from ..locs import (scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches, + orb_locations as orbs) + + +class LocationsTest(JakAndDaxterTestBase): + + def get_regions(self): + return [typing.cast(JakAndDaxterRegion, reg) for reg in self.multiworld.get_regions(self.player)] + + def test_count_cells(self): + + for level in self.level_info: + cell_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id, jak1_id + scouts.fly_offset): + cell_count += 1 + self.assertEqual(self.level_info[level]["cells"] - 1, cell_count, level) # Don't count the Free 7 Cells. + + def test_count_flies(self): + for level in self.level_info: + fly_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id + scouts.fly_offset, jak1_id + specials.special_offset): + fly_count += 1 + self.assertEqual(self.level_info[level]["flies"], fly_count, level) + + def test_count_orbs(self): + for level in self.level_info: + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + orb_count = sum([reg.orb_count for reg in sublevels]) + self.assertEqual(self.level_info[level]["orbs"], orb_count, level) + + def test_count_caches(self): + for level in self.level_info: + cache_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + cache_count += 1 + self.assertEqual(self.level_info[level]["caches"], cache_count, level) diff --git a/worlds/jakanddaxter/test/test_moverando.py b/worlds/jakanddaxter/test/test_moverando.py new file mode 100644 index 0000000000..d912d43af8 --- /dev/null +++ b/worlds/jakanddaxter/test/test_moverando.py @@ -0,0 +1,32 @@ +from .bases import JakAndDaxterTestBase +from ..items import move_item_table + + +class MoveRandoTest(JakAndDaxterTestBase): + options = { + "enable_move_randomizer": True + } + + def test_move_items_in_pool(self): + for move in move_item_table: + self.assertIn(move_item_table[move], {item.name for item in self.multiworld.itempool}) + self.assertNotIn(move_item_table[move], + {item.name for item in self.multiworld.precollected_items[self.player]}) + + def test_cannot_reach_without_move(self): + self.assertAccessDependency( + ["GR: Climb Up The Cliff"], + [["Double Jump"], ["Crouch"]], + only_check_listed=True) + + +class NoMoveRandoTest(JakAndDaxterTestBase): + options = { + "enable_move_randomizer": False + } + + def test_move_items_in_inventory(self): + for move in move_item_table: + self.assertNotIn(move_item_table[move], {item.name for item in self.multiworld.itempool}) + self.assertIn(move_item_table[move], + {item.name for item in self.multiworld.precollected_items[self.player]}) diff --git a/worlds/jakanddaxter/test/test_orbsanity.py b/worlds/jakanddaxter/test/test_orbsanity.py new file mode 100644 index 0000000000..5f871c8552 --- /dev/null +++ b/worlds/jakanddaxter/test/test_orbsanity.py @@ -0,0 +1,61 @@ +from .bases import JakAndDaxterTestBase +from ..items import orb_item_table + + +class NoOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 0, # Off + "level_orbsanity_bundle_size": 25, + "global_orbsanity_bundle_size": 16 + } + + def test_orb_bundles_not_exist_in_pool(self): + for bundle in orb_item_table: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["level_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(0, count) + + bundle_name = orb_item_table[self.options["global_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(0, count) + + +class PerLevelOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 1, # Per Level + "level_orbsanity_bundle_size": 25 + } + + def test_orb_bundles_exist_in_pool(self): + for bundle in orb_item_table: + if bundle == self.options["level_orbsanity_bundle_size"]: + self.assertIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + else: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["level_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(80, count) + + +class GlobalOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, # Global + "global_orbsanity_bundle_size": 16 + } + + def test_orb_bundles_exist_in_pool(self): + for bundle in orb_item_table: + if bundle == self.options["global_orbsanity_bundle_size"]: + self.assertIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + else: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["global_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(125, count) diff --git a/worlds/jakanddaxter/test/test_orderedcellcounts.py b/worlds/jakanddaxter/test/test_orderedcellcounts.py new file mode 100644 index 0000000000..7ad0d76ca5 --- /dev/null +++ b/worlds/jakanddaxter/test/test_orderedcellcounts.py @@ -0,0 +1,29 @@ +from .bases import JakAndDaxterTestBase + + +class ReorderedCellCountsTest(JakAndDaxterTestBase): + options = { + "enable_ordered_cell_counts": True, + "fire_canyon_cell_count": 20, + "mountain_pass_cell_count": 15, + "lava_tube_cell_count": 10, + } + + def test_reordered_cell_counts(self): + self.world.generate_early() + self.assertLessEqual(self.world.options.fire_canyon_cell_count, self.world.options.mountain_pass_cell_count) + self.assertLessEqual(self.world.options.mountain_pass_cell_count, self.world.options.lava_tube_cell_count) + + +class UnorderedCellCountsTest(JakAndDaxterTestBase): + options = { + "enable_ordered_cell_counts": False, + "fire_canyon_cell_count": 20, + "mountain_pass_cell_count": 15, + "lava_tube_cell_count": 10, + } + + def test_unordered_cell_counts(self): + self.world.generate_early() + self.assertGreaterEqual(self.world.options.fire_canyon_cell_count, self.world.options.mountain_pass_cell_count) + self.assertGreaterEqual(self.world.options.mountain_pass_cell_count, self.world.options.lava_tube_cell_count) diff --git a/worlds/jakanddaxter/test/test_trades.py b/worlds/jakanddaxter/test/test_trades.py new file mode 100644 index 0000000000..e1d1a2e53d --- /dev/null +++ b/worlds/jakanddaxter/test/test_trades.py @@ -0,0 +1,39 @@ +from .bases import JakAndDaxterTestBase + + +class TradesCostNothingTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, + "global_orbsanity_bundle_size": 5, + "citizen_orb_trade_amount": 0, + "oracle_orb_trade_amount": 0 + } + + def test_orb_items_are_filler(self): + self.collect_all_but("") + self.assertNotIn("5 Precursor Orbs", self.multiworld.state.prog_items) + + def test_trades_are_accessible(self): + self.assertTrue(self.multiworld + .get_location("SV: Bring 90 Orbs To The Mayor", self.player) + .can_reach(self.multiworld.state)) + + +class TradesCostEverythingTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, + "global_orbsanity_bundle_size": 5, + "citizen_orb_trade_amount": 120, + "oracle_orb_trade_amount": 150 + } + + def test_orb_items_are_progression(self): + self.collect_all_but("") + self.assertIn("5 Precursor Orbs", self.multiworld.state.prog_items[self.player]) + self.assertEqual(396, self.multiworld.state.prog_items[self.player]["5 Precursor Orbs"]) + + def test_trades_are_accessible(self): + self.collect_all_but("") + self.assertTrue(self.multiworld + .get_location("SV: Bring 90 Orbs To The Mayor", self.player) + .can_reach(self.multiworld.state)) diff --git a/worlds/jakanddaxter/test/test_traps.py b/worlds/jakanddaxter/test/test_traps.py new file mode 100644 index 0000000000..841997798b --- /dev/null +++ b/worlds/jakanddaxter/test/test_traps.py @@ -0,0 +1,80 @@ +from BaseClasses import ItemClassification +from .bases import JakAndDaxterTestBase + + +class NoTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 0, + "filler_orb_bundles_replaced_with_traps": 0, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(0, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(29, count) + + +class SomeTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 10, + "filler_orb_bundles_replaced_with_traps": 10, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(10, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(19, count) + + +class MaximumTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 100, + "filler_orb_bundles_replaced_with_traps": 100, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(29, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(0, count) From d5bacaba639a9fc14a8148ea005112a76c700b56 Mon Sep 17 00:00:00 2001 From: BlastSlimey <89539656+BlastSlimey@users.noreply.github.com> Date: Wed, 21 May 2025 14:30:39 +0200 Subject: [PATCH 152/199] shapez: Implement New Game (#3960) Adds shapez as a supported game in AP. --- worlds/shapez/__init__.py | 417 + worlds/shapez/common/__init__.py | 0 worlds/shapez/common/options.py | 190 + worlds/shapez/data/__init__.py | 0 worlds/shapez/data/generate.py | 134 + worlds/shapez/data/options.json | 4 + worlds/shapez/data/shapesanity_pool.py | 75814 ++++++++++++++++ worlds/shapez/data/strings.py | 337 + worlds/shapez/docs/datapackage_settings_de.md | 35 + worlds/shapez/docs/datapackage_settings_en.md | 33 + worlds/shapez/docs/de_shapez.md | 71 + worlds/shapez/docs/en_shapez.md | 65 + worlds/shapez/docs/setup_de.md | 62 + worlds/shapez/docs/setup_en.md | 58 + worlds/shapez/docs/shapesanity_full.png | Bin 0 -> 127240 bytes worlds/shapez/items.py | 279 + worlds/shapez/locations.py | 546 + worlds/shapez/options.py | 310 + worlds/shapez/presets.py | 49 + worlds/shapez/regions.py | 277 + worlds/shapez/test/__init__.py | 213 + 21 files changed, 78894 insertions(+) create mode 100644 worlds/shapez/__init__.py create mode 100644 worlds/shapez/common/__init__.py create mode 100644 worlds/shapez/common/options.py create mode 100644 worlds/shapez/data/__init__.py create mode 100644 worlds/shapez/data/generate.py create mode 100644 worlds/shapez/data/options.json create mode 100644 worlds/shapez/data/shapesanity_pool.py create mode 100644 worlds/shapez/data/strings.py create mode 100644 worlds/shapez/docs/datapackage_settings_de.md create mode 100644 worlds/shapez/docs/datapackage_settings_en.md create mode 100644 worlds/shapez/docs/de_shapez.md create mode 100644 worlds/shapez/docs/en_shapez.md create mode 100644 worlds/shapez/docs/setup_de.md create mode 100644 worlds/shapez/docs/setup_en.md create mode 100644 worlds/shapez/docs/shapesanity_full.png create mode 100644 worlds/shapez/items.py create mode 100644 worlds/shapez/locations.py create mode 100644 worlds/shapez/options.py create mode 100644 worlds/shapez/presets.py create mode 100644 worlds/shapez/regions.py create mode 100644 worlds/shapez/test/__init__.py diff --git a/worlds/shapez/__init__.py b/worlds/shapez/__init__.py new file mode 100644 index 0000000000..2a77ed8c9c --- /dev/null +++ b/worlds/shapez/__init__.py @@ -0,0 +1,417 @@ +import math +from typing import Any, List, Dict, Tuple, Mapping + +from Options import OptionError +from .data.strings import OTHER, ITEMS, CATEGORY, LOCATIONS, SLOTDATA, GOALS, OPTIONS +from .items import item_descriptions, item_table, ShapezItem, \ + buildings_routing, buildings_processing, buildings_other, \ + buildings_top_row, buildings_wires, gameplay_unlocks, upgrades, \ + big_upgrades, filler, trap, bundles, belt_and_extractor, standard_traps, random_draining_trap, split_draining_traps, \ + whacky_upgrade_traps +from .locations import ShapezLocation, addlevels, addupgrades, addachievements, location_description, \ + addshapesanity, addshapesanity_ut, shapesanity_simple, init_shapesanity_pool, achievement_locations, \ + level_locations, upgrade_locations, shapesanity_locations, categories +from .presets import options_presets +from .options import ShapezOptions +from worlds.AutoWorld import World, WebWorld +from BaseClasses import Item, Tutorial, LocationProgressType, MultiWorld +from .regions import create_shapez_regions, has_x_belt_multiplier +from ..generic.Rules import add_rule + + +class ShapezWeb(WebWorld): + options_presets = options_presets + rich_text_options_doc = True + theme = "stone" + game_info_languages = ['en', 'de'] + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing shapez with Archipelago:", + "English", + "setup_en.md", + "setup/en", + ["BlastSlimey"] + ) + setup_de = Tutorial( + setup_en.tutorial_name, + setup_en.description, + "Deutsch", + "setup_de.md", + "setup/de", + ["BlastSlimey"] + ) + datapackage_settings_en = Tutorial( + "Changing datapackage settings", + "3000 locations are too many or not enough? Here's how you can change that:", + "English", + "datapackage_settings_en.md", + "datapackage_settings/en", + ["BlastSlimey"] + ) + datapackage_settings_de = Tutorial( + datapackage_settings_en.tutorial_name, + datapackage_settings_en.description, + "Deutsch", + "datapackage_settings_de.md", + "datapackage_settings/de", + ["BlastSlimey"] + ) + tutorials = [setup_en, setup_de, datapackage_settings_en, datapackage_settings_de] + item_descriptions = item_descriptions + location_descriptions = location_description + + +class ShapezWorld(World): + """ + shapez is an automation game about cutting, rotating, stacking, and painting shapes, that you extract from randomly + generated patches on an infinite canvas, without the need to manage your infinite resources or to pay for building + your factories. + """ + game = OTHER.game_name + options_dataclass = ShapezOptions + options: ShapezOptions + topology_present = True + web = ShapezWeb() + base_id = 20010707 + item_name_to_id = {name: id for id, name in enumerate(item_table.keys(), base_id)} + location_name_to_id = {name: id for id, name in enumerate(level_locations + upgrade_locations + + achievement_locations + shapesanity_locations, base_id)} + item_name_groups = { + "Main Buildings": {ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker}, + "Processing Buildings": {*buildings_processing}, + "Goal Buildings": {ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.rotator_ccw, ITEMS.color_mixer, + ITEMS.stacker, ITEMS.cutter_quad, ITEMS.painter_double, ITEMS.painter_quad, ITEMS.wires, + ITEMS.switch, ITEMS.const_signal}, + "Most Useful Buildings": {ITEMS.balancer, ITEMS.tunnel, ITEMS.tunnel_tier_ii, ITEMS.comp_merger, + ITEMS.comp_splitter, ITEMS.trash, ITEMS.extractor_chain}, + "Most Important Buildings": {*belt_and_extractor}, + "Top Row Buildings": {*buildings_top_row}, + "Wires Layer Buildings": {*buildings_wires}, + "Gameplay Mechanics": {ITEMS.blueprints, ITEMS.wires}, + "Upgrades": {*{ITEMS.upgrade(size, cat) + for size in {CATEGORY.big, CATEGORY.small, CATEGORY.gigantic, CATEGORY.rising} + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting}}, + *{ITEMS.trap_upgrade(cat, size) + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting} + for size in {"", CATEGORY.demonic}}, + *{ITEMS.upgrade(size, CATEGORY.random) + for size in {CATEGORY.big, CATEGORY.small}}}, + **{f"{cat} Upgrades": {*{ITEMS.upgrade(size, cat) + for size in {CATEGORY.big, CATEGORY.small, CATEGORY.gigantic, CATEGORY.rising}}, + *{ITEMS.trap_upgrade(cat, size) + for size in {"", CATEGORY.demonic}}} + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting}}, + "Bundles": {*bundles}, + "Traps": {*standard_traps, *random_draining_trap, *split_draining_traps, *whacky_upgrade_traps}, + } + location_name_groups = { + "Levels": {*level_locations}, + "Upgrades": {*upgrade_locations}, + "Achievements": {*achievement_locations}, + "Shapesanity": {*shapesanity_locations}, + **{f"{cat} Upgrades": {loc for loc in upgrade_locations if loc.startswith(cat)} for cat in categories}, + "Only Belt and Extractor": {LOCATIONS.level(1), LOCATIONS.level(1, 1), + LOCATIONS.my_eyes, LOCATIONS.its_a_mess, LOCATIONS.getting_into_it, + LOCATIONS.perfectionist, LOCATIONS.oops, LOCATIONS.i_need_trains, LOCATIONS.gps, + LOCATIONS.a_long_time, LOCATIONS.addicted, + LOCATIONS.shapesanity(1), LOCATIONS.shapesanity(2), LOCATIONS.shapesanity(3)}, + } + + def __init__(self, multiworld: MultiWorld, player: int): + super().__init__(multiworld, player) + + # Defining instance attributes for each shapez world + # These are set to default values that should fail unit tests if not replaced with correct values + self.location_count: int = 0 + self.level_logic: List[str] = [] + self.upgrade_logic: List[str] = [] + self.level_logic_type: str = "" + self.upgrade_logic_type: str = "" + self.random_logic_phase_length: List[int] = [] + self.category_random_logic_amounts: Dict[str, int] = {} + self.maxlevel: int = 0 + self.finaltier: int = 0 + self.included_locations: Dict[str, Tuple[str, LocationProgressType]] = {} + self.client_seed: int = 0 + self.shapesanity_names: List[str] = [] + self.upgrade_traps_allowed: bool = False + + # Universal Tracker support + self.ut_active: bool = False + self.passthrough: Dict[str, any] = {} + self.location_id_to_alias: Dict[int, str] = {} + + @classmethod + def stage_generate_early(cls, multiworld: MultiWorld) -> None: + # Import the 75800 entries long shapesanity pool only once and only if it's actually needed + if len(shapesanity_simple) == 0: + init_shapesanity_pool() + + def generate_early(self) -> None: + # Calculate all the important values used for generating a shapez world, with some of them being random + self.upgrade_traps_allowed: bool = (self.options.include_whacky_upgrades and + (not self.options.goal == GOALS.efficiency_iii) and + self.options.throughput_levels_ratio == 0) + + # Load values from UT if this is a regenerated world + if hasattr(self.multiworld, "re_gen_passthrough"): + if OTHER.game_name in self.multiworld.re_gen_passthrough: + self.ut_active = True + self.passthrough = self.multiworld.re_gen_passthrough[OTHER.game_name] + self.maxlevel = self.passthrough[SLOTDATA.maxlevel] + self.finaltier = self.passthrough[SLOTDATA.finaltier] + self.client_seed = self.passthrough[SLOTDATA.seed] + self.level_logic = [self.passthrough[SLOTDATA.level_building(i+1)] for i in range(5)] + self.upgrade_logic = [self.passthrough[SLOTDATA.upgrade_building(i+1)] for i in range(5)] + self.level_logic_type = self.passthrough[SLOTDATA.rand_level_logic] + self.upgrade_logic_type = self.passthrough[SLOTDATA.rand_upgrade_logic] + self.random_logic_phase_length = [self.passthrough[SLOTDATA.phase_length(i)] for i in range(5)] + self.category_random_logic_amounts = {cat: self.passthrough[SLOTDATA.cat_buildings_amount(cat)] + for cat in [CATEGORY.belt_low, CATEGORY.miner_low, + CATEGORY.processors_low, CATEGORY.painting_low]} + # Forces balancers, tunnel, and trash to not appear in regen to make UT more accurate + self.options.early_balancer_tunnel_and_trash.value = 0 + return + + # "MAM" goal is supposed to be longer than vanilla, but to not have more options than necessary, + # both goal amounts for "MAM" and "Even fasterer" are set in a single option. + if self.options.goal == GOALS.mam and self.options.goal_amount < 27: + raise OptionError(self.player_name + + ": When setting goal to 1 ('mam'), goal_amount must be at least 27 and not " + + str(self.options.goal_amount.value)) + + # If lock_belt_and_extractor is true, the only sphere 1 locations will be achievements + if self.options.lock_belt_and_extractor and not self.options.include_achievements: + raise OptionError(self.player_name + ": Achievements must be included when belt and extractor are locked") + + # Determines maxlevel and finaltier, which are needed for location and item generation + if self.options.goal == GOALS.vanilla: + self.maxlevel = 25 + self.finaltier = 8 + elif self.options.goal == GOALS.mam: + self.maxlevel = self.options.goal_amount - 1 + self.finaltier = 8 + elif self.options.goal == GOALS.even_fasterer: + self.maxlevel = 26 + self.finaltier = self.options.goal_amount.value + else: # goal == efficiency_iii + self.maxlevel = 26 + self.finaltier = 8 + + # Setting the seed for the game before any other randomization call is done + self.client_seed = self.random.randint(0, 100000) + + # Determines the order of buildings for levels logic + if self.options.randomize_level_requirements: + self.level_logic_type = self.options.randomize_level_logic.current_key + if self.level_logic_type.endswith(OPTIONS.logic_shuffled) or self.level_logic_type == OPTIONS.logic_dopamine: + vanilla_list = [ITEMS.cutter, ITEMS.painter, ITEMS.stacker] + while len(vanilla_list) > 0: + index = self.random.randint(0, len(vanilla_list)-1) + next_building = vanilla_list.pop(index) + if next_building == ITEMS.cutter: + vanilla_list.append(ITEMS.rotator) + if next_building == ITEMS.painter: + vanilla_list.append(ITEMS.color_mixer) + self.level_logic.append(next_building) + else: + self.level_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + else: + self.level_logic_type = OPTIONS.logic_vanilla + self.level_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + + # Determines the order of buildings for upgrades logic + if self.options.randomize_upgrade_requirements: + self.upgrade_logic_type = self.options.randomize_upgrade_logic.current_key + if self.upgrade_logic_type == OPTIONS.logic_hardcore: + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + elif self.upgrade_logic_type == OPTIONS.logic_category: + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.stacker, ITEMS.painter, ITEMS.color_mixer] + else: + vanilla_list = [ITEMS.cutter, ITEMS.painter, ITEMS.stacker] + while len(vanilla_list) > 0: + index = self.random.randint(0, len(vanilla_list)-1) + next_building = vanilla_list.pop(index) + if next_building == ITEMS.cutter: + vanilla_list.append(ITEMS.rotator) + if next_building == ITEMS.painter: + vanilla_list.append(ITEMS.color_mixer) + self.upgrade_logic.append(next_building) + else: + self.upgrade_logic_type = OPTIONS.logic_vanilla_like + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + + # Determine lenghts of phases in level logic type "random" + self.random_logic_phase_length = [1, 1, 1, 1, 1] + if self.level_logic_type.startswith(OPTIONS.logic_random_steps): + remaininglength = self.maxlevel - 1 + for phase in range(0, 5): + if self.random.random() < 0.1: # Make sure that longer phases are less frequent + self.random_logic_phase_length[phase] = self.random.randint(0, remaininglength) + else: + self.random_logic_phase_length[phase] = self.random.randint(0, remaininglength // (6 - phase)) + remaininglength -= self.random_logic_phase_length[phase] + + # Determine amount of needed buildings for each category in upgrade logic type "category_random" + self.category_random_logic_amounts = {CATEGORY.belt_low: 0, CATEGORY.miner_low: 1, + CATEGORY.processors_low: 2, CATEGORY.painting_low: 3} + if self.upgrade_logic_type == OPTIONS.logic_category_random: + cats = [CATEGORY.belt_low, CATEGORY.miner_low, CATEGORY.processors_low, CATEGORY.painting_low] + nextcat = self.random.choice(cats) + self.category_random_logic_amounts[nextcat] = 0 + cats.remove(nextcat) + for cat in cats: + self.category_random_logic_amounts[cat] = self.random.randint(0, 5) + + def create_item(self, name: str) -> Item: + return ShapezItem(name, item_table[name](self.options), self.item_name_to_id[name], self.player) + + def get_filler_item_name(self) -> str: + return filler(self.random.random(), bool(self.options.include_whacky_upgrades)) + + def append_shapesanity(self, name: str) -> None: + """This method is given as a parameter when creating the locations for shapesanity.""" + self.shapesanity_names.append(name) + + def add_alias(self, location_name: str, alias: str): + """This method is given as a parameter when locations with helpful aliases for UT are created.""" + if self.ut_active: + self.location_id_to_alias[self.location_name_to_id[location_name]] = alias + + def create_regions(self) -> None: + # Create list of all included level and upgrade locations based on player options + # This already includes the region to be placed in and the LocationProgressType + self.included_locations = {**addlevels(self.maxlevel, self.level_logic_type, + self.random_logic_phase_length), + **addupgrades(self.finaltier, self.upgrade_logic_type, + self.category_random_logic_amounts)} + + # Add shapesanity to included location and creates the corresponding list based on player options + if self.ut_active: + self.shapesanity_names = self.passthrough[SLOTDATA.shapesanity] + self.included_locations.update(addshapesanity_ut(self.shapesanity_names, self.add_alias)) + else: + self.included_locations.update(addshapesanity(self.options.shapesanity_amount.value, self.random, + self.append_shapesanity, self.add_alias)) + + # Add achievements to included locations based on player options + if self.options.include_achievements: + self.included_locations.update(addachievements( + bool(self.options.exclude_softlock_achievements), bool(self.options.exclude_long_playtime_achievements), + bool(self.options.exclude_progression_unreasonable), self.maxlevel, self.upgrade_logic_type, + self.category_random_logic_amounts, self.options.goal.current_key, self.included_locations, + self.add_alias, self.upgrade_traps_allowed)) + + # Save the final amount of to-be-filled locations + self.location_count = len(self.included_locations) + + # Create regions and entrances based on included locations and player options + self.multiworld.regions.extend(create_shapez_regions(self.player, self.multiworld, + bool(self.options.allow_floating_layers.value), + self.included_locations, self.location_name_to_id, + self.level_logic, self.upgrade_logic, + self.options.early_balancer_tunnel_and_trash.current_key, + self.options.goal.current_key)) + + def create_items(self) -> None: + # Include guaranteed items (game mechanic unlocks and 7x4 big upgrades) + included_items: List[Item] = ([self.create_item(name) for name in buildings_processing.keys()] + + [self.create_item(name) for name in buildings_routing.keys()] + + [self.create_item(name) for name in buildings_other.keys()] + + [self.create_item(name) for name in buildings_top_row.keys()] + + [self.create_item(name) for name in buildings_wires.keys()] + + [self.create_item(name) for name in gameplay_unlocks.keys()] + + [self.create_item(name) for name in big_upgrades for _ in range(7)]) + + if not self.options.lock_belt_and_extractor: + for name in belt_and_extractor: + self.multiworld.push_precollected(self.create_item(name)) + else: # This also requires self.options.include_achievements to be true + included_items.extend([self.create_item(name) for name in belt_and_extractor.keys()]) + + # Give a detailed error message if there are already more items than available locations. + # At the moment, this won't happen, but it's better for debugging in case a future update breaks things. + if len(included_items) > self.location_count: + raise RuntimeError(self.player_name + ": There are more guaranteed items than available locations") + + # Get value from traps probability option and convert to float + traps_probability = self.options.traps_percentage/100 + split_draining = bool(self.options.split_inventory_draining_trap) + # Fill remaining locations with fillers + for x in range(self.location_count - len(included_items)): + if self.random.random() < traps_probability: + # Fill with trap + included_items.append(self.create_item(trap(self.random.random(), split_draining, + self.upgrade_traps_allowed))) + else: + # Fil with random filler item + included_items.append(self.create_item(self.get_filler_item_name())) + + # Add correct number of items to itempool + self.multiworld.itempool += included_items + + # Add balancer, tunnel, and trash to early items if player options say so + if self.options.early_balancer_tunnel_and_trash == OPTIONS.sphere_1: + self.multiworld.early_items[self.player][ITEMS.balancer] = 1 + self.multiworld.early_items[self.player][ITEMS.tunnel] = 1 + self.multiworld.early_items[self.player][ITEMS.trash] = 1 + + def set_rules(self) -> None: + # Levels might need more belt speed if they require throughput per second. As the randomization of what levels + # need throughput happens in the client mod, this logic needs to be applied to all levels. This is applied to + # every individual level instead of regions, because they would need a much more complex calculation to prevent + # softlocks. + + def f(x: int, name: str): + # These calculations are taken from the client mod + if x < 26: + throughput = math.ceil((2.999+x*0.333)*self.options.required_shapes_multiplier/10) + else: + throughput = min((4+(x-26)*0.25)*self.options.required_shapes_multiplier/10, 200) + if throughput/32 >= 1: + add_rule(self.get_location(name), + lambda state: has_x_belt_multiplier(state, self.player, throughput/32)) + + if not self.options.throughput_levels_ratio == 0: + f(0, LOCATIONS.level(1, 1)) + f(19, LOCATIONS.level(20, 1)) + f(19, LOCATIONS.level(20, 2)) + for _x in range(self.maxlevel): + f(_x, LOCATIONS.level(_x+1)) + if self.options.goal.current_key in [GOALS.vanilla, GOALS.mam]: + f(self.maxlevel, LOCATIONS.goal) + + def fill_slot_data(self) -> Mapping[str, Any]: + # Buildings logic; all buildings as individual parameters + level_logic_data = {SLOTDATA.level_building(x+1): self.level_logic[x] for x in range(5)} + upgrade_logic_data = {SLOTDATA.upgrade_building(x+1): self.upgrade_logic[x] for x in range(5)} + # Randomized values for certain logic types + logic_type_random_data = {SLOTDATA.phase_length(x): self.random_logic_phase_length[x] for x in range(0, 5)} + logic_type_cat_random_data = {SLOTDATA.cat_buildings_amount(cat): self.category_random_logic_amounts[cat] + for cat in [CATEGORY.belt_low, CATEGORY.miner_low, + CATEGORY.processors_low, CATEGORY.painting_low]} + + # Options that are relevant to the mod + option_data = { + SLOTDATA.goal: self.options.goal.current_key, + SLOTDATA.maxlevel: self.maxlevel, + SLOTDATA.finaltier: self.finaltier, + SLOTDATA.req_shapes_mult: self.options.required_shapes_multiplier.value, + SLOTDATA.allow_float_layers: bool(self.options.allow_floating_layers), + SLOTDATA.rand_level_req: bool(self.options.randomize_level_requirements), + SLOTDATA.rand_upgrade_req: bool(self.options.randomize_upgrade_requirements), + SLOTDATA.rand_level_logic: self.level_logic_type, + SLOTDATA.rand_upgrade_logic: self.upgrade_logic_type, + SLOTDATA.throughput_levels_ratio: self.options.throughput_levels_ratio.value, + SLOTDATA.comp_growth_gradient: self.options.complexity_growth_gradient.value, + SLOTDATA.same_late: bool(self.options.same_late_upgrade_requirements), + SLOTDATA.toolbar_shuffling: bool(self.options.toolbar_shuffling), + } + + return {**level_logic_data, **upgrade_logic_data, **option_data, **logic_type_random_data, + **logic_type_cat_random_data, SLOTDATA.seed: self.client_seed, + SLOTDATA.shapesanity: self.shapesanity_names} + + def interpret_slot_data(self, slot_data: Dict[str, Any]) -> Dict[str, Any]: + """Helper function for Universal Tracker""" + return slot_data diff --git a/worlds/shapez/common/__init__.py b/worlds/shapez/common/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/shapez/common/options.py b/worlds/shapez/common/options.py new file mode 100644 index 0000000000..aa66ced032 --- /dev/null +++ b/worlds/shapez/common/options.py @@ -0,0 +1,190 @@ +import random +import typing + +from Options import FreeText, NumericOption + + +class FloatRangeText(FreeText, NumericOption): + """FreeText option optimized for entering float numbers. + Supports everything that Range supports. + range_start and range_end have to be floats, while default has to be a string.""" + + default = "0.0" + value: float + range_start: float = 0.0 + range_end: float = 1.0 + + def __init__(self, value: str): + super().__init__(value) + value = value.lower() + if value.startswith("random"): + self.value = self.weighted_range(value) + elif value == "default" and hasattr(self, "default"): + self.value = float(self.default) + elif value == "high": + self.value = self.range_end + elif value == "low": + self.value = self.range_start + elif self.range_start == 0.0 \ + and hasattr(self, "default") \ + and self.default != "0.0" \ + and value in ("true", "false"): + # these are the conditions where "true" and "false" make sense + if value == "true": + self.value = float(self.default) + else: # "false" + self.value = 0.0 + else: + try: + self.value = float(value) + except ValueError: + raise Exception(f"Invalid value for option {self.__class__.__name__}: {value}") + except OverflowError: + raise Exception(f"Out of range floating value for option {self.__class__.__name__}: {value}") + if self.value < self.range_start: + raise Exception(f"{value} is lower than minimum {self.range_start} for option {self.__class__.__name__}") + if self.value > self.range_end: + raise Exception(f"{value} is higher than maximum {self.range_end} for option {self.__class__.__name__}") + + @classmethod + def from_text(cls, text: str) -> typing.Any: + return cls(text) + + @classmethod + def weighted_range(cls, text: str) -> float: + if text == "random-low": + return random.triangular(cls.range_start, cls.range_end, cls.range_start) + elif text == "random-high": + return random.triangular(cls.range_start, cls.range_end, cls.range_end) + elif text == "random-middle": + return random.triangular(cls.range_start, cls.range_end) + elif text.startswith("random-range-"): + return cls.custom_range(text) + elif text == "random": + return random.uniform(cls.range_start, cls.range_end) + else: + raise Exception(f"random text \"{text}\" did not resolve to a recognized pattern. " + f"Acceptable values are: random, random-high, random-middle, random-low, " + f"random-range-low--, random-range-middle--, " + f"random-range-high--, or random-range--.") + + @classmethod + def custom_range(cls, text: str) -> float: + textsplit = text.split("-") + try: + random_range = [float(textsplit[len(textsplit) - 2]), float(textsplit[len(textsplit) - 1])] + except ValueError: + raise ValueError(f"Invalid random range {text} for option {cls.__name__}") + except OverflowError: + raise Exception(f"Out of range floating value for option {cls.__name__}: {text}") + random_range.sort() + if random_range[0] < cls.range_start or random_range[1] > cls.range_end: + raise Exception( + f"{random_range[0]}-{random_range[1]} is outside allowed range " + f"{cls.range_start}-{cls.range_end} for option {cls.__name__}") + if text.startswith("random-range-low"): + return random.triangular(random_range[0], random_range[1], random_range[0]) + elif text.startswith("random-range-middle"): + return random.triangular(random_range[0], random_range[1]) + elif text.startswith("random-range-high"): + return random.triangular(random_range[0], random_range[1], random_range[1]) + else: + return random.uniform(random_range[0], random_range[1]) + + @property + def current_key(self) -> str: + return str(self.value) + + @classmethod + def get_option_name(cls, value: float) -> str: + return str(value) + + def __eq__(self, other: typing.Any): + if isinstance(other, NumericOption): + return self.value == other.value + else: + return typing.cast(bool, self.value == other) + + def __lt__(self, other: typing.Union[int, float, NumericOption]) -> bool: + if isinstance(other, NumericOption): + return self.value < other.value + else: + return self.value < other + + def __le__(self, other: typing.Union[int, float, NumericOption]) -> bool: + if isinstance(other, NumericOption): + return self.value <= other.value + else: + return self.value <= other + + def __gt__(self, other: typing.Union[int, float, NumericOption]) -> bool: + if isinstance(other, NumericOption): + return self.value > other.value + else: + return self.value > other + + def __ge__(self, other: typing.Union[int, float, NumericOption]) -> bool: + if isinstance(other, NumericOption): + return self.value >= other.value + else: + return self.value >= other + + def __int__(self) -> int: + return int(self.value) + + def __and__(self, other: typing.Any) -> int: + raise TypeError("& operator not supported for float values") + + def __floordiv__(self, other: typing.Any) -> int: + return int(self.value // float(other)) + + def __invert__(self) -> int: + raise TypeError("~ operator not supported for float values") + + def __lshift__(self, other: typing.Any) -> int: + raise TypeError("<< operator not supported for float values") + + def __mod__(self, other: typing.Any) -> float: + return self.value % float(other) + + def __neg__(self) -> float: + return -self.value + + def __or__(self, other: typing.Any) -> int: + raise TypeError("| operator not supported for float values") + + def __pos__(self) -> float: + return +self.value + + def __rand__(self, other: typing.Any) -> int: + raise TypeError("& operator not supported for float values") + + def __rfloordiv__(self, other: typing.Any) -> int: + return int(float(other) // self.value) + + def __rlshift__(self, other: typing.Any) -> int: + raise TypeError("<< operator not supported for float values") + + def __rmod__(self, other: typing.Any) -> float: + return float(other) % self.value + + def __ror__(self, other: typing.Any) -> int: + raise TypeError("| operator not supported for float values") + + def __round__(self, ndigits: typing.Optional[int] = None) -> float: + return round(self.value, ndigits) + + def __rpow__(self, base: typing.Any) -> typing.Any: + return base ** self.value + + def __rrshift__(self, other: typing.Any) -> int: + raise TypeError(">> operator not supported for float values") + + def __rshift__(self, other: typing.Any) -> int: + raise TypeError(">> operator not supported for float values") + + def __rxor__(self, other: typing.Any) -> int: + raise TypeError("^ operator not supported for float values") + + def __xor__(self, other: typing.Any) -> int: + raise TypeError("^ operator not supported for float values") diff --git a/worlds/shapez/data/__init__.py b/worlds/shapez/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/shapez/data/generate.py b/worlds/shapez/data/generate.py new file mode 100644 index 0000000000..27d74e865d --- /dev/null +++ b/worlds/shapez/data/generate.py @@ -0,0 +1,134 @@ +import itertools +import time +from typing import Dict, List + +from worlds.shapez.data.strings import SHAPESANITY, REGIONS + +shapesanity_simple: Dict[str, str] = {} +shapesanity_1_4: Dict[str, str] = {} +shapesanity_two_sided: Dict[str, str] = {} +shapesanity_three_parts: Dict[str, str] = {} +shapesanity_four_parts: Dict[str, str] = {} +subshape_names = [SHAPESANITY.circle, SHAPESANITY.square, SHAPESANITY.star, SHAPESANITY.windmill] +color_names = [SHAPESANITY.red, SHAPESANITY.blue, SHAPESANITY.green, SHAPESANITY.yellow, SHAPESANITY.purple, + SHAPESANITY.cyan, SHAPESANITY.white, SHAPESANITY.uncolored] +short_subshapes = ["C", "R", "S", "W"] +short_colors = ["b", "c", "g", "p", "r", "u", "w", "y"] + + +def color_to_needed_building(color_list: List[str]) -> str: + for next_color in color_list: + if next_color in [SHAPESANITY.yellow, SHAPESANITY.purple, SHAPESANITY.cyan, SHAPESANITY.white, + "y", "p", "c", "w"]: + return REGIONS.mixed + for next_color in color_list: + if next_color not in [SHAPESANITY.uncolored, "u"]: + return REGIONS.painted + return REGIONS.uncol + + +def generate_shapesanity_pool() -> None: + # same shapes && same color + for color in color_names: + color_region = color_to_needed_building([color]) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.circle)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.square)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.star)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.windmill)] = REGIONS.sanity(REGIONS.east_wind, color_region) + for shape in subshape_names: + for color in color_names: + color_region = color_to_needed_building([color]) + shapesanity_simple[SHAPESANITY.half(color, shape)] = REGIONS.sanity(REGIONS.half, color_region) + shapesanity_simple[SHAPESANITY.piece(color, shape)] = REGIONS.sanity(REGIONS.piece, color_region) + shapesanity_simple[SHAPESANITY.cutout(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_simple[SHAPESANITY.cornered(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) + + # one color && 4 shapes (including empty) + for first_color, second_color, third_color, fourth_color in itertools.combinations(short_colors+["-"], 4): + colors = [first_color, second_color, third_color, fourth_color] + color_region = color_to_needed_building(colors) + shape_regions = [REGIONS.stitched, REGIONS.stitched] if fourth_color == "-" else [REGIONS.col_full, REGIONS.col_east_wind] + color_code = ''.join(colors) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.circle)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.square)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.star)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.windmill)] = REGIONS.sanity(shape_regions[1], color_region) + + # one shape && 4 colors (including empty) + for first_shape, second_shape, third_shape, fourth_shape in itertools.combinations(short_subshapes+["-"], 4): + for color in color_names: + shapesanity_1_4[SHAPESANITY.full(color, ''.join([first_shape, second_shape, third_shape, fourth_shape]))] \ + = REGIONS.sanity(REGIONS.stitched, color_to_needed_building([color])) + + combos = [shape + color for shape in short_subshapes for color in short_colors] + for first_combo, second_combo in itertools.permutations(combos, 2): + # 2-sided shapes + color_region = color_to_needed_building([first_combo[1], second_combo[1]]) + ordered_combo = " ".join(sorted([first_combo, second_combo])) + shape_regions = (([REGIONS.east_wind, REGIONS.east_wind, REGIONS.col_half] + if first_combo[0] == "W" else [REGIONS.col_full, REGIONS.col_full, REGIONS.col_half]) + if first_combo[0] == second_combo[0] else [REGIONS.stitched, REGIONS.half_half, REGIONS.stitched]) + shapesanity_two_sided[SHAPESANITY.three_one(first_combo, second_combo)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_two_sided[SHAPESANITY.halfhalf(ordered_combo)] = REGIONS.sanity(shape_regions[1], color_region) + shapesanity_two_sided[SHAPESANITY.checkered(ordered_combo)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(shape_regions[2], color_region) + shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + for third_combo in combos: + if third_combo in [first_combo, second_combo]: + continue + # 3-part shapes + colors = [first_combo[1], second_combo[1], third_combo[1]] + color_region = color_to_needed_building(colors) + ordered_two = " ".join(sorted([second_combo, third_combo])) + if not (first_combo[1] == second_combo[1] == third_combo[1] or + first_combo[0] == second_combo[0] == third_combo[0]): + ordered_all = " ".join(sorted([first_combo, second_combo, third_combo])) + shapesanity_three_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) + shape_regions = ([REGIONS.stitched, REGIONS.stitched] if not second_combo[0] == third_combo[0] + else (([REGIONS.east_wind, REGIONS.east_wind] if first_combo[0] == "W" + else [REGIONS.col_full, REGIONS.col_full]) + if first_combo[0] == second_combo[0] else [REGIONS.col_half_half, REGIONS.stitched])) + shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.adjacent_pos)] \ + = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.cornered_pos)] \ + = REGIONS.sanity(shape_regions[1], color_region) + for fourth_combo in combos: + if fourth_combo in [first_combo, second_combo, third_combo]: + continue + if (first_combo[1] == second_combo[1] == third_combo[1] == fourth_combo[1] or + first_combo[0] == second_combo[0] == third_combo[0] == fourth_combo[0]): + continue + colors = [first_combo[1], second_combo[1], third_combo[1], fourth_combo[1]] + color_region = color_to_needed_building(colors) + ordered_all = " ".join(sorted([first_combo, second_combo, third_combo, fourth_combo])) + if ((first_combo[0] == second_combo[0] and third_combo[0] == fourth_combo[0]) or + (first_combo[0] == third_combo[0] and second_combo[0] == fourth_combo[0]) or + (first_combo[0] == fourth_combo[0] and third_combo[0] == second_combo[0])): + shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.col_half_half, color_region) + else: + shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) + + +if __name__ == "__main__": + start = time.time() + generate_shapesanity_pool() + print(time.time() - start) + with open("shapesanity_pool.py", "w") as outfile: + outfile.writelines(["shapesanity_simple = {\n"] + + [f" \"{name}\": \"{shapesanity_simple[name]}\",\n" + for name in shapesanity_simple] + + ["}\n\nshapesanity_1_4 = {\n"] + + [f" \"{name}\": \"{shapesanity_1_4[name]}\",\n" + for name in shapesanity_1_4] + + ["}\n\nshapesanity_two_sided = {\n"] + + [f" \"{name}\": \"{shapesanity_two_sided[name]}\",\n" + for name in shapesanity_two_sided] + + ["}\n\nshapesanity_three_parts = {\n"] + + [f" \"{name}\": \"{shapesanity_three_parts[name]}\",\n" + for name in shapesanity_three_parts] + + ["}\n\nshapesanity_four_parts = {\n"] + + [f" \"{name}\": \"{shapesanity_four_parts[name]}\",\n" + for name in shapesanity_four_parts] + + ["}\n"]) diff --git a/worlds/shapez/data/options.json b/worlds/shapez/data/options.json new file mode 100644 index 0000000000..d60f02e0fd --- /dev/null +++ b/worlds/shapez/data/options.json @@ -0,0 +1,4 @@ +{ + "max_levels_and_upgrades": 500, + "max_shapesanity": 1000 +} diff --git a/worlds/shapez/data/shapesanity_pool.py b/worlds/shapez/data/shapesanity_pool.py new file mode 100644 index 0000000000..b0ae132e54 --- /dev/null +++ b/worlds/shapez/data/shapesanity_pool.py @@ -0,0 +1,75814 @@ +shapesanity_simple = { + "Red Circle": "Shapesanity Full Painted", + "Red Square": "Shapesanity Full Painted", + "Red Star": "Shapesanity Full Painted", + "Red Windmill": "Shapesanity East Windmill Painted", + "Blue Circle": "Shapesanity Full Painted", + "Blue Square": "Shapesanity Full Painted", + "Blue Star": "Shapesanity Full Painted", + "Blue Windmill": "Shapesanity East Windmill Painted", + "Green Circle": "Shapesanity Full Painted", + "Green Square": "Shapesanity Full Painted", + "Green Star": "Shapesanity Full Painted", + "Green Windmill": "Shapesanity East Windmill Painted", + "Yellow Circle": "Shapesanity Full Mixed", + "Yellow Square": "Shapesanity Full Mixed", + "Yellow Star": "Shapesanity Full Mixed", + "Yellow Windmill": "Shapesanity East Windmill Mixed", + "Purple Circle": "Shapesanity Full Mixed", + "Purple Square": "Shapesanity Full Mixed", + "Purple Star": "Shapesanity Full Mixed", + "Purple Windmill": "Shapesanity East Windmill Mixed", + "Cyan Circle": "Shapesanity Full Mixed", + "Cyan Square": "Shapesanity Full Mixed", + "Cyan Star": "Shapesanity Full Mixed", + "Cyan Windmill": "Shapesanity East Windmill Mixed", + "White Circle": "Shapesanity Full Mixed", + "White Square": "Shapesanity Full Mixed", + "White Star": "Shapesanity Full Mixed", + "White Windmill": "Shapesanity East Windmill Mixed", + "Uncolored Circle": "Shapesanity Full Uncolored", + "Uncolored Square": "Shapesanity Full Uncolored", + "Uncolored Star": "Shapesanity Full Uncolored", + "Uncolored Windmill": "Shapesanity East Windmill Uncolored", + "Half Red Circle": "Shapesanity Half Painted", + "Red Circle Piece": "Shapesanity Piece Painted", + "Cut Out Red Circle": "Shapesanity Stitched Painted", + "Cornered Red Circle": "Shapesanity Stitched Painted", + "Half Blue Circle": "Shapesanity Half Painted", + "Blue Circle Piece": "Shapesanity Piece Painted", + "Cut Out Blue Circle": "Shapesanity Stitched Painted", + "Cornered Blue Circle": "Shapesanity Stitched Painted", + "Half Green Circle": "Shapesanity Half Painted", + "Green Circle Piece": "Shapesanity Piece Painted", + "Cut Out Green Circle": "Shapesanity Stitched Painted", + "Cornered Green Circle": "Shapesanity Stitched Painted", + "Half Yellow Circle": "Shapesanity Half Mixed", + "Yellow Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Circle": "Shapesanity Stitched Mixed", + "Cornered Yellow Circle": "Shapesanity Stitched Mixed", + "Half Purple Circle": "Shapesanity Half Mixed", + "Purple Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Circle": "Shapesanity Stitched Mixed", + "Cornered Purple Circle": "Shapesanity Stitched Mixed", + "Half Cyan Circle": "Shapesanity Half Mixed", + "Cyan Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Circle": "Shapesanity Stitched Mixed", + "Cornered Cyan Circle": "Shapesanity Stitched Mixed", + "Half White Circle": "Shapesanity Half Mixed", + "White Circle Piece": "Shapesanity Piece Mixed", + "Cut Out White Circle": "Shapesanity Stitched Mixed", + "Cornered White Circle": "Shapesanity Stitched Mixed", + "Half Uncolored Circle": "Shapesanity Half Uncolored", + "Uncolored Circle Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Circle": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Circle": "Shapesanity Stitched Uncolored", + "Half Red Square": "Shapesanity Half Painted", + "Red Square Piece": "Shapesanity Piece Painted", + "Cut Out Red Square": "Shapesanity Stitched Painted", + "Cornered Red Square": "Shapesanity Stitched Painted", + "Half Blue Square": "Shapesanity Half Painted", + "Blue Square Piece": "Shapesanity Piece Painted", + "Cut Out Blue Square": "Shapesanity Stitched Painted", + "Cornered Blue Square": "Shapesanity Stitched Painted", + "Half Green Square": "Shapesanity Half Painted", + "Green Square Piece": "Shapesanity Piece Painted", + "Cut Out Green Square": "Shapesanity Stitched Painted", + "Cornered Green Square": "Shapesanity Stitched Painted", + "Half Yellow Square": "Shapesanity Half Mixed", + "Yellow Square Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Square": "Shapesanity Stitched Mixed", + "Cornered Yellow Square": "Shapesanity Stitched Mixed", + "Half Purple Square": "Shapesanity Half Mixed", + "Purple Square Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Square": "Shapesanity Stitched Mixed", + "Cornered Purple Square": "Shapesanity Stitched Mixed", + "Half Cyan Square": "Shapesanity Half Mixed", + "Cyan Square Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Square": "Shapesanity Stitched Mixed", + "Cornered Cyan Square": "Shapesanity Stitched Mixed", + "Half White Square": "Shapesanity Half Mixed", + "White Square Piece": "Shapesanity Piece Mixed", + "Cut Out White Square": "Shapesanity Stitched Mixed", + "Cornered White Square": "Shapesanity Stitched Mixed", + "Half Uncolored Square": "Shapesanity Half Uncolored", + "Uncolored Square Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Square": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Square": "Shapesanity Stitched Uncolored", + "Half Red Star": "Shapesanity Half Painted", + "Red Star Piece": "Shapesanity Piece Painted", + "Cut Out Red Star": "Shapesanity Stitched Painted", + "Cornered Red Star": "Shapesanity Stitched Painted", + "Half Blue Star": "Shapesanity Half Painted", + "Blue Star Piece": "Shapesanity Piece Painted", + "Cut Out Blue Star": "Shapesanity Stitched Painted", + "Cornered Blue Star": "Shapesanity Stitched Painted", + "Half Green Star": "Shapesanity Half Painted", + "Green Star Piece": "Shapesanity Piece Painted", + "Cut Out Green Star": "Shapesanity Stitched Painted", + "Cornered Green Star": "Shapesanity Stitched Painted", + "Half Yellow Star": "Shapesanity Half Mixed", + "Yellow Star Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Star": "Shapesanity Stitched Mixed", + "Cornered Yellow Star": "Shapesanity Stitched Mixed", + "Half Purple Star": "Shapesanity Half Mixed", + "Purple Star Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Star": "Shapesanity Stitched Mixed", + "Cornered Purple Star": "Shapesanity Stitched Mixed", + "Half Cyan Star": "Shapesanity Half Mixed", + "Cyan Star Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Star": "Shapesanity Stitched Mixed", + "Cornered Cyan Star": "Shapesanity Stitched Mixed", + "Half White Star": "Shapesanity Half Mixed", + "White Star Piece": "Shapesanity Piece Mixed", + "Cut Out White Star": "Shapesanity Stitched Mixed", + "Cornered White Star": "Shapesanity Stitched Mixed", + "Half Uncolored Star": "Shapesanity Half Uncolored", + "Uncolored Star Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Star": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Star": "Shapesanity Stitched Uncolored", + "Half Red Windmill": "Shapesanity Half Painted", + "Red Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Red Windmill": "Shapesanity Stitched Painted", + "Cornered Red Windmill": "Shapesanity Stitched Painted", + "Half Blue Windmill": "Shapesanity Half Painted", + "Blue Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Blue Windmill": "Shapesanity Stitched Painted", + "Cornered Blue Windmill": "Shapesanity Stitched Painted", + "Half Green Windmill": "Shapesanity Half Painted", + "Green Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Green Windmill": "Shapesanity Stitched Painted", + "Cornered Green Windmill": "Shapesanity Stitched Painted", + "Half Yellow Windmill": "Shapesanity Half Mixed", + "Yellow Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Windmill": "Shapesanity Stitched Mixed", + "Cornered Yellow Windmill": "Shapesanity Stitched Mixed", + "Half Purple Windmill": "Shapesanity Half Mixed", + "Purple Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Windmill": "Shapesanity Stitched Mixed", + "Cornered Purple Windmill": "Shapesanity Stitched Mixed", + "Half Cyan Windmill": "Shapesanity Half Mixed", + "Cyan Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Windmill": "Shapesanity Stitched Mixed", + "Cornered Cyan Windmill": "Shapesanity Stitched Mixed", + "Half White Windmill": "Shapesanity Half Mixed", + "White Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out White Windmill": "Shapesanity Stitched Mixed", + "Cornered White Windmill": "Shapesanity Stitched Mixed", + "Half Uncolored Windmill": "Shapesanity Half Uncolored", + "Uncolored Windmill Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Windmill": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Windmill": "Shapesanity Stitched Uncolored", +} + +shapesanity_1_4 = { + "bcgp Circle": "Shapesanity Colorful Full Mixed", + "bcgp Square": "Shapesanity Colorful Full Mixed", + "bcgp Star": "Shapesanity Colorful Full Mixed", + "bcgp Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgr Circle": "Shapesanity Colorful Full Mixed", + "bcgr Square": "Shapesanity Colorful Full Mixed", + "bcgr Star": "Shapesanity Colorful Full Mixed", + "bcgr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgu Circle": "Shapesanity Colorful Full Mixed", + "bcgu Square": "Shapesanity Colorful Full Mixed", + "bcgu Star": "Shapesanity Colorful Full Mixed", + "bcgu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgw Circle": "Shapesanity Colorful Full Mixed", + "bcgw Square": "Shapesanity Colorful Full Mixed", + "bcgw Star": "Shapesanity Colorful Full Mixed", + "bcgw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgy Circle": "Shapesanity Colorful Full Mixed", + "bcgy Square": "Shapesanity Colorful Full Mixed", + "bcgy Star": "Shapesanity Colorful Full Mixed", + "bcgy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcg- Circle": "Shapesanity Stitched Mixed", + "bcg- Square": "Shapesanity Stitched Mixed", + "bcg- Star": "Shapesanity Stitched Mixed", + "bcg- Windmill": "Shapesanity Stitched Mixed", + "bcpr Circle": "Shapesanity Colorful Full Mixed", + "bcpr Square": "Shapesanity Colorful Full Mixed", + "bcpr Star": "Shapesanity Colorful Full Mixed", + "bcpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpu Circle": "Shapesanity Colorful Full Mixed", + "bcpu Square": "Shapesanity Colorful Full Mixed", + "bcpu Star": "Shapesanity Colorful Full Mixed", + "bcpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpw Circle": "Shapesanity Colorful Full Mixed", + "bcpw Square": "Shapesanity Colorful Full Mixed", + "bcpw Star": "Shapesanity Colorful Full Mixed", + "bcpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpy Circle": "Shapesanity Colorful Full Mixed", + "bcpy Square": "Shapesanity Colorful Full Mixed", + "bcpy Star": "Shapesanity Colorful Full Mixed", + "bcpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcp- Circle": "Shapesanity Stitched Mixed", + "bcp- Square": "Shapesanity Stitched Mixed", + "bcp- Star": "Shapesanity Stitched Mixed", + "bcp- Windmill": "Shapesanity Stitched Mixed", + "bcru Circle": "Shapesanity Colorful Full Mixed", + "bcru Square": "Shapesanity Colorful Full Mixed", + "bcru Star": "Shapesanity Colorful Full Mixed", + "bcru Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcrw Circle": "Shapesanity Colorful Full Mixed", + "bcrw Square": "Shapesanity Colorful Full Mixed", + "bcrw Star": "Shapesanity Colorful Full Mixed", + "bcrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcry Circle": "Shapesanity Colorful Full Mixed", + "bcry Square": "Shapesanity Colorful Full Mixed", + "bcry Star": "Shapesanity Colorful Full Mixed", + "bcry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcr- Circle": "Shapesanity Stitched Mixed", + "bcr- Square": "Shapesanity Stitched Mixed", + "bcr- Star": "Shapesanity Stitched Mixed", + "bcr- Windmill": "Shapesanity Stitched Mixed", + "bcuw Circle": "Shapesanity Colorful Full Mixed", + "bcuw Square": "Shapesanity Colorful Full Mixed", + "bcuw Star": "Shapesanity Colorful Full Mixed", + "bcuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcuy Circle": "Shapesanity Colorful Full Mixed", + "bcuy Square": "Shapesanity Colorful Full Mixed", + "bcuy Star": "Shapesanity Colorful Full Mixed", + "bcuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcu- Circle": "Shapesanity Stitched Mixed", + "bcu- Square": "Shapesanity Stitched Mixed", + "bcu- Star": "Shapesanity Stitched Mixed", + "bcu- Windmill": "Shapesanity Stitched Mixed", + "bcwy Circle": "Shapesanity Colorful Full Mixed", + "bcwy Square": "Shapesanity Colorful Full Mixed", + "bcwy Star": "Shapesanity Colorful Full Mixed", + "bcwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcw- Circle": "Shapesanity Stitched Mixed", + "bcw- Square": "Shapesanity Stitched Mixed", + "bcw- Star": "Shapesanity Stitched Mixed", + "bcw- Windmill": "Shapesanity Stitched Mixed", + "bcy- Circle": "Shapesanity Stitched Mixed", + "bcy- Square": "Shapesanity Stitched Mixed", + "bcy- Star": "Shapesanity Stitched Mixed", + "bcy- Windmill": "Shapesanity Stitched Mixed", + "bgpr Circle": "Shapesanity Colorful Full Mixed", + "bgpr Square": "Shapesanity Colorful Full Mixed", + "bgpr Star": "Shapesanity Colorful Full Mixed", + "bgpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpu Circle": "Shapesanity Colorful Full Mixed", + "bgpu Square": "Shapesanity Colorful Full Mixed", + "bgpu Star": "Shapesanity Colorful Full Mixed", + "bgpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpw Circle": "Shapesanity Colorful Full Mixed", + "bgpw Square": "Shapesanity Colorful Full Mixed", + "bgpw Star": "Shapesanity Colorful Full Mixed", + "bgpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpy Circle": "Shapesanity Colorful Full Mixed", + "bgpy Square": "Shapesanity Colorful Full Mixed", + "bgpy Star": "Shapesanity Colorful Full Mixed", + "bgpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgp- Circle": "Shapesanity Stitched Mixed", + "bgp- Square": "Shapesanity Stitched Mixed", + "bgp- Star": "Shapesanity Stitched Mixed", + "bgp- Windmill": "Shapesanity Stitched Mixed", + "bgru Circle": "Shapesanity Colorful Full Painted", + "bgru Square": "Shapesanity Colorful Full Painted", + "bgru Star": "Shapesanity Colorful Full Painted", + "bgru Windmill": "Shapesanity Colorful East Windmill Painted", + "bgrw Circle": "Shapesanity Colorful Full Mixed", + "bgrw Square": "Shapesanity Colorful Full Mixed", + "bgrw Star": "Shapesanity Colorful Full Mixed", + "bgrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgry Circle": "Shapesanity Colorful Full Mixed", + "bgry Square": "Shapesanity Colorful Full Mixed", + "bgry Star": "Shapesanity Colorful Full Mixed", + "bgry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgr- Circle": "Shapesanity Stitched Painted", + "bgr- Square": "Shapesanity Stitched Painted", + "bgr- Star": "Shapesanity Stitched Painted", + "bgr- Windmill": "Shapesanity Stitched Painted", + "bguw Circle": "Shapesanity Colorful Full Mixed", + "bguw Square": "Shapesanity Colorful Full Mixed", + "bguw Star": "Shapesanity Colorful Full Mixed", + "bguw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bguy Circle": "Shapesanity Colorful Full Mixed", + "bguy Square": "Shapesanity Colorful Full Mixed", + "bguy Star": "Shapesanity Colorful Full Mixed", + "bguy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgu- Circle": "Shapesanity Stitched Painted", + "bgu- Square": "Shapesanity Stitched Painted", + "bgu- Star": "Shapesanity Stitched Painted", + "bgu- Windmill": "Shapesanity Stitched Painted", + "bgwy Circle": "Shapesanity Colorful Full Mixed", + "bgwy Square": "Shapesanity Colorful Full Mixed", + "bgwy Star": "Shapesanity Colorful Full Mixed", + "bgwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgw- Circle": "Shapesanity Stitched Mixed", + "bgw- Square": "Shapesanity Stitched Mixed", + "bgw- Star": "Shapesanity Stitched Mixed", + "bgw- Windmill": "Shapesanity Stitched Mixed", + "bgy- Circle": "Shapesanity Stitched Mixed", + "bgy- Square": "Shapesanity Stitched Mixed", + "bgy- Star": "Shapesanity Stitched Mixed", + "bgy- Windmill": "Shapesanity Stitched Mixed", + "bpru Circle": "Shapesanity Colorful Full Mixed", + "bpru Square": "Shapesanity Colorful Full Mixed", + "bpru Star": "Shapesanity Colorful Full Mixed", + "bpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "bprw Circle": "Shapesanity Colorful Full Mixed", + "bprw Square": "Shapesanity Colorful Full Mixed", + "bprw Star": "Shapesanity Colorful Full Mixed", + "bprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpry Circle": "Shapesanity Colorful Full Mixed", + "bpry Square": "Shapesanity Colorful Full Mixed", + "bpry Star": "Shapesanity Colorful Full Mixed", + "bpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpr- Circle": "Shapesanity Stitched Mixed", + "bpr- Square": "Shapesanity Stitched Mixed", + "bpr- Star": "Shapesanity Stitched Mixed", + "bpr- Windmill": "Shapesanity Stitched Mixed", + "bpuw Circle": "Shapesanity Colorful Full Mixed", + "bpuw Square": "Shapesanity Colorful Full Mixed", + "bpuw Star": "Shapesanity Colorful Full Mixed", + "bpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpuy Circle": "Shapesanity Colorful Full Mixed", + "bpuy Square": "Shapesanity Colorful Full Mixed", + "bpuy Star": "Shapesanity Colorful Full Mixed", + "bpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpu- Circle": "Shapesanity Stitched Mixed", + "bpu- Square": "Shapesanity Stitched Mixed", + "bpu- Star": "Shapesanity Stitched Mixed", + "bpu- Windmill": "Shapesanity Stitched Mixed", + "bpwy Circle": "Shapesanity Colorful Full Mixed", + "bpwy Square": "Shapesanity Colorful Full Mixed", + "bpwy Star": "Shapesanity Colorful Full Mixed", + "bpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpw- Circle": "Shapesanity Stitched Mixed", + "bpw- Square": "Shapesanity Stitched Mixed", + "bpw- Star": "Shapesanity Stitched Mixed", + "bpw- Windmill": "Shapesanity Stitched Mixed", + "bpy- Circle": "Shapesanity Stitched Mixed", + "bpy- Square": "Shapesanity Stitched Mixed", + "bpy- Star": "Shapesanity Stitched Mixed", + "bpy- Windmill": "Shapesanity Stitched Mixed", + "bruw Circle": "Shapesanity Colorful Full Mixed", + "bruw Square": "Shapesanity Colorful Full Mixed", + "bruw Star": "Shapesanity Colorful Full Mixed", + "bruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bruy Circle": "Shapesanity Colorful Full Mixed", + "bruy Square": "Shapesanity Colorful Full Mixed", + "bruy Star": "Shapesanity Colorful Full Mixed", + "bruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bru- Circle": "Shapesanity Stitched Painted", + "bru- Square": "Shapesanity Stitched Painted", + "bru- Star": "Shapesanity Stitched Painted", + "bru- Windmill": "Shapesanity Stitched Painted", + "brwy Circle": "Shapesanity Colorful Full Mixed", + "brwy Square": "Shapesanity Colorful Full Mixed", + "brwy Star": "Shapesanity Colorful Full Mixed", + "brwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "brw- Circle": "Shapesanity Stitched Mixed", + "brw- Square": "Shapesanity Stitched Mixed", + "brw- Star": "Shapesanity Stitched Mixed", + "brw- Windmill": "Shapesanity Stitched Mixed", + "bry- Circle": "Shapesanity Stitched Mixed", + "bry- Square": "Shapesanity Stitched Mixed", + "bry- Star": "Shapesanity Stitched Mixed", + "bry- Windmill": "Shapesanity Stitched Mixed", + "buwy Circle": "Shapesanity Colorful Full Mixed", + "buwy Square": "Shapesanity Colorful Full Mixed", + "buwy Star": "Shapesanity Colorful Full Mixed", + "buwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "buw- Circle": "Shapesanity Stitched Mixed", + "buw- Square": "Shapesanity Stitched Mixed", + "buw- Star": "Shapesanity Stitched Mixed", + "buw- Windmill": "Shapesanity Stitched Mixed", + "buy- Circle": "Shapesanity Stitched Mixed", + "buy- Square": "Shapesanity Stitched Mixed", + "buy- Star": "Shapesanity Stitched Mixed", + "buy- Windmill": "Shapesanity Stitched Mixed", + "bwy- Circle": "Shapesanity Stitched Mixed", + "bwy- Square": "Shapesanity Stitched Mixed", + "bwy- Star": "Shapesanity Stitched Mixed", + "bwy- Windmill": "Shapesanity Stitched Mixed", + "cgpr Circle": "Shapesanity Colorful Full Mixed", + "cgpr Square": "Shapesanity Colorful Full Mixed", + "cgpr Star": "Shapesanity Colorful Full Mixed", + "cgpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpu Circle": "Shapesanity Colorful Full Mixed", + "cgpu Square": "Shapesanity Colorful Full Mixed", + "cgpu Star": "Shapesanity Colorful Full Mixed", + "cgpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpw Circle": "Shapesanity Colorful Full Mixed", + "cgpw Square": "Shapesanity Colorful Full Mixed", + "cgpw Star": "Shapesanity Colorful Full Mixed", + "cgpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpy Circle": "Shapesanity Colorful Full Mixed", + "cgpy Square": "Shapesanity Colorful Full Mixed", + "cgpy Star": "Shapesanity Colorful Full Mixed", + "cgpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgp- Circle": "Shapesanity Stitched Mixed", + "cgp- Square": "Shapesanity Stitched Mixed", + "cgp- Star": "Shapesanity Stitched Mixed", + "cgp- Windmill": "Shapesanity Stitched Mixed", + "cgru Circle": "Shapesanity Colorful Full Mixed", + "cgru Square": "Shapesanity Colorful Full Mixed", + "cgru Star": "Shapesanity Colorful Full Mixed", + "cgru Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgrw Circle": "Shapesanity Colorful Full Mixed", + "cgrw Square": "Shapesanity Colorful Full Mixed", + "cgrw Star": "Shapesanity Colorful Full Mixed", + "cgrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgry Circle": "Shapesanity Colorful Full Mixed", + "cgry Square": "Shapesanity Colorful Full Mixed", + "cgry Star": "Shapesanity Colorful Full Mixed", + "cgry Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgr- Circle": "Shapesanity Stitched Mixed", + "cgr- Square": "Shapesanity Stitched Mixed", + "cgr- Star": "Shapesanity Stitched Mixed", + "cgr- Windmill": "Shapesanity Stitched Mixed", + "cguw Circle": "Shapesanity Colorful Full Mixed", + "cguw Square": "Shapesanity Colorful Full Mixed", + "cguw Star": "Shapesanity Colorful Full Mixed", + "cguw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cguy Circle": "Shapesanity Colorful Full Mixed", + "cguy Square": "Shapesanity Colorful Full Mixed", + "cguy Star": "Shapesanity Colorful Full Mixed", + "cguy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgu- Circle": "Shapesanity Stitched Mixed", + "cgu- Square": "Shapesanity Stitched Mixed", + "cgu- Star": "Shapesanity Stitched Mixed", + "cgu- Windmill": "Shapesanity Stitched Mixed", + "cgwy Circle": "Shapesanity Colorful Full Mixed", + "cgwy Square": "Shapesanity Colorful Full Mixed", + "cgwy Star": "Shapesanity Colorful Full Mixed", + "cgwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgw- Circle": "Shapesanity Stitched Mixed", + "cgw- Square": "Shapesanity Stitched Mixed", + "cgw- Star": "Shapesanity Stitched Mixed", + "cgw- Windmill": "Shapesanity Stitched Mixed", + "cgy- Circle": "Shapesanity Stitched Mixed", + "cgy- Square": "Shapesanity Stitched Mixed", + "cgy- Star": "Shapesanity Stitched Mixed", + "cgy- Windmill": "Shapesanity Stitched Mixed", + "cpru Circle": "Shapesanity Colorful Full Mixed", + "cpru Square": "Shapesanity Colorful Full Mixed", + "cpru Star": "Shapesanity Colorful Full Mixed", + "cpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "cprw Circle": "Shapesanity Colorful Full Mixed", + "cprw Square": "Shapesanity Colorful Full Mixed", + "cprw Star": "Shapesanity Colorful Full Mixed", + "cprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpry Circle": "Shapesanity Colorful Full Mixed", + "cpry Square": "Shapesanity Colorful Full Mixed", + "cpry Star": "Shapesanity Colorful Full Mixed", + "cpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpr- Circle": "Shapesanity Stitched Mixed", + "cpr- Square": "Shapesanity Stitched Mixed", + "cpr- Star": "Shapesanity Stitched Mixed", + "cpr- Windmill": "Shapesanity Stitched Mixed", + "cpuw Circle": "Shapesanity Colorful Full Mixed", + "cpuw Square": "Shapesanity Colorful Full Mixed", + "cpuw Star": "Shapesanity Colorful Full Mixed", + "cpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpuy Circle": "Shapesanity Colorful Full Mixed", + "cpuy Square": "Shapesanity Colorful Full Mixed", + "cpuy Star": "Shapesanity Colorful Full Mixed", + "cpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpu- Circle": "Shapesanity Stitched Mixed", + "cpu- Square": "Shapesanity Stitched Mixed", + "cpu- Star": "Shapesanity Stitched Mixed", + "cpu- Windmill": "Shapesanity Stitched Mixed", + "cpwy Circle": "Shapesanity Colorful Full Mixed", + "cpwy Square": "Shapesanity Colorful Full Mixed", + "cpwy Star": "Shapesanity Colorful Full Mixed", + "cpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpw- Circle": "Shapesanity Stitched Mixed", + "cpw- Square": "Shapesanity Stitched Mixed", + "cpw- Star": "Shapesanity Stitched Mixed", + "cpw- Windmill": "Shapesanity Stitched Mixed", + "cpy- Circle": "Shapesanity Stitched Mixed", + "cpy- Square": "Shapesanity Stitched Mixed", + "cpy- Star": "Shapesanity Stitched Mixed", + "cpy- Windmill": "Shapesanity Stitched Mixed", + "cruw Circle": "Shapesanity Colorful Full Mixed", + "cruw Square": "Shapesanity Colorful Full Mixed", + "cruw Star": "Shapesanity Colorful Full Mixed", + "cruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cruy Circle": "Shapesanity Colorful Full Mixed", + "cruy Square": "Shapesanity Colorful Full Mixed", + "cruy Star": "Shapesanity Colorful Full Mixed", + "cruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cru- Circle": "Shapesanity Stitched Mixed", + "cru- Square": "Shapesanity Stitched Mixed", + "cru- Star": "Shapesanity Stitched Mixed", + "cru- Windmill": "Shapesanity Stitched Mixed", + "crwy Circle": "Shapesanity Colorful Full Mixed", + "crwy Square": "Shapesanity Colorful Full Mixed", + "crwy Star": "Shapesanity Colorful Full Mixed", + "crwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "crw- Circle": "Shapesanity Stitched Mixed", + "crw- Square": "Shapesanity Stitched Mixed", + "crw- Star": "Shapesanity Stitched Mixed", + "crw- Windmill": "Shapesanity Stitched Mixed", + "cry- Circle": "Shapesanity Stitched Mixed", + "cry- Square": "Shapesanity Stitched Mixed", + "cry- Star": "Shapesanity Stitched Mixed", + "cry- Windmill": "Shapesanity Stitched Mixed", + "cuwy Circle": "Shapesanity Colorful Full Mixed", + "cuwy Square": "Shapesanity Colorful Full Mixed", + "cuwy Star": "Shapesanity Colorful Full Mixed", + "cuwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cuw- Circle": "Shapesanity Stitched Mixed", + "cuw- Square": "Shapesanity Stitched Mixed", + "cuw- Star": "Shapesanity Stitched Mixed", + "cuw- Windmill": "Shapesanity Stitched Mixed", + "cuy- Circle": "Shapesanity Stitched Mixed", + "cuy- Square": "Shapesanity Stitched Mixed", + "cuy- Star": "Shapesanity Stitched Mixed", + "cuy- Windmill": "Shapesanity Stitched Mixed", + "cwy- Circle": "Shapesanity Stitched Mixed", + "cwy- Square": "Shapesanity Stitched Mixed", + "cwy- Star": "Shapesanity Stitched Mixed", + "cwy- Windmill": "Shapesanity Stitched Mixed", + "gpru Circle": "Shapesanity Colorful Full Mixed", + "gpru Square": "Shapesanity Colorful Full Mixed", + "gpru Star": "Shapesanity Colorful Full Mixed", + "gpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "gprw Circle": "Shapesanity Colorful Full Mixed", + "gprw Square": "Shapesanity Colorful Full Mixed", + "gprw Star": "Shapesanity Colorful Full Mixed", + "gprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpry Circle": "Shapesanity Colorful Full Mixed", + "gpry Square": "Shapesanity Colorful Full Mixed", + "gpry Star": "Shapesanity Colorful Full Mixed", + "gpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpr- Circle": "Shapesanity Stitched Mixed", + "gpr- Square": "Shapesanity Stitched Mixed", + "gpr- Star": "Shapesanity Stitched Mixed", + "gpr- Windmill": "Shapesanity Stitched Mixed", + "gpuw Circle": "Shapesanity Colorful Full Mixed", + "gpuw Square": "Shapesanity Colorful Full Mixed", + "gpuw Star": "Shapesanity Colorful Full Mixed", + "gpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpuy Circle": "Shapesanity Colorful Full Mixed", + "gpuy Square": "Shapesanity Colorful Full Mixed", + "gpuy Star": "Shapesanity Colorful Full Mixed", + "gpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpu- Circle": "Shapesanity Stitched Mixed", + "gpu- Square": "Shapesanity Stitched Mixed", + "gpu- Star": "Shapesanity Stitched Mixed", + "gpu- Windmill": "Shapesanity Stitched Mixed", + "gpwy Circle": "Shapesanity Colorful Full Mixed", + "gpwy Square": "Shapesanity Colorful Full Mixed", + "gpwy Star": "Shapesanity Colorful Full Mixed", + "gpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpw- Circle": "Shapesanity Stitched Mixed", + "gpw- Square": "Shapesanity Stitched Mixed", + "gpw- Star": "Shapesanity Stitched Mixed", + "gpw- Windmill": "Shapesanity Stitched Mixed", + "gpy- Circle": "Shapesanity Stitched Mixed", + "gpy- Square": "Shapesanity Stitched Mixed", + "gpy- Star": "Shapesanity Stitched Mixed", + "gpy- Windmill": "Shapesanity Stitched Mixed", + "gruw Circle": "Shapesanity Colorful Full Mixed", + "gruw Square": "Shapesanity Colorful Full Mixed", + "gruw Star": "Shapesanity Colorful Full Mixed", + "gruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gruy Circle": "Shapesanity Colorful Full Mixed", + "gruy Square": "Shapesanity Colorful Full Mixed", + "gruy Star": "Shapesanity Colorful Full Mixed", + "gruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gru- Circle": "Shapesanity Stitched Painted", + "gru- Square": "Shapesanity Stitched Painted", + "gru- Star": "Shapesanity Stitched Painted", + "gru- Windmill": "Shapesanity Stitched Painted", + "grwy Circle": "Shapesanity Colorful Full Mixed", + "grwy Square": "Shapesanity Colorful Full Mixed", + "grwy Star": "Shapesanity Colorful Full Mixed", + "grwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "grw- Circle": "Shapesanity Stitched Mixed", + "grw- Square": "Shapesanity Stitched Mixed", + "grw- Star": "Shapesanity Stitched Mixed", + "grw- Windmill": "Shapesanity Stitched Mixed", + "gry- Circle": "Shapesanity Stitched Mixed", + "gry- Square": "Shapesanity Stitched Mixed", + "gry- Star": "Shapesanity Stitched Mixed", + "gry- Windmill": "Shapesanity Stitched Mixed", + "guwy Circle": "Shapesanity Colorful Full Mixed", + "guwy Square": "Shapesanity Colorful Full Mixed", + "guwy Star": "Shapesanity Colorful Full Mixed", + "guwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "guw- Circle": "Shapesanity Stitched Mixed", + "guw- Square": "Shapesanity Stitched Mixed", + "guw- Star": "Shapesanity Stitched Mixed", + "guw- Windmill": "Shapesanity Stitched Mixed", + "guy- Circle": "Shapesanity Stitched Mixed", + "guy- Square": "Shapesanity Stitched Mixed", + "guy- Star": "Shapesanity Stitched Mixed", + "guy- Windmill": "Shapesanity Stitched Mixed", + "gwy- Circle": "Shapesanity Stitched Mixed", + "gwy- Square": "Shapesanity Stitched Mixed", + "gwy- Star": "Shapesanity Stitched Mixed", + "gwy- Windmill": "Shapesanity Stitched Mixed", + "pruw Circle": "Shapesanity Colorful Full Mixed", + "pruw Square": "Shapesanity Colorful Full Mixed", + "pruw Star": "Shapesanity Colorful Full Mixed", + "pruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "pruy Circle": "Shapesanity Colorful Full Mixed", + "pruy Square": "Shapesanity Colorful Full Mixed", + "pruy Star": "Shapesanity Colorful Full Mixed", + "pruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "pru- Circle": "Shapesanity Stitched Mixed", + "pru- Square": "Shapesanity Stitched Mixed", + "pru- Star": "Shapesanity Stitched Mixed", + "pru- Windmill": "Shapesanity Stitched Mixed", + "prwy Circle": "Shapesanity Colorful Full Mixed", + "prwy Square": "Shapesanity Colorful Full Mixed", + "prwy Star": "Shapesanity Colorful Full Mixed", + "prwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "prw- Circle": "Shapesanity Stitched Mixed", + "prw- Square": "Shapesanity Stitched Mixed", + "prw- Star": "Shapesanity Stitched Mixed", + "prw- Windmill": "Shapesanity Stitched Mixed", + "pry- Circle": "Shapesanity Stitched Mixed", + "pry- Square": "Shapesanity Stitched Mixed", + "pry- Star": "Shapesanity Stitched Mixed", + "pry- Windmill": "Shapesanity Stitched Mixed", + "puwy Circle": "Shapesanity Colorful Full Mixed", + "puwy Square": "Shapesanity Colorful Full Mixed", + "puwy Star": "Shapesanity Colorful Full Mixed", + "puwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "puw- Circle": "Shapesanity Stitched Mixed", + "puw- Square": "Shapesanity Stitched Mixed", + "puw- Star": "Shapesanity Stitched Mixed", + "puw- Windmill": "Shapesanity Stitched Mixed", + "puy- Circle": "Shapesanity Stitched Mixed", + "puy- Square": "Shapesanity Stitched Mixed", + "puy- Star": "Shapesanity Stitched Mixed", + "puy- Windmill": "Shapesanity Stitched Mixed", + "pwy- Circle": "Shapesanity Stitched Mixed", + "pwy- Square": "Shapesanity Stitched Mixed", + "pwy- Star": "Shapesanity Stitched Mixed", + "pwy- Windmill": "Shapesanity Stitched Mixed", + "ruwy Circle": "Shapesanity Colorful Full Mixed", + "ruwy Square": "Shapesanity Colorful Full Mixed", + "ruwy Star": "Shapesanity Colorful Full Mixed", + "ruwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "ruw- Circle": "Shapesanity Stitched Mixed", + "ruw- Square": "Shapesanity Stitched Mixed", + "ruw- Star": "Shapesanity Stitched Mixed", + "ruw- Windmill": "Shapesanity Stitched Mixed", + "ruy- Circle": "Shapesanity Stitched Mixed", + "ruy- Square": "Shapesanity Stitched Mixed", + "ruy- Star": "Shapesanity Stitched Mixed", + "ruy- Windmill": "Shapesanity Stitched Mixed", + "rwy- Circle": "Shapesanity Stitched Mixed", + "rwy- Square": "Shapesanity Stitched Mixed", + "rwy- Star": "Shapesanity Stitched Mixed", + "rwy- Windmill": "Shapesanity Stitched Mixed", + "uwy- Circle": "Shapesanity Stitched Mixed", + "uwy- Square": "Shapesanity Stitched Mixed", + "uwy- Star": "Shapesanity Stitched Mixed", + "uwy- Windmill": "Shapesanity Stitched Mixed", + "Red CRSW": "Shapesanity Stitched Painted", + "Blue CRSW": "Shapesanity Stitched Painted", + "Green CRSW": "Shapesanity Stitched Painted", + "Yellow CRSW": "Shapesanity Stitched Mixed", + "Purple CRSW": "Shapesanity Stitched Mixed", + "Cyan CRSW": "Shapesanity Stitched Mixed", + "White CRSW": "Shapesanity Stitched Mixed", + "Uncolored CRSW": "Shapesanity Stitched Uncolored", + "Red CRS-": "Shapesanity Stitched Painted", + "Blue CRS-": "Shapesanity Stitched Painted", + "Green CRS-": "Shapesanity Stitched Painted", + "Yellow CRS-": "Shapesanity Stitched Mixed", + "Purple CRS-": "Shapesanity Stitched Mixed", + "Cyan CRS-": "Shapesanity Stitched Mixed", + "White CRS-": "Shapesanity Stitched Mixed", + "Uncolored CRS-": "Shapesanity Stitched Uncolored", + "Red CRW-": "Shapesanity Stitched Painted", + "Blue CRW-": "Shapesanity Stitched Painted", + "Green CRW-": "Shapesanity Stitched Painted", + "Yellow CRW-": "Shapesanity Stitched Mixed", + "Purple CRW-": "Shapesanity Stitched Mixed", + "Cyan CRW-": "Shapesanity Stitched Mixed", + "White CRW-": "Shapesanity Stitched Mixed", + "Uncolored CRW-": "Shapesanity Stitched Uncolored", + "Red CSW-": "Shapesanity Stitched Painted", + "Blue CSW-": "Shapesanity Stitched Painted", + "Green CSW-": "Shapesanity Stitched Painted", + "Yellow CSW-": "Shapesanity Stitched Mixed", + "Purple CSW-": "Shapesanity Stitched Mixed", + "Cyan CSW-": "Shapesanity Stitched Mixed", + "White CSW-": "Shapesanity Stitched Mixed", + "Uncolored CSW-": "Shapesanity Stitched Uncolored", + "Red RSW-": "Shapesanity Stitched Painted", + "Blue RSW-": "Shapesanity Stitched Painted", + "Green RSW-": "Shapesanity Stitched Painted", + "Yellow RSW-": "Shapesanity Stitched Mixed", + "Purple RSW-": "Shapesanity Stitched Mixed", + "Cyan RSW-": "Shapesanity Stitched Mixed", + "White RSW-": "Shapesanity Stitched Mixed", + "Uncolored RSW-": "Shapesanity Stitched Uncolored", +} + +shapesanity_two_sided = { + "3-1 Cb Cc": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cc": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cc": "Shapesanity Stitched Mixed", + "3-1 Cb Cg": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cg": "Shapesanity Colorful Full Painted", + "Checkered Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cg": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cg": "Shapesanity Stitched Painted", + "3-1 Cb Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cp": "Shapesanity Stitched Mixed", + "3-1 Cb Cr": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cr": "Shapesanity Colorful Full Painted", + "Checkered Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cr": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cr": "Shapesanity Stitched Painted", + "3-1 Cb Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cu": "Shapesanity Colorful Full Painted", + "Checkered Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cu": "Shapesanity Stitched Painted", + "3-1 Cb Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cw": "Shapesanity Stitched Mixed", + "3-1 Cb Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cy": "Shapesanity Stitched Mixed", + "3-1 Cb Rb": "Shapesanity Stitched Painted", + "Half-Half Cb Rb": "Shapesanity Half-Half Painted", + "Checkered Cb Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rb": "Shapesanity Stitched Painted", + "3-1 Cb Rc": "Shapesanity Stitched Mixed", + "Half-Half Cb Rc": "Shapesanity Half-Half Mixed", + "Checkered Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rc": "Shapesanity Stitched Mixed", + "3-1 Cb Rg": "Shapesanity Stitched Painted", + "Half-Half Cb Rg": "Shapesanity Half-Half Painted", + "Checkered Cb Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rg": "Shapesanity Stitched Painted", + "3-1 Cb Rp": "Shapesanity Stitched Mixed", + "Half-Half Cb Rp": "Shapesanity Half-Half Mixed", + "Checkered Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rp": "Shapesanity Stitched Mixed", + "3-1 Cb Rr": "Shapesanity Stitched Painted", + "Half-Half Cb Rr": "Shapesanity Half-Half Painted", + "Checkered Cb Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rr": "Shapesanity Stitched Painted", + "3-1 Cb Ru": "Shapesanity Stitched Painted", + "Half-Half Cb Ru": "Shapesanity Half-Half Painted", + "Checkered Cb Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Ru": "Shapesanity Stitched Painted", + "3-1 Cb Rw": "Shapesanity Stitched Mixed", + "Half-Half Cb Rw": "Shapesanity Half-Half Mixed", + "Checkered Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rw": "Shapesanity Stitched Mixed", + "3-1 Cb Ry": "Shapesanity Stitched Mixed", + "Half-Half Cb Ry": "Shapesanity Half-Half Mixed", + "Checkered Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Ry": "Shapesanity Stitched Mixed", + "3-1 Cb Sb": "Shapesanity Stitched Painted", + "Half-Half Cb Sb": "Shapesanity Half-Half Painted", + "Checkered Cb Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sb": "Shapesanity Stitched Painted", + "3-1 Cb Sc": "Shapesanity Stitched Mixed", + "Half-Half Cb Sc": "Shapesanity Half-Half Mixed", + "Checkered Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sc": "Shapesanity Stitched Mixed", + "3-1 Cb Sg": "Shapesanity Stitched Painted", + "Half-Half Cb Sg": "Shapesanity Half-Half Painted", + "Checkered Cb Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sg": "Shapesanity Stitched Painted", + "3-1 Cb Sp": "Shapesanity Stitched Mixed", + "Half-Half Cb Sp": "Shapesanity Half-Half Mixed", + "Checkered Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sp": "Shapesanity Stitched Mixed", + "3-1 Cb Sr": "Shapesanity Stitched Painted", + "Half-Half Cb Sr": "Shapesanity Half-Half Painted", + "Checkered Cb Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sr": "Shapesanity Stitched Painted", + "3-1 Cb Su": "Shapesanity Stitched Painted", + "Half-Half Cb Su": "Shapesanity Half-Half Painted", + "Checkered Cb Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Su": "Shapesanity Stitched Painted", + "Cornered Singles Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Su": "Shapesanity Stitched Painted", + "3-1 Cb Sw": "Shapesanity Stitched Mixed", + "Half-Half Cb Sw": "Shapesanity Half-Half Mixed", + "Checkered Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sw": "Shapesanity Stitched Mixed", + "3-1 Cb Sy": "Shapesanity Stitched Mixed", + "Half-Half Cb Sy": "Shapesanity Half-Half Mixed", + "Checkered Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sy": "Shapesanity Stitched Mixed", + "3-1 Cb Wb": "Shapesanity Stitched Painted", + "Half-Half Cb Wb": "Shapesanity Half-Half Painted", + "Checkered Cb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wb": "Shapesanity Stitched Painted", + "3-1 Cb Wc": "Shapesanity Stitched Mixed", + "Half-Half Cb Wc": "Shapesanity Half-Half Mixed", + "Checkered Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wc": "Shapesanity Stitched Mixed", + "3-1 Cb Wg": "Shapesanity Stitched Painted", + "Half-Half Cb Wg": "Shapesanity Half-Half Painted", + "Checkered Cb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wg": "Shapesanity Stitched Painted", + "3-1 Cb Wp": "Shapesanity Stitched Mixed", + "Half-Half Cb Wp": "Shapesanity Half-Half Mixed", + "Checkered Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wp": "Shapesanity Stitched Mixed", + "3-1 Cb Wr": "Shapesanity Stitched Painted", + "Half-Half Cb Wr": "Shapesanity Half-Half Painted", + "Checkered Cb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wr": "Shapesanity Stitched Painted", + "3-1 Cb Wu": "Shapesanity Stitched Painted", + "Half-Half Cb Wu": "Shapesanity Half-Half Painted", + "Checkered Cb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wu": "Shapesanity Stitched Painted", + "3-1 Cb Ww": "Shapesanity Stitched Mixed", + "Half-Half Cb Ww": "Shapesanity Half-Half Mixed", + "Checkered Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Ww": "Shapesanity Stitched Mixed", + "3-1 Cb Wy": "Shapesanity Stitched Mixed", + "Half-Half Cb Wy": "Shapesanity Half-Half Mixed", + "Checkered Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wy": "Shapesanity Stitched Mixed", + "3-1 Cc Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cb": "Shapesanity Stitched Mixed", + "3-1 Cc Cg": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cg": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cg": "Shapesanity Stitched Mixed", + "3-1 Cc Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cp": "Shapesanity Stitched Mixed", + "3-1 Cc Cr": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cr": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cr": "Shapesanity Stitched Mixed", + "3-1 Cc Cu": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cu": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cu": "Shapesanity Stitched Mixed", + "3-1 Cc Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cw": "Shapesanity Stitched Mixed", + "3-1 Cc Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cy": "Shapesanity Stitched Mixed", + "3-1 Cc Rb": "Shapesanity Stitched Mixed", + "Half-Half Cc Rb": "Shapesanity Half-Half Mixed", + "Checkered Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rb": "Shapesanity Stitched Mixed", + "3-1 Cc Rc": "Shapesanity Stitched Mixed", + "Half-Half Cc Rc": "Shapesanity Half-Half Mixed", + "Checkered Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rc": "Shapesanity Stitched Mixed", + "3-1 Cc Rg": "Shapesanity Stitched Mixed", + "Half-Half Cc Rg": "Shapesanity Half-Half Mixed", + "Checkered Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rg": "Shapesanity Stitched Mixed", + "3-1 Cc Rp": "Shapesanity Stitched Mixed", + "Half-Half Cc Rp": "Shapesanity Half-Half Mixed", + "Checkered Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rp": "Shapesanity Stitched Mixed", + "3-1 Cc Rr": "Shapesanity Stitched Mixed", + "Half-Half Cc Rr": "Shapesanity Half-Half Mixed", + "Checkered Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rr": "Shapesanity Stitched Mixed", + "3-1 Cc Ru": "Shapesanity Stitched Mixed", + "Half-Half Cc Ru": "Shapesanity Half-Half Mixed", + "Checkered Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ru": "Shapesanity Stitched Mixed", + "3-1 Cc Rw": "Shapesanity Stitched Mixed", + "Half-Half Cc Rw": "Shapesanity Half-Half Mixed", + "Checkered Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rw": "Shapesanity Stitched Mixed", + "3-1 Cc Ry": "Shapesanity Stitched Mixed", + "Half-Half Cc Ry": "Shapesanity Half-Half Mixed", + "Checkered Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ry": "Shapesanity Stitched Mixed", + "3-1 Cc Sb": "Shapesanity Stitched Mixed", + "Half-Half Cc Sb": "Shapesanity Half-Half Mixed", + "Checkered Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sb": "Shapesanity Stitched Mixed", + "3-1 Cc Sc": "Shapesanity Stitched Mixed", + "Half-Half Cc Sc": "Shapesanity Half-Half Mixed", + "Checkered Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sc": "Shapesanity Stitched Mixed", + "3-1 Cc Sg": "Shapesanity Stitched Mixed", + "Half-Half Cc Sg": "Shapesanity Half-Half Mixed", + "Checkered Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sg": "Shapesanity Stitched Mixed", + "3-1 Cc Sp": "Shapesanity Stitched Mixed", + "Half-Half Cc Sp": "Shapesanity Half-Half Mixed", + "Checkered Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sp": "Shapesanity Stitched Mixed", + "3-1 Cc Sr": "Shapesanity Stitched Mixed", + "Half-Half Cc Sr": "Shapesanity Half-Half Mixed", + "Checkered Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sr": "Shapesanity Stitched Mixed", + "3-1 Cc Su": "Shapesanity Stitched Mixed", + "Half-Half Cc Su": "Shapesanity Half-Half Mixed", + "Checkered Cc Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Su": "Shapesanity Stitched Mixed", + "3-1 Cc Sw": "Shapesanity Stitched Mixed", + "Half-Half Cc Sw": "Shapesanity Half-Half Mixed", + "Checkered Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sw": "Shapesanity Stitched Mixed", + "3-1 Cc Sy": "Shapesanity Stitched Mixed", + "Half-Half Cc Sy": "Shapesanity Half-Half Mixed", + "Checkered Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sy": "Shapesanity Stitched Mixed", + "3-1 Cc Wb": "Shapesanity Stitched Mixed", + "Half-Half Cc Wb": "Shapesanity Half-Half Mixed", + "Checkered Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wb": "Shapesanity Stitched Mixed", + "3-1 Cc Wc": "Shapesanity Stitched Mixed", + "Half-Half Cc Wc": "Shapesanity Half-Half Mixed", + "Checkered Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wc": "Shapesanity Stitched Mixed", + "3-1 Cc Wg": "Shapesanity Stitched Mixed", + "Half-Half Cc Wg": "Shapesanity Half-Half Mixed", + "Checkered Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wg": "Shapesanity Stitched Mixed", + "3-1 Cc Wp": "Shapesanity Stitched Mixed", + "Half-Half Cc Wp": "Shapesanity Half-Half Mixed", + "Checkered Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wp": "Shapesanity Stitched Mixed", + "3-1 Cc Wr": "Shapesanity Stitched Mixed", + "Half-Half Cc Wr": "Shapesanity Half-Half Mixed", + "Checkered Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wr": "Shapesanity Stitched Mixed", + "3-1 Cc Wu": "Shapesanity Stitched Mixed", + "Half-Half Cc Wu": "Shapesanity Half-Half Mixed", + "Checkered Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wu": "Shapesanity Stitched Mixed", + "3-1 Cc Ww": "Shapesanity Stitched Mixed", + "Half-Half Cc Ww": "Shapesanity Half-Half Mixed", + "Checkered Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ww": "Shapesanity Stitched Mixed", + "3-1 Cc Wy": "Shapesanity Stitched Mixed", + "Half-Half Cc Wy": "Shapesanity Half-Half Mixed", + "Checkered Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wy": "Shapesanity Stitched Mixed", + "3-1 Cg Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cb": "Shapesanity Stitched Painted", + "3-1 Cg Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cc": "Shapesanity Stitched Mixed", + "3-1 Cg Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cp": "Shapesanity Stitched Mixed", + "3-1 Cg Cr": "Shapesanity Colorful Full Painted", + "Half-Half Cg Cr": "Shapesanity Colorful Full Painted", + "Checkered Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cg Cr": "Shapesanity Colorful Half Painted", + "Cornered Singles Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cr": "Shapesanity Stitched Painted", + "3-1 Cg Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cg Cu": "Shapesanity Colorful Full Painted", + "Checkered Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cg Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cu": "Shapesanity Stitched Painted", + "3-1 Cg Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cw": "Shapesanity Stitched Mixed", + "3-1 Cg Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cy": "Shapesanity Stitched Mixed", + "3-1 Cg Rb": "Shapesanity Stitched Painted", + "Half-Half Cg Rb": "Shapesanity Half-Half Painted", + "Checkered Cg Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rb": "Shapesanity Stitched Painted", + "3-1 Cg Rc": "Shapesanity Stitched Mixed", + "Half-Half Cg Rc": "Shapesanity Half-Half Mixed", + "Checkered Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rc": "Shapesanity Stitched Mixed", + "3-1 Cg Rg": "Shapesanity Stitched Painted", + "Half-Half Cg Rg": "Shapesanity Half-Half Painted", + "Checkered Cg Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rg": "Shapesanity Stitched Painted", + "3-1 Cg Rp": "Shapesanity Stitched Mixed", + "Half-Half Cg Rp": "Shapesanity Half-Half Mixed", + "Checkered Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rp": "Shapesanity Stitched Mixed", + "3-1 Cg Rr": "Shapesanity Stitched Painted", + "Half-Half Cg Rr": "Shapesanity Half-Half Painted", + "Checkered Cg Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rr": "Shapesanity Stitched Painted", + "3-1 Cg Ru": "Shapesanity Stitched Painted", + "Half-Half Cg Ru": "Shapesanity Half-Half Painted", + "Checkered Cg Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Ru": "Shapesanity Stitched Painted", + "3-1 Cg Rw": "Shapesanity Stitched Mixed", + "Half-Half Cg Rw": "Shapesanity Half-Half Mixed", + "Checkered Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rw": "Shapesanity Stitched Mixed", + "3-1 Cg Ry": "Shapesanity Stitched Mixed", + "Half-Half Cg Ry": "Shapesanity Half-Half Mixed", + "Checkered Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Ry": "Shapesanity Stitched Mixed", + "3-1 Cg Sb": "Shapesanity Stitched Painted", + "Half-Half Cg Sb": "Shapesanity Half-Half Painted", + "Checkered Cg Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sb": "Shapesanity Stitched Painted", + "3-1 Cg Sc": "Shapesanity Stitched Mixed", + "Half-Half Cg Sc": "Shapesanity Half-Half Mixed", + "Checkered Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sc": "Shapesanity Stitched Mixed", + "3-1 Cg Sg": "Shapesanity Stitched Painted", + "Half-Half Cg Sg": "Shapesanity Half-Half Painted", + "Checkered Cg Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sg": "Shapesanity Stitched Painted", + "3-1 Cg Sp": "Shapesanity Stitched Mixed", + "Half-Half Cg Sp": "Shapesanity Half-Half Mixed", + "Checkered Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sp": "Shapesanity Stitched Mixed", + "3-1 Cg Sr": "Shapesanity Stitched Painted", + "Half-Half Cg Sr": "Shapesanity Half-Half Painted", + "Checkered Cg Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sr": "Shapesanity Stitched Painted", + "3-1 Cg Su": "Shapesanity Stitched Painted", + "Half-Half Cg Su": "Shapesanity Half-Half Painted", + "Checkered Cg Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Su": "Shapesanity Stitched Painted", + "Cornered Singles Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Su": "Shapesanity Stitched Painted", + "3-1 Cg Sw": "Shapesanity Stitched Mixed", + "Half-Half Cg Sw": "Shapesanity Half-Half Mixed", + "Checkered Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sw": "Shapesanity Stitched Mixed", + "3-1 Cg Sy": "Shapesanity Stitched Mixed", + "Half-Half Cg Sy": "Shapesanity Half-Half Mixed", + "Checkered Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sy": "Shapesanity Stitched Mixed", + "3-1 Cg Wb": "Shapesanity Stitched Painted", + "Half-Half Cg Wb": "Shapesanity Half-Half Painted", + "Checkered Cg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wb": "Shapesanity Stitched Painted", + "3-1 Cg Wc": "Shapesanity Stitched Mixed", + "Half-Half Cg Wc": "Shapesanity Half-Half Mixed", + "Checkered Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wc": "Shapesanity Stitched Mixed", + "3-1 Cg Wg": "Shapesanity Stitched Painted", + "Half-Half Cg Wg": "Shapesanity Half-Half Painted", + "Checkered Cg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wg": "Shapesanity Stitched Painted", + "3-1 Cg Wp": "Shapesanity Stitched Mixed", + "Half-Half Cg Wp": "Shapesanity Half-Half Mixed", + "Checkered Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wp": "Shapesanity Stitched Mixed", + "3-1 Cg Wr": "Shapesanity Stitched Painted", + "Half-Half Cg Wr": "Shapesanity Half-Half Painted", + "Checkered Cg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wr": "Shapesanity Stitched Painted", + "3-1 Cg Wu": "Shapesanity Stitched Painted", + "Half-Half Cg Wu": "Shapesanity Half-Half Painted", + "Checkered Cg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wu": "Shapesanity Stitched Painted", + "3-1 Cg Ww": "Shapesanity Stitched Mixed", + "Half-Half Cg Ww": "Shapesanity Half-Half Mixed", + "Checkered Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Ww": "Shapesanity Stitched Mixed", + "3-1 Cg Wy": "Shapesanity Stitched Mixed", + "Half-Half Cg Wy": "Shapesanity Half-Half Mixed", + "Checkered Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wy": "Shapesanity Stitched Mixed", + "3-1 Cp Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cb": "Shapesanity Stitched Mixed", + "3-1 Cp Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cc": "Shapesanity Stitched Mixed", + "3-1 Cp Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cg": "Shapesanity Stitched Mixed", + "3-1 Cp Cr": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cr": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cr": "Shapesanity Stitched Mixed", + "3-1 Cp Cu": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cu": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cu": "Shapesanity Stitched Mixed", + "3-1 Cp Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cw": "Shapesanity Stitched Mixed", + "3-1 Cp Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cy": "Shapesanity Stitched Mixed", + "3-1 Cp Rb": "Shapesanity Stitched Mixed", + "Half-Half Cp Rb": "Shapesanity Half-Half Mixed", + "Checkered Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rb": "Shapesanity Stitched Mixed", + "3-1 Cp Rc": "Shapesanity Stitched Mixed", + "Half-Half Cp Rc": "Shapesanity Half-Half Mixed", + "Checkered Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rc": "Shapesanity Stitched Mixed", + "3-1 Cp Rg": "Shapesanity Stitched Mixed", + "Half-Half Cp Rg": "Shapesanity Half-Half Mixed", + "Checkered Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rg": "Shapesanity Stitched Mixed", + "3-1 Cp Rp": "Shapesanity Stitched Mixed", + "Half-Half Cp Rp": "Shapesanity Half-Half Mixed", + "Checkered Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rp": "Shapesanity Stitched Mixed", + "3-1 Cp Rr": "Shapesanity Stitched Mixed", + "Half-Half Cp Rr": "Shapesanity Half-Half Mixed", + "Checkered Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rr": "Shapesanity Stitched Mixed", + "3-1 Cp Ru": "Shapesanity Stitched Mixed", + "Half-Half Cp Ru": "Shapesanity Half-Half Mixed", + "Checkered Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ru": "Shapesanity Stitched Mixed", + "3-1 Cp Rw": "Shapesanity Stitched Mixed", + "Half-Half Cp Rw": "Shapesanity Half-Half Mixed", + "Checkered Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rw": "Shapesanity Stitched Mixed", + "3-1 Cp Ry": "Shapesanity Stitched Mixed", + "Half-Half Cp Ry": "Shapesanity Half-Half Mixed", + "Checkered Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ry": "Shapesanity Stitched Mixed", + "3-1 Cp Sb": "Shapesanity Stitched Mixed", + "Half-Half Cp Sb": "Shapesanity Half-Half Mixed", + "Checkered Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sb": "Shapesanity Stitched Mixed", + "3-1 Cp Sc": "Shapesanity Stitched Mixed", + "Half-Half Cp Sc": "Shapesanity Half-Half Mixed", + "Checkered Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sc": "Shapesanity Stitched Mixed", + "3-1 Cp Sg": "Shapesanity Stitched Mixed", + "Half-Half Cp Sg": "Shapesanity Half-Half Mixed", + "Checkered Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sg": "Shapesanity Stitched Mixed", + "3-1 Cp Sp": "Shapesanity Stitched Mixed", + "Half-Half Cp Sp": "Shapesanity Half-Half Mixed", + "Checkered Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sp": "Shapesanity Stitched Mixed", + "3-1 Cp Sr": "Shapesanity Stitched Mixed", + "Half-Half Cp Sr": "Shapesanity Half-Half Mixed", + "Checkered Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sr": "Shapesanity Stitched Mixed", + "3-1 Cp Su": "Shapesanity Stitched Mixed", + "Half-Half Cp Su": "Shapesanity Half-Half Mixed", + "Checkered Cp Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Su": "Shapesanity Stitched Mixed", + "3-1 Cp Sw": "Shapesanity Stitched Mixed", + "Half-Half Cp Sw": "Shapesanity Half-Half Mixed", + "Checkered Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sw": "Shapesanity Stitched Mixed", + "3-1 Cp Sy": "Shapesanity Stitched Mixed", + "Half-Half Cp Sy": "Shapesanity Half-Half Mixed", + "Checkered Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sy": "Shapesanity Stitched Mixed", + "3-1 Cp Wb": "Shapesanity Stitched Mixed", + "Half-Half Cp Wb": "Shapesanity Half-Half Mixed", + "Checkered Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wb": "Shapesanity Stitched Mixed", + "3-1 Cp Wc": "Shapesanity Stitched Mixed", + "Half-Half Cp Wc": "Shapesanity Half-Half Mixed", + "Checkered Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wc": "Shapesanity Stitched Mixed", + "3-1 Cp Wg": "Shapesanity Stitched Mixed", + "Half-Half Cp Wg": "Shapesanity Half-Half Mixed", + "Checkered Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wg": "Shapesanity Stitched Mixed", + "3-1 Cp Wp": "Shapesanity Stitched Mixed", + "Half-Half Cp Wp": "Shapesanity Half-Half Mixed", + "Checkered Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wp": "Shapesanity Stitched Mixed", + "3-1 Cp Wr": "Shapesanity Stitched Mixed", + "Half-Half Cp Wr": "Shapesanity Half-Half Mixed", + "Checkered Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wr": "Shapesanity Stitched Mixed", + "3-1 Cp Wu": "Shapesanity Stitched Mixed", + "Half-Half Cp Wu": "Shapesanity Half-Half Mixed", + "Checkered Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wu": "Shapesanity Stitched Mixed", + "3-1 Cp Ww": "Shapesanity Stitched Mixed", + "Half-Half Cp Ww": "Shapesanity Half-Half Mixed", + "Checkered Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ww": "Shapesanity Stitched Mixed", + "3-1 Cp Wy": "Shapesanity Stitched Mixed", + "Half-Half Cp Wy": "Shapesanity Half-Half Mixed", + "Checkered Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wy": "Shapesanity Stitched Mixed", + "3-1 Cr Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cb": "Shapesanity Stitched Painted", + "3-1 Cr Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cc": "Shapesanity Stitched Mixed", + "3-1 Cr Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cg": "Shapesanity Stitched Painted", + "3-1 Cr Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cp": "Shapesanity Stitched Mixed", + "3-1 Cr Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cr Cu": "Shapesanity Colorful Full Painted", + "Checkered Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cr Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cu": "Shapesanity Stitched Painted", + "3-1 Cr Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cr Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cr Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cw": "Shapesanity Stitched Mixed", + "3-1 Cr Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cr Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cr Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cy": "Shapesanity Stitched Mixed", + "3-1 Cr Rb": "Shapesanity Stitched Painted", + "Half-Half Cr Rb": "Shapesanity Half-Half Painted", + "Checkered Cr Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rb": "Shapesanity Stitched Painted", + "3-1 Cr Rc": "Shapesanity Stitched Mixed", + "Half-Half Cr Rc": "Shapesanity Half-Half Mixed", + "Checkered Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rc": "Shapesanity Stitched Mixed", + "3-1 Cr Rg": "Shapesanity Stitched Painted", + "Half-Half Cr Rg": "Shapesanity Half-Half Painted", + "Checkered Cr Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rg": "Shapesanity Stitched Painted", + "3-1 Cr Rp": "Shapesanity Stitched Mixed", + "Half-Half Cr Rp": "Shapesanity Half-Half Mixed", + "Checkered Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rp": "Shapesanity Stitched Mixed", + "3-1 Cr Rr": "Shapesanity Stitched Painted", + "Half-Half Cr Rr": "Shapesanity Half-Half Painted", + "Checkered Cr Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rr": "Shapesanity Stitched Painted", + "3-1 Cr Ru": "Shapesanity Stitched Painted", + "Half-Half Cr Ru": "Shapesanity Half-Half Painted", + "Checkered Cr Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Ru": "Shapesanity Stitched Painted", + "3-1 Cr Rw": "Shapesanity Stitched Mixed", + "Half-Half Cr Rw": "Shapesanity Half-Half Mixed", + "Checkered Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rw": "Shapesanity Stitched Mixed", + "3-1 Cr Ry": "Shapesanity Stitched Mixed", + "Half-Half Cr Ry": "Shapesanity Half-Half Mixed", + "Checkered Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Ry": "Shapesanity Stitched Mixed", + "3-1 Cr Sb": "Shapesanity Stitched Painted", + "Half-Half Cr Sb": "Shapesanity Half-Half Painted", + "Checkered Cr Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sb": "Shapesanity Stitched Painted", + "3-1 Cr Sc": "Shapesanity Stitched Mixed", + "Half-Half Cr Sc": "Shapesanity Half-Half Mixed", + "Checkered Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sc": "Shapesanity Stitched Mixed", + "3-1 Cr Sg": "Shapesanity Stitched Painted", + "Half-Half Cr Sg": "Shapesanity Half-Half Painted", + "Checkered Cr Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sg": "Shapesanity Stitched Painted", + "3-1 Cr Sp": "Shapesanity Stitched Mixed", + "Half-Half Cr Sp": "Shapesanity Half-Half Mixed", + "Checkered Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sp": "Shapesanity Stitched Mixed", + "3-1 Cr Sr": "Shapesanity Stitched Painted", + "Half-Half Cr Sr": "Shapesanity Half-Half Painted", + "Checkered Cr Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sr": "Shapesanity Stitched Painted", + "3-1 Cr Su": "Shapesanity Stitched Painted", + "Half-Half Cr Su": "Shapesanity Half-Half Painted", + "Checkered Cr Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Su": "Shapesanity Stitched Painted", + "Cornered Singles Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Su": "Shapesanity Stitched Painted", + "3-1 Cr Sw": "Shapesanity Stitched Mixed", + "Half-Half Cr Sw": "Shapesanity Half-Half Mixed", + "Checkered Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sw": "Shapesanity Stitched Mixed", + "3-1 Cr Sy": "Shapesanity Stitched Mixed", + "Half-Half Cr Sy": "Shapesanity Half-Half Mixed", + "Checkered Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sy": "Shapesanity Stitched Mixed", + "3-1 Cr Wb": "Shapesanity Stitched Painted", + "Half-Half Cr Wb": "Shapesanity Half-Half Painted", + "Checkered Cr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wb": "Shapesanity Stitched Painted", + "3-1 Cr Wc": "Shapesanity Stitched Mixed", + "Half-Half Cr Wc": "Shapesanity Half-Half Mixed", + "Checkered Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wc": "Shapesanity Stitched Mixed", + "3-1 Cr Wg": "Shapesanity Stitched Painted", + "Half-Half Cr Wg": "Shapesanity Half-Half Painted", + "Checkered Cr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wg": "Shapesanity Stitched Painted", + "3-1 Cr Wp": "Shapesanity Stitched Mixed", + "Half-Half Cr Wp": "Shapesanity Half-Half Mixed", + "Checkered Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wp": "Shapesanity Stitched Mixed", + "3-1 Cr Wr": "Shapesanity Stitched Painted", + "Half-Half Cr Wr": "Shapesanity Half-Half Painted", + "Checkered Cr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wr": "Shapesanity Stitched Painted", + "3-1 Cr Wu": "Shapesanity Stitched Painted", + "Half-Half Cr Wu": "Shapesanity Half-Half Painted", + "Checkered Cr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wu": "Shapesanity Stitched Painted", + "3-1 Cr Ww": "Shapesanity Stitched Mixed", + "Half-Half Cr Ww": "Shapesanity Half-Half Mixed", + "Checkered Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Ww": "Shapesanity Stitched Mixed", + "3-1 Cr Wy": "Shapesanity Stitched Mixed", + "Half-Half Cr Wy": "Shapesanity Half-Half Mixed", + "Checkered Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wy": "Shapesanity Stitched Mixed", + "3-1 Cu Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cb": "Shapesanity Stitched Painted", + "3-1 Cu Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cu Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cc": "Shapesanity Stitched Mixed", + "3-1 Cu Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cg": "Shapesanity Stitched Painted", + "3-1 Cu Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cu Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cp": "Shapesanity Stitched Mixed", + "3-1 Cu Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cr": "Shapesanity Stitched Painted", + "3-1 Cu Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cu Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cu Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cw": "Shapesanity Stitched Mixed", + "3-1 Cu Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cu Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cu Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cu Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cy": "Shapesanity Stitched Mixed", + "3-1 Cu Rb": "Shapesanity Stitched Painted", + "Half-Half Cu Rb": "Shapesanity Half-Half Painted", + "Checkered Cu Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rb": "Shapesanity Stitched Painted", + "3-1 Cu Rc": "Shapesanity Stitched Mixed", + "Half-Half Cu Rc": "Shapesanity Half-Half Mixed", + "Checkered Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rc": "Shapesanity Stitched Mixed", + "3-1 Cu Rg": "Shapesanity Stitched Painted", + "Half-Half Cu Rg": "Shapesanity Half-Half Painted", + "Checkered Cu Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rg": "Shapesanity Stitched Painted", + "3-1 Cu Rp": "Shapesanity Stitched Mixed", + "Half-Half Cu Rp": "Shapesanity Half-Half Mixed", + "Checkered Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rp": "Shapesanity Stitched Mixed", + "3-1 Cu Rr": "Shapesanity Stitched Painted", + "Half-Half Cu Rr": "Shapesanity Half-Half Painted", + "Checkered Cu Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rr": "Shapesanity Stitched Painted", + "3-1 Cu Ru": "Shapesanity Stitched Uncolored", + "Half-Half Cu Ru": "Shapesanity Half-Half Uncolored", + "Checkered Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Ru": "Shapesanity Stitched Uncolored", + "3-1 Cu Rw": "Shapesanity Stitched Mixed", + "Half-Half Cu Rw": "Shapesanity Half-Half Mixed", + "Checkered Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rw": "Shapesanity Stitched Mixed", + "3-1 Cu Ry": "Shapesanity Stitched Mixed", + "Half-Half Cu Ry": "Shapesanity Half-Half Mixed", + "Checkered Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Ry": "Shapesanity Stitched Mixed", + "3-1 Cu Sb": "Shapesanity Stitched Painted", + "Half-Half Cu Sb": "Shapesanity Half-Half Painted", + "Checkered Cu Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sb": "Shapesanity Stitched Painted", + "3-1 Cu Sc": "Shapesanity Stitched Mixed", + "Half-Half Cu Sc": "Shapesanity Half-Half Mixed", + "Checkered Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sc": "Shapesanity Stitched Mixed", + "3-1 Cu Sg": "Shapesanity Stitched Painted", + "Half-Half Cu Sg": "Shapesanity Half-Half Painted", + "Checkered Cu Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sg": "Shapesanity Stitched Painted", + "3-1 Cu Sp": "Shapesanity Stitched Mixed", + "Half-Half Cu Sp": "Shapesanity Half-Half Mixed", + "Checkered Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sp": "Shapesanity Stitched Mixed", + "3-1 Cu Sr": "Shapesanity Stitched Painted", + "Half-Half Cu Sr": "Shapesanity Half-Half Painted", + "Checkered Cu Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sr": "Shapesanity Stitched Painted", + "3-1 Cu Su": "Shapesanity Stitched Uncolored", + "Half-Half Cu Su": "Shapesanity Half-Half Uncolored", + "Checkered Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Su": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Su": "Shapesanity Stitched Uncolored", + "3-1 Cu Sw": "Shapesanity Stitched Mixed", + "Half-Half Cu Sw": "Shapesanity Half-Half Mixed", + "Checkered Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sw": "Shapesanity Stitched Mixed", + "3-1 Cu Sy": "Shapesanity Stitched Mixed", + "Half-Half Cu Sy": "Shapesanity Half-Half Mixed", + "Checkered Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sy": "Shapesanity Stitched Mixed", + "3-1 Cu Wb": "Shapesanity Stitched Painted", + "Half-Half Cu Wb": "Shapesanity Half-Half Painted", + "Checkered Cu Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wb": "Shapesanity Stitched Painted", + "3-1 Cu Wc": "Shapesanity Stitched Mixed", + "Half-Half Cu Wc": "Shapesanity Half-Half Mixed", + "Checkered Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wc": "Shapesanity Stitched Mixed", + "3-1 Cu Wg": "Shapesanity Stitched Painted", + "Half-Half Cu Wg": "Shapesanity Half-Half Painted", + "Checkered Cu Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wg": "Shapesanity Stitched Painted", + "3-1 Cu Wp": "Shapesanity Stitched Mixed", + "Half-Half Cu Wp": "Shapesanity Half-Half Mixed", + "Checkered Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wp": "Shapesanity Stitched Mixed", + "3-1 Cu Wr": "Shapesanity Stitched Painted", + "Half-Half Cu Wr": "Shapesanity Half-Half Painted", + "Checkered Cu Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wr": "Shapesanity Stitched Painted", + "3-1 Cu Wu": "Shapesanity Stitched Uncolored", + "Half-Half Cu Wu": "Shapesanity Half-Half Uncolored", + "Checkered Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Wu": "Shapesanity Stitched Uncolored", + "3-1 Cu Ww": "Shapesanity Stitched Mixed", + "Half-Half Cu Ww": "Shapesanity Half-Half Mixed", + "Checkered Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Ww": "Shapesanity Stitched Mixed", + "3-1 Cu Wy": "Shapesanity Stitched Mixed", + "Half-Half Cu Wy": "Shapesanity Half-Half Mixed", + "Checkered Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wy": "Shapesanity Stitched Mixed", + "3-1 Cw Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cb": "Shapesanity Stitched Mixed", + "3-1 Cw Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cc": "Shapesanity Stitched Mixed", + "3-1 Cw Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cg": "Shapesanity Stitched Mixed", + "3-1 Cw Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cp": "Shapesanity Stitched Mixed", + "3-1 Cw Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cr": "Shapesanity Stitched Mixed", + "3-1 Cw Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cu": "Shapesanity Stitched Mixed", + "3-1 Cw Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cw Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cw Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cw Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cy": "Shapesanity Stitched Mixed", + "3-1 Cw Rb": "Shapesanity Stitched Mixed", + "Half-Half Cw Rb": "Shapesanity Half-Half Mixed", + "Checkered Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rb": "Shapesanity Stitched Mixed", + "3-1 Cw Rc": "Shapesanity Stitched Mixed", + "Half-Half Cw Rc": "Shapesanity Half-Half Mixed", + "Checkered Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rc": "Shapesanity Stitched Mixed", + "3-1 Cw Rg": "Shapesanity Stitched Mixed", + "Half-Half Cw Rg": "Shapesanity Half-Half Mixed", + "Checkered Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rg": "Shapesanity Stitched Mixed", + "3-1 Cw Rp": "Shapesanity Stitched Mixed", + "Half-Half Cw Rp": "Shapesanity Half-Half Mixed", + "Checkered Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rp": "Shapesanity Stitched Mixed", + "3-1 Cw Rr": "Shapesanity Stitched Mixed", + "Half-Half Cw Rr": "Shapesanity Half-Half Mixed", + "Checkered Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rr": "Shapesanity Stitched Mixed", + "3-1 Cw Ru": "Shapesanity Stitched Mixed", + "Half-Half Cw Ru": "Shapesanity Half-Half Mixed", + "Checkered Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ru": "Shapesanity Stitched Mixed", + "3-1 Cw Rw": "Shapesanity Stitched Mixed", + "Half-Half Cw Rw": "Shapesanity Half-Half Mixed", + "Checkered Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rw": "Shapesanity Stitched Mixed", + "3-1 Cw Ry": "Shapesanity Stitched Mixed", + "Half-Half Cw Ry": "Shapesanity Half-Half Mixed", + "Checkered Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ry": "Shapesanity Stitched Mixed", + "3-1 Cw Sb": "Shapesanity Stitched Mixed", + "Half-Half Cw Sb": "Shapesanity Half-Half Mixed", + "Checkered Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sb": "Shapesanity Stitched Mixed", + "3-1 Cw Sc": "Shapesanity Stitched Mixed", + "Half-Half Cw Sc": "Shapesanity Half-Half Mixed", + "Checkered Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sc": "Shapesanity Stitched Mixed", + "3-1 Cw Sg": "Shapesanity Stitched Mixed", + "Half-Half Cw Sg": "Shapesanity Half-Half Mixed", + "Checkered Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sg": "Shapesanity Stitched Mixed", + "3-1 Cw Sp": "Shapesanity Stitched Mixed", + "Half-Half Cw Sp": "Shapesanity Half-Half Mixed", + "Checkered Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sp": "Shapesanity Stitched Mixed", + "3-1 Cw Sr": "Shapesanity Stitched Mixed", + "Half-Half Cw Sr": "Shapesanity Half-Half Mixed", + "Checkered Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sr": "Shapesanity Stitched Mixed", + "3-1 Cw Su": "Shapesanity Stitched Mixed", + "Half-Half Cw Su": "Shapesanity Half-Half Mixed", + "Checkered Cw Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Su": "Shapesanity Stitched Mixed", + "3-1 Cw Sw": "Shapesanity Stitched Mixed", + "Half-Half Cw Sw": "Shapesanity Half-Half Mixed", + "Checkered Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sw": "Shapesanity Stitched Mixed", + "3-1 Cw Sy": "Shapesanity Stitched Mixed", + "Half-Half Cw Sy": "Shapesanity Half-Half Mixed", + "Checkered Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sy": "Shapesanity Stitched Mixed", + "3-1 Cw Wb": "Shapesanity Stitched Mixed", + "Half-Half Cw Wb": "Shapesanity Half-Half Mixed", + "Checkered Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wb": "Shapesanity Stitched Mixed", + "3-1 Cw Wc": "Shapesanity Stitched Mixed", + "Half-Half Cw Wc": "Shapesanity Half-Half Mixed", + "Checkered Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wc": "Shapesanity Stitched Mixed", + "3-1 Cw Wg": "Shapesanity Stitched Mixed", + "Half-Half Cw Wg": "Shapesanity Half-Half Mixed", + "Checkered Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wg": "Shapesanity Stitched Mixed", + "3-1 Cw Wp": "Shapesanity Stitched Mixed", + "Half-Half Cw Wp": "Shapesanity Half-Half Mixed", + "Checkered Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wp": "Shapesanity Stitched Mixed", + "3-1 Cw Wr": "Shapesanity Stitched Mixed", + "Half-Half Cw Wr": "Shapesanity Half-Half Mixed", + "Checkered Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wr": "Shapesanity Stitched Mixed", + "3-1 Cw Wu": "Shapesanity Stitched Mixed", + "Half-Half Cw Wu": "Shapesanity Half-Half Mixed", + "Checkered Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wu": "Shapesanity Stitched Mixed", + "3-1 Cw Ww": "Shapesanity Stitched Mixed", + "Half-Half Cw Ww": "Shapesanity Half-Half Mixed", + "Checkered Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ww": "Shapesanity Stitched Mixed", + "3-1 Cw Wy": "Shapesanity Stitched Mixed", + "Half-Half Cw Wy": "Shapesanity Half-Half Mixed", + "Checkered Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wy": "Shapesanity Stitched Mixed", + "3-1 Cy Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cb": "Shapesanity Stitched Mixed", + "3-1 Cy Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cc": "Shapesanity Stitched Mixed", + "3-1 Cy Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cg": "Shapesanity Stitched Mixed", + "3-1 Cy Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cp": "Shapesanity Stitched Mixed", + "3-1 Cy Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cr": "Shapesanity Stitched Mixed", + "3-1 Cy Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cu": "Shapesanity Stitched Mixed", + "3-1 Cy Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cw": "Shapesanity Stitched Mixed", + "3-1 Cy Rb": "Shapesanity Stitched Mixed", + "Half-Half Cy Rb": "Shapesanity Half-Half Mixed", + "Checkered Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rb": "Shapesanity Stitched Mixed", + "3-1 Cy Rc": "Shapesanity Stitched Mixed", + "Half-Half Cy Rc": "Shapesanity Half-Half Mixed", + "Checkered Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rc": "Shapesanity Stitched Mixed", + "3-1 Cy Rg": "Shapesanity Stitched Mixed", + "Half-Half Cy Rg": "Shapesanity Half-Half Mixed", + "Checkered Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rg": "Shapesanity Stitched Mixed", + "3-1 Cy Rp": "Shapesanity Stitched Mixed", + "Half-Half Cy Rp": "Shapesanity Half-Half Mixed", + "Checkered Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rp": "Shapesanity Stitched Mixed", + "3-1 Cy Rr": "Shapesanity Stitched Mixed", + "Half-Half Cy Rr": "Shapesanity Half-Half Mixed", + "Checkered Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rr": "Shapesanity Stitched Mixed", + "3-1 Cy Ru": "Shapesanity Stitched Mixed", + "Half-Half Cy Ru": "Shapesanity Half-Half Mixed", + "Checkered Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ru": "Shapesanity Stitched Mixed", + "3-1 Cy Rw": "Shapesanity Stitched Mixed", + "Half-Half Cy Rw": "Shapesanity Half-Half Mixed", + "Checkered Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rw": "Shapesanity Stitched Mixed", + "3-1 Cy Ry": "Shapesanity Stitched Mixed", + "Half-Half Cy Ry": "Shapesanity Half-Half Mixed", + "Checkered Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ry": "Shapesanity Stitched Mixed", + "3-1 Cy Sb": "Shapesanity Stitched Mixed", + "Half-Half Cy Sb": "Shapesanity Half-Half Mixed", + "Checkered Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sb": "Shapesanity Stitched Mixed", + "3-1 Cy Sc": "Shapesanity Stitched Mixed", + "Half-Half Cy Sc": "Shapesanity Half-Half Mixed", + "Checkered Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sc": "Shapesanity Stitched Mixed", + "3-1 Cy Sg": "Shapesanity Stitched Mixed", + "Half-Half Cy Sg": "Shapesanity Half-Half Mixed", + "Checkered Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sg": "Shapesanity Stitched Mixed", + "3-1 Cy Sp": "Shapesanity Stitched Mixed", + "Half-Half Cy Sp": "Shapesanity Half-Half Mixed", + "Checkered Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sp": "Shapesanity Stitched Mixed", + "3-1 Cy Sr": "Shapesanity Stitched Mixed", + "Half-Half Cy Sr": "Shapesanity Half-Half Mixed", + "Checkered Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sr": "Shapesanity Stitched Mixed", + "3-1 Cy Su": "Shapesanity Stitched Mixed", + "Half-Half Cy Su": "Shapesanity Half-Half Mixed", + "Checkered Cy Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Su": "Shapesanity Stitched Mixed", + "3-1 Cy Sw": "Shapesanity Stitched Mixed", + "Half-Half Cy Sw": "Shapesanity Half-Half Mixed", + "Checkered Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sw": "Shapesanity Stitched Mixed", + "3-1 Cy Sy": "Shapesanity Stitched Mixed", + "Half-Half Cy Sy": "Shapesanity Half-Half Mixed", + "Checkered Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sy": "Shapesanity Stitched Mixed", + "3-1 Cy Wb": "Shapesanity Stitched Mixed", + "Half-Half Cy Wb": "Shapesanity Half-Half Mixed", + "Checkered Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wb": "Shapesanity Stitched Mixed", + "3-1 Cy Wc": "Shapesanity Stitched Mixed", + "Half-Half Cy Wc": "Shapesanity Half-Half Mixed", + "Checkered Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wc": "Shapesanity Stitched Mixed", + "3-1 Cy Wg": "Shapesanity Stitched Mixed", + "Half-Half Cy Wg": "Shapesanity Half-Half Mixed", + "Checkered Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wg": "Shapesanity Stitched Mixed", + "3-1 Cy Wp": "Shapesanity Stitched Mixed", + "Half-Half Cy Wp": "Shapesanity Half-Half Mixed", + "Checkered Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wp": "Shapesanity Stitched Mixed", + "3-1 Cy Wr": "Shapesanity Stitched Mixed", + "Half-Half Cy Wr": "Shapesanity Half-Half Mixed", + "Checkered Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wr": "Shapesanity Stitched Mixed", + "3-1 Cy Wu": "Shapesanity Stitched Mixed", + "Half-Half Cy Wu": "Shapesanity Half-Half Mixed", + "Checkered Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wu": "Shapesanity Stitched Mixed", + "3-1 Cy Ww": "Shapesanity Stitched Mixed", + "Half-Half Cy Ww": "Shapesanity Half-Half Mixed", + "Checkered Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ww": "Shapesanity Stitched Mixed", + "3-1 Cy Wy": "Shapesanity Stitched Mixed", + "Half-Half Cy Wy": "Shapesanity Half-Half Mixed", + "Checkered Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wy": "Shapesanity Stitched Mixed", + "3-1 Rb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cb": "Shapesanity Stitched Painted", + "3-1 Rb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cc": "Shapesanity Stitched Mixed", + "3-1 Rb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cg": "Shapesanity Stitched Painted", + "3-1 Rb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cp": "Shapesanity Stitched Mixed", + "3-1 Rb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cr": "Shapesanity Stitched Painted", + "3-1 Rb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cu": "Shapesanity Stitched Painted", + "3-1 Rb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cw": "Shapesanity Stitched Mixed", + "3-1 Rb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cy": "Shapesanity Stitched Mixed", + "3-1 Rb Rc": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rc": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rc": "Shapesanity Stitched Mixed", + "3-1 Rb Rg": "Shapesanity Colorful Full Painted", + "Half-Half Rb Rg": "Shapesanity Colorful Full Painted", + "Checkered Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Rg": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Rg": "Shapesanity Stitched Painted", + "3-1 Rb Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rp": "Shapesanity Stitched Mixed", + "3-1 Rb Rr": "Shapesanity Colorful Full Painted", + "Half-Half Rb Rr": "Shapesanity Colorful Full Painted", + "Checkered Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Rr": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Rr": "Shapesanity Stitched Painted", + "3-1 Rb Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rb Ru": "Shapesanity Colorful Full Painted", + "Checkered Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Ru": "Shapesanity Stitched Painted", + "3-1 Rb Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rw": "Shapesanity Stitched Mixed", + "3-1 Rb Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Ry": "Shapesanity Stitched Mixed", + "3-1 Rb Sb": "Shapesanity Stitched Painted", + "Half-Half Rb Sb": "Shapesanity Half-Half Painted", + "Checkered Rb Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sb": "Shapesanity Stitched Painted", + "3-1 Rb Sc": "Shapesanity Stitched Mixed", + "Half-Half Rb Sc": "Shapesanity Half-Half Mixed", + "Checkered Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sc": "Shapesanity Stitched Mixed", + "3-1 Rb Sg": "Shapesanity Stitched Painted", + "Half-Half Rb Sg": "Shapesanity Half-Half Painted", + "Checkered Rb Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sg": "Shapesanity Stitched Painted", + "3-1 Rb Sp": "Shapesanity Stitched Mixed", + "Half-Half Rb Sp": "Shapesanity Half-Half Mixed", + "Checkered Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sp": "Shapesanity Stitched Mixed", + "3-1 Rb Sr": "Shapesanity Stitched Painted", + "Half-Half Rb Sr": "Shapesanity Half-Half Painted", + "Checkered Rb Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sr": "Shapesanity Stitched Painted", + "3-1 Rb Su": "Shapesanity Stitched Painted", + "Half-Half Rb Su": "Shapesanity Half-Half Painted", + "Checkered Rb Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Su": "Shapesanity Stitched Painted", + "Cornered Singles Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Su": "Shapesanity Stitched Painted", + "3-1 Rb Sw": "Shapesanity Stitched Mixed", + "Half-Half Rb Sw": "Shapesanity Half-Half Mixed", + "Checkered Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sw": "Shapesanity Stitched Mixed", + "3-1 Rb Sy": "Shapesanity Stitched Mixed", + "Half-Half Rb Sy": "Shapesanity Half-Half Mixed", + "Checkered Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sy": "Shapesanity Stitched Mixed", + "3-1 Rb Wb": "Shapesanity Stitched Painted", + "Half-Half Rb Wb": "Shapesanity Half-Half Painted", + "Checkered Rb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wb": "Shapesanity Stitched Painted", + "3-1 Rb Wc": "Shapesanity Stitched Mixed", + "Half-Half Rb Wc": "Shapesanity Half-Half Mixed", + "Checkered Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wc": "Shapesanity Stitched Mixed", + "3-1 Rb Wg": "Shapesanity Stitched Painted", + "Half-Half Rb Wg": "Shapesanity Half-Half Painted", + "Checkered Rb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wg": "Shapesanity Stitched Painted", + "3-1 Rb Wp": "Shapesanity Stitched Mixed", + "Half-Half Rb Wp": "Shapesanity Half-Half Mixed", + "Checkered Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wp": "Shapesanity Stitched Mixed", + "3-1 Rb Wr": "Shapesanity Stitched Painted", + "Half-Half Rb Wr": "Shapesanity Half-Half Painted", + "Checkered Rb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wr": "Shapesanity Stitched Painted", + "3-1 Rb Wu": "Shapesanity Stitched Painted", + "Half-Half Rb Wu": "Shapesanity Half-Half Painted", + "Checkered Rb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wu": "Shapesanity Stitched Painted", + "3-1 Rb Ww": "Shapesanity Stitched Mixed", + "Half-Half Rb Ww": "Shapesanity Half-Half Mixed", + "Checkered Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Ww": "Shapesanity Stitched Mixed", + "3-1 Rb Wy": "Shapesanity Stitched Mixed", + "Half-Half Rb Wy": "Shapesanity Half-Half Mixed", + "Checkered Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wy": "Shapesanity Stitched Mixed", + "3-1 Rc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cb": "Shapesanity Stitched Mixed", + "3-1 Rc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cc": "Shapesanity Stitched Mixed", + "3-1 Rc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cg": "Shapesanity Stitched Mixed", + "3-1 Rc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cp": "Shapesanity Stitched Mixed", + "3-1 Rc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cr": "Shapesanity Stitched Mixed", + "3-1 Rc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cu": "Shapesanity Stitched Mixed", + "3-1 Rc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cw": "Shapesanity Stitched Mixed", + "3-1 Rc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cy": "Shapesanity Stitched Mixed", + "3-1 Rc Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rb": "Shapesanity Stitched Mixed", + "3-1 Rc Rg": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rg": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rg": "Shapesanity Stitched Mixed", + "3-1 Rc Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rp": "Shapesanity Stitched Mixed", + "3-1 Rc Rr": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rr": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rr": "Shapesanity Stitched Mixed", + "3-1 Rc Ru": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Ru": "Shapesanity Colorful Full Mixed", + "Checkered Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Ru": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ru": "Shapesanity Stitched Mixed", + "3-1 Rc Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rw": "Shapesanity Stitched Mixed", + "3-1 Rc Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ry": "Shapesanity Stitched Mixed", + "3-1 Rc Sb": "Shapesanity Stitched Mixed", + "Half-Half Rc Sb": "Shapesanity Half-Half Mixed", + "Checkered Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sb": "Shapesanity Stitched Mixed", + "3-1 Rc Sc": "Shapesanity Stitched Mixed", + "Half-Half Rc Sc": "Shapesanity Half-Half Mixed", + "Checkered Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sc": "Shapesanity Stitched Mixed", + "3-1 Rc Sg": "Shapesanity Stitched Mixed", + "Half-Half Rc Sg": "Shapesanity Half-Half Mixed", + "Checkered Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sg": "Shapesanity Stitched Mixed", + "3-1 Rc Sp": "Shapesanity Stitched Mixed", + "Half-Half Rc Sp": "Shapesanity Half-Half Mixed", + "Checkered Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sp": "Shapesanity Stitched Mixed", + "3-1 Rc Sr": "Shapesanity Stitched Mixed", + "Half-Half Rc Sr": "Shapesanity Half-Half Mixed", + "Checkered Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sr": "Shapesanity Stitched Mixed", + "3-1 Rc Su": "Shapesanity Stitched Mixed", + "Half-Half Rc Su": "Shapesanity Half-Half Mixed", + "Checkered Rc Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Su": "Shapesanity Stitched Mixed", + "3-1 Rc Sw": "Shapesanity Stitched Mixed", + "Half-Half Rc Sw": "Shapesanity Half-Half Mixed", + "Checkered Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sw": "Shapesanity Stitched Mixed", + "3-1 Rc Sy": "Shapesanity Stitched Mixed", + "Half-Half Rc Sy": "Shapesanity Half-Half Mixed", + "Checkered Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sy": "Shapesanity Stitched Mixed", + "3-1 Rc Wb": "Shapesanity Stitched Mixed", + "Half-Half Rc Wb": "Shapesanity Half-Half Mixed", + "Checkered Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wb": "Shapesanity Stitched Mixed", + "3-1 Rc Wc": "Shapesanity Stitched Mixed", + "Half-Half Rc Wc": "Shapesanity Half-Half Mixed", + "Checkered Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wc": "Shapesanity Stitched Mixed", + "3-1 Rc Wg": "Shapesanity Stitched Mixed", + "Half-Half Rc Wg": "Shapesanity Half-Half Mixed", + "Checkered Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wg": "Shapesanity Stitched Mixed", + "3-1 Rc Wp": "Shapesanity Stitched Mixed", + "Half-Half Rc Wp": "Shapesanity Half-Half Mixed", + "Checkered Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wp": "Shapesanity Stitched Mixed", + "3-1 Rc Wr": "Shapesanity Stitched Mixed", + "Half-Half Rc Wr": "Shapesanity Half-Half Mixed", + "Checkered Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wr": "Shapesanity Stitched Mixed", + "3-1 Rc Wu": "Shapesanity Stitched Mixed", + "Half-Half Rc Wu": "Shapesanity Half-Half Mixed", + "Checkered Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wu": "Shapesanity Stitched Mixed", + "3-1 Rc Ww": "Shapesanity Stitched Mixed", + "Half-Half Rc Ww": "Shapesanity Half-Half Mixed", + "Checkered Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ww": "Shapesanity Stitched Mixed", + "3-1 Rc Wy": "Shapesanity Stitched Mixed", + "Half-Half Rc Wy": "Shapesanity Half-Half Mixed", + "Checkered Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wy": "Shapesanity Stitched Mixed", + "3-1 Rg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cb": "Shapesanity Stitched Painted", + "3-1 Rg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cc": "Shapesanity Stitched Mixed", + "3-1 Rg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cg": "Shapesanity Stitched Painted", + "3-1 Rg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cp": "Shapesanity Stitched Mixed", + "3-1 Rg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cr": "Shapesanity Stitched Painted", + "3-1 Rg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cu": "Shapesanity Stitched Painted", + "3-1 Rg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cw": "Shapesanity Stitched Mixed", + "3-1 Rg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cy": "Shapesanity Stitched Mixed", + "3-1 Rg Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Rb": "Shapesanity Stitched Painted", + "3-1 Rg Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rc": "Shapesanity Stitched Mixed", + "3-1 Rg Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rp": "Shapesanity Stitched Mixed", + "3-1 Rg Rr": "Shapesanity Colorful Full Painted", + "Half-Half Rg Rr": "Shapesanity Colorful Full Painted", + "Checkered Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rg Rr": "Shapesanity Colorful Half Painted", + "Cornered Singles Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Rr": "Shapesanity Stitched Painted", + "3-1 Rg Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rg Ru": "Shapesanity Colorful Full Painted", + "Checkered Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rg Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Ru": "Shapesanity Stitched Painted", + "3-1 Rg Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rw": "Shapesanity Stitched Mixed", + "3-1 Rg Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Ry": "Shapesanity Stitched Mixed", + "3-1 Rg Sb": "Shapesanity Stitched Painted", + "Half-Half Rg Sb": "Shapesanity Half-Half Painted", + "Checkered Rg Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sb": "Shapesanity Stitched Painted", + "3-1 Rg Sc": "Shapesanity Stitched Mixed", + "Half-Half Rg Sc": "Shapesanity Half-Half Mixed", + "Checkered Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sc": "Shapesanity Stitched Mixed", + "3-1 Rg Sg": "Shapesanity Stitched Painted", + "Half-Half Rg Sg": "Shapesanity Half-Half Painted", + "Checkered Rg Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sg": "Shapesanity Stitched Painted", + "3-1 Rg Sp": "Shapesanity Stitched Mixed", + "Half-Half Rg Sp": "Shapesanity Half-Half Mixed", + "Checkered Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sp": "Shapesanity Stitched Mixed", + "3-1 Rg Sr": "Shapesanity Stitched Painted", + "Half-Half Rg Sr": "Shapesanity Half-Half Painted", + "Checkered Rg Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sr": "Shapesanity Stitched Painted", + "3-1 Rg Su": "Shapesanity Stitched Painted", + "Half-Half Rg Su": "Shapesanity Half-Half Painted", + "Checkered Rg Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Su": "Shapesanity Stitched Painted", + "Cornered Singles Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Su": "Shapesanity Stitched Painted", + "3-1 Rg Sw": "Shapesanity Stitched Mixed", + "Half-Half Rg Sw": "Shapesanity Half-Half Mixed", + "Checkered Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sw": "Shapesanity Stitched Mixed", + "3-1 Rg Sy": "Shapesanity Stitched Mixed", + "Half-Half Rg Sy": "Shapesanity Half-Half Mixed", + "Checkered Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sy": "Shapesanity Stitched Mixed", + "3-1 Rg Wb": "Shapesanity Stitched Painted", + "Half-Half Rg Wb": "Shapesanity Half-Half Painted", + "Checkered Rg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wb": "Shapesanity Stitched Painted", + "3-1 Rg Wc": "Shapesanity Stitched Mixed", + "Half-Half Rg Wc": "Shapesanity Half-Half Mixed", + "Checkered Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wc": "Shapesanity Stitched Mixed", + "3-1 Rg Wg": "Shapesanity Stitched Painted", + "Half-Half Rg Wg": "Shapesanity Half-Half Painted", + "Checkered Rg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wg": "Shapesanity Stitched Painted", + "3-1 Rg Wp": "Shapesanity Stitched Mixed", + "Half-Half Rg Wp": "Shapesanity Half-Half Mixed", + "Checkered Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wp": "Shapesanity Stitched Mixed", + "3-1 Rg Wr": "Shapesanity Stitched Painted", + "Half-Half Rg Wr": "Shapesanity Half-Half Painted", + "Checkered Rg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wr": "Shapesanity Stitched Painted", + "3-1 Rg Wu": "Shapesanity Stitched Painted", + "Half-Half Rg Wu": "Shapesanity Half-Half Painted", + "Checkered Rg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wu": "Shapesanity Stitched Painted", + "3-1 Rg Ww": "Shapesanity Stitched Mixed", + "Half-Half Rg Ww": "Shapesanity Half-Half Mixed", + "Checkered Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Ww": "Shapesanity Stitched Mixed", + "3-1 Rg Wy": "Shapesanity Stitched Mixed", + "Half-Half Rg Wy": "Shapesanity Half-Half Mixed", + "Checkered Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wy": "Shapesanity Stitched Mixed", + "3-1 Rp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cb": "Shapesanity Stitched Mixed", + "3-1 Rp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cc": "Shapesanity Stitched Mixed", + "3-1 Rp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cg": "Shapesanity Stitched Mixed", + "3-1 Rp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cp": "Shapesanity Stitched Mixed", + "3-1 Rp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cr": "Shapesanity Stitched Mixed", + "3-1 Rp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cu": "Shapesanity Stitched Mixed", + "3-1 Rp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cw": "Shapesanity Stitched Mixed", + "3-1 Rp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cy": "Shapesanity Stitched Mixed", + "3-1 Rp Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rb": "Shapesanity Stitched Mixed", + "3-1 Rp Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rc": "Shapesanity Stitched Mixed", + "3-1 Rp Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rg": "Shapesanity Stitched Mixed", + "3-1 Rp Rr": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Rr": "Shapesanity Colorful Full Mixed", + "Checkered Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Rr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rr": "Shapesanity Stitched Mixed", + "3-1 Rp Ru": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Ru": "Shapesanity Colorful Full Mixed", + "Checkered Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Ru": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ru": "Shapesanity Stitched Mixed", + "3-1 Rp Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rw": "Shapesanity Stitched Mixed", + "3-1 Rp Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ry": "Shapesanity Stitched Mixed", + "3-1 Rp Sb": "Shapesanity Stitched Mixed", + "Half-Half Rp Sb": "Shapesanity Half-Half Mixed", + "Checkered Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sb": "Shapesanity Stitched Mixed", + "3-1 Rp Sc": "Shapesanity Stitched Mixed", + "Half-Half Rp Sc": "Shapesanity Half-Half Mixed", + "Checkered Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sc": "Shapesanity Stitched Mixed", + "3-1 Rp Sg": "Shapesanity Stitched Mixed", + "Half-Half Rp Sg": "Shapesanity Half-Half Mixed", + "Checkered Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sg": "Shapesanity Stitched Mixed", + "3-1 Rp Sp": "Shapesanity Stitched Mixed", + "Half-Half Rp Sp": "Shapesanity Half-Half Mixed", + "Checkered Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sp": "Shapesanity Stitched Mixed", + "3-1 Rp Sr": "Shapesanity Stitched Mixed", + "Half-Half Rp Sr": "Shapesanity Half-Half Mixed", + "Checkered Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sr": "Shapesanity Stitched Mixed", + "3-1 Rp Su": "Shapesanity Stitched Mixed", + "Half-Half Rp Su": "Shapesanity Half-Half Mixed", + "Checkered Rp Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Su": "Shapesanity Stitched Mixed", + "3-1 Rp Sw": "Shapesanity Stitched Mixed", + "Half-Half Rp Sw": "Shapesanity Half-Half Mixed", + "Checkered Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sw": "Shapesanity Stitched Mixed", + "3-1 Rp Sy": "Shapesanity Stitched Mixed", + "Half-Half Rp Sy": "Shapesanity Half-Half Mixed", + "Checkered Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sy": "Shapesanity Stitched Mixed", + "3-1 Rp Wb": "Shapesanity Stitched Mixed", + "Half-Half Rp Wb": "Shapesanity Half-Half Mixed", + "Checkered Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wb": "Shapesanity Stitched Mixed", + "3-1 Rp Wc": "Shapesanity Stitched Mixed", + "Half-Half Rp Wc": "Shapesanity Half-Half Mixed", + "Checkered Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wc": "Shapesanity Stitched Mixed", + "3-1 Rp Wg": "Shapesanity Stitched Mixed", + "Half-Half Rp Wg": "Shapesanity Half-Half Mixed", + "Checkered Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wg": "Shapesanity Stitched Mixed", + "3-1 Rp Wp": "Shapesanity Stitched Mixed", + "Half-Half Rp Wp": "Shapesanity Half-Half Mixed", + "Checkered Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wp": "Shapesanity Stitched Mixed", + "3-1 Rp Wr": "Shapesanity Stitched Mixed", + "Half-Half Rp Wr": "Shapesanity Half-Half Mixed", + "Checkered Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wr": "Shapesanity Stitched Mixed", + "3-1 Rp Wu": "Shapesanity Stitched Mixed", + "Half-Half Rp Wu": "Shapesanity Half-Half Mixed", + "Checkered Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wu": "Shapesanity Stitched Mixed", + "3-1 Rp Ww": "Shapesanity Stitched Mixed", + "Half-Half Rp Ww": "Shapesanity Half-Half Mixed", + "Checkered Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ww": "Shapesanity Stitched Mixed", + "3-1 Rp Wy": "Shapesanity Stitched Mixed", + "Half-Half Rp Wy": "Shapesanity Half-Half Mixed", + "Checkered Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wy": "Shapesanity Stitched Mixed", + "3-1 Rr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cb": "Shapesanity Stitched Painted", + "3-1 Rr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cc": "Shapesanity Stitched Mixed", + "3-1 Rr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cg": "Shapesanity Stitched Painted", + "3-1 Rr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cp": "Shapesanity Stitched Mixed", + "3-1 Rr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cr": "Shapesanity Stitched Painted", + "3-1 Rr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cu": "Shapesanity Stitched Painted", + "3-1 Rr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cw": "Shapesanity Stitched Mixed", + "3-1 Rr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cy": "Shapesanity Stitched Mixed", + "3-1 Rr Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Rb": "Shapesanity Stitched Painted", + "3-1 Rr Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rc": "Shapesanity Stitched Mixed", + "3-1 Rr Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Rg": "Shapesanity Stitched Painted", + "3-1 Rr Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rp": "Shapesanity Stitched Mixed", + "3-1 Rr Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rr Ru": "Shapesanity Colorful Full Painted", + "Checkered Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rr Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Ru": "Shapesanity Stitched Painted", + "3-1 Rr Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rr Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rr Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rw": "Shapesanity Stitched Mixed", + "3-1 Rr Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rr Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rr Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Ry": "Shapesanity Stitched Mixed", + "3-1 Rr Sb": "Shapesanity Stitched Painted", + "Half-Half Rr Sb": "Shapesanity Half-Half Painted", + "Checkered Rr Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sb": "Shapesanity Stitched Painted", + "3-1 Rr Sc": "Shapesanity Stitched Mixed", + "Half-Half Rr Sc": "Shapesanity Half-Half Mixed", + "Checkered Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sc": "Shapesanity Stitched Mixed", + "3-1 Rr Sg": "Shapesanity Stitched Painted", + "Half-Half Rr Sg": "Shapesanity Half-Half Painted", + "Checkered Rr Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sg": "Shapesanity Stitched Painted", + "3-1 Rr Sp": "Shapesanity Stitched Mixed", + "Half-Half Rr Sp": "Shapesanity Half-Half Mixed", + "Checkered Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sp": "Shapesanity Stitched Mixed", + "3-1 Rr Sr": "Shapesanity Stitched Painted", + "Half-Half Rr Sr": "Shapesanity Half-Half Painted", + "Checkered Rr Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sr": "Shapesanity Stitched Painted", + "3-1 Rr Su": "Shapesanity Stitched Painted", + "Half-Half Rr Su": "Shapesanity Half-Half Painted", + "Checkered Rr Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Su": "Shapesanity Stitched Painted", + "Cornered Singles Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Su": "Shapesanity Stitched Painted", + "3-1 Rr Sw": "Shapesanity Stitched Mixed", + "Half-Half Rr Sw": "Shapesanity Half-Half Mixed", + "Checkered Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sw": "Shapesanity Stitched Mixed", + "3-1 Rr Sy": "Shapesanity Stitched Mixed", + "Half-Half Rr Sy": "Shapesanity Half-Half Mixed", + "Checkered Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sy": "Shapesanity Stitched Mixed", + "3-1 Rr Wb": "Shapesanity Stitched Painted", + "Half-Half Rr Wb": "Shapesanity Half-Half Painted", + "Checkered Rr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wb": "Shapesanity Stitched Painted", + "3-1 Rr Wc": "Shapesanity Stitched Mixed", + "Half-Half Rr Wc": "Shapesanity Half-Half Mixed", + "Checkered Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wc": "Shapesanity Stitched Mixed", + "3-1 Rr Wg": "Shapesanity Stitched Painted", + "Half-Half Rr Wg": "Shapesanity Half-Half Painted", + "Checkered Rr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wg": "Shapesanity Stitched Painted", + "3-1 Rr Wp": "Shapesanity Stitched Mixed", + "Half-Half Rr Wp": "Shapesanity Half-Half Mixed", + "Checkered Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wp": "Shapesanity Stitched Mixed", + "3-1 Rr Wr": "Shapesanity Stitched Painted", + "Half-Half Rr Wr": "Shapesanity Half-Half Painted", + "Checkered Rr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wr": "Shapesanity Stitched Painted", + "3-1 Rr Wu": "Shapesanity Stitched Painted", + "Half-Half Rr Wu": "Shapesanity Half-Half Painted", + "Checkered Rr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wu": "Shapesanity Stitched Painted", + "3-1 Rr Ww": "Shapesanity Stitched Mixed", + "Half-Half Rr Ww": "Shapesanity Half-Half Mixed", + "Checkered Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Ww": "Shapesanity Stitched Mixed", + "3-1 Rr Wy": "Shapesanity Stitched Mixed", + "Half-Half Rr Wy": "Shapesanity Half-Half Mixed", + "Checkered Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wy": "Shapesanity Stitched Mixed", + "3-1 Ru Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cb": "Shapesanity Stitched Painted", + "3-1 Ru Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cc": "Shapesanity Stitched Mixed", + "3-1 Ru Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cg": "Shapesanity Stitched Painted", + "3-1 Ru Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cp": "Shapesanity Stitched Mixed", + "3-1 Ru Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cr": "Shapesanity Stitched Painted", + "3-1 Ru Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Cu": "Shapesanity Stitched Uncolored", + "3-1 Ru Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cw": "Shapesanity Stitched Mixed", + "3-1 Ru Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cy": "Shapesanity Stitched Mixed", + "3-1 Ru Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rb": "Shapesanity Stitched Painted", + "3-1 Ru Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ru Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rc": "Shapesanity Stitched Mixed", + "3-1 Ru Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rg": "Shapesanity Stitched Painted", + "3-1 Ru Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ru Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rp": "Shapesanity Stitched Mixed", + "3-1 Ru Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rr": "Shapesanity Stitched Painted", + "3-1 Ru Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Ru Rw": "Shapesanity Colorful Full Mixed", + "Checkered Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Ru Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rw": "Shapesanity Stitched Mixed", + "3-1 Ru Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Ru Ry": "Shapesanity Colorful Full Mixed", + "Checkered Ru Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Ru Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Ry": "Shapesanity Stitched Mixed", + "3-1 Ru Sb": "Shapesanity Stitched Painted", + "Half-Half Ru Sb": "Shapesanity Half-Half Painted", + "Checkered Ru Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sb": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sb": "Shapesanity Stitched Painted", + "3-1 Ru Sc": "Shapesanity Stitched Mixed", + "Half-Half Ru Sc": "Shapesanity Half-Half Mixed", + "Checkered Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sc": "Shapesanity Stitched Mixed", + "3-1 Ru Sg": "Shapesanity Stitched Painted", + "Half-Half Ru Sg": "Shapesanity Half-Half Painted", + "Checkered Ru Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sg": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sg": "Shapesanity Stitched Painted", + "3-1 Ru Sp": "Shapesanity Stitched Mixed", + "Half-Half Ru Sp": "Shapesanity Half-Half Mixed", + "Checkered Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sp": "Shapesanity Stitched Mixed", + "3-1 Ru Sr": "Shapesanity Stitched Painted", + "Half-Half Ru Sr": "Shapesanity Half-Half Painted", + "Checkered Ru Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sr": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sr": "Shapesanity Stitched Painted", + "3-1 Ru Su": "Shapesanity Stitched Uncolored", + "Half-Half Ru Su": "Shapesanity Half-Half Uncolored", + "Checkered Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent Singles Ru Su": "Shapesanity Stitched Uncolored", + "Cornered Singles Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Su": "Shapesanity Stitched Uncolored", + "3-1 Ru Sw": "Shapesanity Stitched Mixed", + "Half-Half Ru Sw": "Shapesanity Half-Half Mixed", + "Checkered Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sw": "Shapesanity Stitched Mixed", + "3-1 Ru Sy": "Shapesanity Stitched Mixed", + "Half-Half Ru Sy": "Shapesanity Half-Half Mixed", + "Checkered Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sy": "Shapesanity Stitched Mixed", + "3-1 Ru Wb": "Shapesanity Stitched Painted", + "Half-Half Ru Wb": "Shapesanity Half-Half Painted", + "Checkered Ru Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wb": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wb": "Shapesanity Stitched Painted", + "3-1 Ru Wc": "Shapesanity Stitched Mixed", + "Half-Half Ru Wc": "Shapesanity Half-Half Mixed", + "Checkered Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wc": "Shapesanity Stitched Mixed", + "3-1 Ru Wg": "Shapesanity Stitched Painted", + "Half-Half Ru Wg": "Shapesanity Half-Half Painted", + "Checkered Ru Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wg": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wg": "Shapesanity Stitched Painted", + "3-1 Ru Wp": "Shapesanity Stitched Mixed", + "Half-Half Ru Wp": "Shapesanity Half-Half Mixed", + "Checkered Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wp": "Shapesanity Stitched Mixed", + "3-1 Ru Wr": "Shapesanity Stitched Painted", + "Half-Half Ru Wr": "Shapesanity Half-Half Painted", + "Checkered Ru Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wr": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wr": "Shapesanity Stitched Painted", + "3-1 Ru Wu": "Shapesanity Stitched Uncolored", + "Half-Half Ru Wu": "Shapesanity Half-Half Uncolored", + "Checkered Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Wu": "Shapesanity Stitched Uncolored", + "3-1 Ru Ww": "Shapesanity Stitched Mixed", + "Half-Half Ru Ww": "Shapesanity Half-Half Mixed", + "Checkered Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Ww": "Shapesanity Stitched Mixed", + "3-1 Ru Wy": "Shapesanity Stitched Mixed", + "Half-Half Ru Wy": "Shapesanity Half-Half Mixed", + "Checkered Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wy": "Shapesanity Stitched Mixed", + "3-1 Rw Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cb": "Shapesanity Stitched Mixed", + "3-1 Rw Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cc": "Shapesanity Stitched Mixed", + "3-1 Rw Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cg": "Shapesanity Stitched Mixed", + "3-1 Rw Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cp": "Shapesanity Stitched Mixed", + "3-1 Rw Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cr": "Shapesanity Stitched Mixed", + "3-1 Rw Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cu": "Shapesanity Stitched Mixed", + "3-1 Rw Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cw": "Shapesanity Stitched Mixed", + "3-1 Rw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cy": "Shapesanity Stitched Mixed", + "3-1 Rw Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rb": "Shapesanity Stitched Mixed", + "3-1 Rw Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rc": "Shapesanity Stitched Mixed", + "3-1 Rw Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rg": "Shapesanity Stitched Mixed", + "3-1 Rw Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rp": "Shapesanity Stitched Mixed", + "3-1 Rw Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rr": "Shapesanity Stitched Mixed", + "3-1 Rw Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ru": "Shapesanity Stitched Mixed", + "3-1 Rw Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rw Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rw Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rw Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ry": "Shapesanity Stitched Mixed", + "3-1 Rw Sb": "Shapesanity Stitched Mixed", + "Half-Half Rw Sb": "Shapesanity Half-Half Mixed", + "Checkered Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sb": "Shapesanity Stitched Mixed", + "3-1 Rw Sc": "Shapesanity Stitched Mixed", + "Half-Half Rw Sc": "Shapesanity Half-Half Mixed", + "Checkered Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sc": "Shapesanity Stitched Mixed", + "3-1 Rw Sg": "Shapesanity Stitched Mixed", + "Half-Half Rw Sg": "Shapesanity Half-Half Mixed", + "Checkered Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sg": "Shapesanity Stitched Mixed", + "3-1 Rw Sp": "Shapesanity Stitched Mixed", + "Half-Half Rw Sp": "Shapesanity Half-Half Mixed", + "Checkered Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sp": "Shapesanity Stitched Mixed", + "3-1 Rw Sr": "Shapesanity Stitched Mixed", + "Half-Half Rw Sr": "Shapesanity Half-Half Mixed", + "Checkered Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sr": "Shapesanity Stitched Mixed", + "3-1 Rw Su": "Shapesanity Stitched Mixed", + "Half-Half Rw Su": "Shapesanity Half-Half Mixed", + "Checkered Rw Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Su": "Shapesanity Stitched Mixed", + "3-1 Rw Sw": "Shapesanity Stitched Mixed", + "Half-Half Rw Sw": "Shapesanity Half-Half Mixed", + "Checkered Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sw": "Shapesanity Stitched Mixed", + "3-1 Rw Sy": "Shapesanity Stitched Mixed", + "Half-Half Rw Sy": "Shapesanity Half-Half Mixed", + "Checkered Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sy": "Shapesanity Stitched Mixed", + "3-1 Rw Wb": "Shapesanity Stitched Mixed", + "Half-Half Rw Wb": "Shapesanity Half-Half Mixed", + "Checkered Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wb": "Shapesanity Stitched Mixed", + "3-1 Rw Wc": "Shapesanity Stitched Mixed", + "Half-Half Rw Wc": "Shapesanity Half-Half Mixed", + "Checkered Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wc": "Shapesanity Stitched Mixed", + "3-1 Rw Wg": "Shapesanity Stitched Mixed", + "Half-Half Rw Wg": "Shapesanity Half-Half Mixed", + "Checkered Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wg": "Shapesanity Stitched Mixed", + "3-1 Rw Wp": "Shapesanity Stitched Mixed", + "Half-Half Rw Wp": "Shapesanity Half-Half Mixed", + "Checkered Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wp": "Shapesanity Stitched Mixed", + "3-1 Rw Wr": "Shapesanity Stitched Mixed", + "Half-Half Rw Wr": "Shapesanity Half-Half Mixed", + "Checkered Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wr": "Shapesanity Stitched Mixed", + "3-1 Rw Wu": "Shapesanity Stitched Mixed", + "Half-Half Rw Wu": "Shapesanity Half-Half Mixed", + "Checkered Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wu": "Shapesanity Stitched Mixed", + "3-1 Rw Ww": "Shapesanity Stitched Mixed", + "Half-Half Rw Ww": "Shapesanity Half-Half Mixed", + "Checkered Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ww": "Shapesanity Stitched Mixed", + "3-1 Rw Wy": "Shapesanity Stitched Mixed", + "Half-Half Rw Wy": "Shapesanity Half-Half Mixed", + "Checkered Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wy": "Shapesanity Stitched Mixed", + "3-1 Ry Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cb": "Shapesanity Stitched Mixed", + "3-1 Ry Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cc": "Shapesanity Stitched Mixed", + "3-1 Ry Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cg": "Shapesanity Stitched Mixed", + "3-1 Ry Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cp": "Shapesanity Stitched Mixed", + "3-1 Ry Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cr": "Shapesanity Stitched Mixed", + "3-1 Ry Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cu": "Shapesanity Stitched Mixed", + "3-1 Ry Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cw": "Shapesanity Stitched Mixed", + "3-1 Ry Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cy": "Shapesanity Stitched Mixed", + "3-1 Ry Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rb": "Shapesanity Stitched Mixed", + "3-1 Ry Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rc": "Shapesanity Stitched Mixed", + "3-1 Ry Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rg": "Shapesanity Stitched Mixed", + "3-1 Ry Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rp": "Shapesanity Stitched Mixed", + "3-1 Ry Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rr": "Shapesanity Stitched Mixed", + "3-1 Ry Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Ru": "Shapesanity Stitched Mixed", + "3-1 Ry Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rw": "Shapesanity Stitched Mixed", + "3-1 Ry Sb": "Shapesanity Stitched Mixed", + "Half-Half Ry Sb": "Shapesanity Half-Half Mixed", + "Checkered Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sb": "Shapesanity Stitched Mixed", + "3-1 Ry Sc": "Shapesanity Stitched Mixed", + "Half-Half Ry Sc": "Shapesanity Half-Half Mixed", + "Checkered Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sc": "Shapesanity Stitched Mixed", + "3-1 Ry Sg": "Shapesanity Stitched Mixed", + "Half-Half Ry Sg": "Shapesanity Half-Half Mixed", + "Checkered Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sg": "Shapesanity Stitched Mixed", + "3-1 Ry Sp": "Shapesanity Stitched Mixed", + "Half-Half Ry Sp": "Shapesanity Half-Half Mixed", + "Checkered Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sp": "Shapesanity Stitched Mixed", + "3-1 Ry Sr": "Shapesanity Stitched Mixed", + "Half-Half Ry Sr": "Shapesanity Half-Half Mixed", + "Checkered Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sr": "Shapesanity Stitched Mixed", + "3-1 Ry Su": "Shapesanity Stitched Mixed", + "Half-Half Ry Su": "Shapesanity Half-Half Mixed", + "Checkered Ry Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Su": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Su": "Shapesanity Stitched Mixed", + "3-1 Ry Sw": "Shapesanity Stitched Mixed", + "Half-Half Ry Sw": "Shapesanity Half-Half Mixed", + "Checkered Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sw": "Shapesanity Stitched Mixed", + "3-1 Ry Sy": "Shapesanity Stitched Mixed", + "Half-Half Ry Sy": "Shapesanity Half-Half Mixed", + "Checkered Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sy": "Shapesanity Stitched Mixed", + "3-1 Ry Wb": "Shapesanity Stitched Mixed", + "Half-Half Ry Wb": "Shapesanity Half-Half Mixed", + "Checkered Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wb": "Shapesanity Stitched Mixed", + "3-1 Ry Wc": "Shapesanity Stitched Mixed", + "Half-Half Ry Wc": "Shapesanity Half-Half Mixed", + "Checkered Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wc": "Shapesanity Stitched Mixed", + "3-1 Ry Wg": "Shapesanity Stitched Mixed", + "Half-Half Ry Wg": "Shapesanity Half-Half Mixed", + "Checkered Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wg": "Shapesanity Stitched Mixed", + "3-1 Ry Wp": "Shapesanity Stitched Mixed", + "Half-Half Ry Wp": "Shapesanity Half-Half Mixed", + "Checkered Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wp": "Shapesanity Stitched Mixed", + "3-1 Ry Wr": "Shapesanity Stitched Mixed", + "Half-Half Ry Wr": "Shapesanity Half-Half Mixed", + "Checkered Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wr": "Shapesanity Stitched Mixed", + "3-1 Ry Wu": "Shapesanity Stitched Mixed", + "Half-Half Ry Wu": "Shapesanity Half-Half Mixed", + "Checkered Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wu": "Shapesanity Stitched Mixed", + "3-1 Ry Ww": "Shapesanity Stitched Mixed", + "Half-Half Ry Ww": "Shapesanity Half-Half Mixed", + "Checkered Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Ww": "Shapesanity Stitched Mixed", + "3-1 Ry Wy": "Shapesanity Stitched Mixed", + "Half-Half Ry Wy": "Shapesanity Half-Half Mixed", + "Checkered Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wy": "Shapesanity Stitched Mixed", + "3-1 Sb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cb": "Shapesanity Stitched Painted", + "3-1 Sb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cc": "Shapesanity Stitched Mixed", + "3-1 Sb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cg": "Shapesanity Stitched Painted", + "3-1 Sb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cp": "Shapesanity Stitched Mixed", + "3-1 Sb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cr": "Shapesanity Stitched Painted", + "3-1 Sb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cu": "Shapesanity Stitched Painted", + "3-1 Sb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cw": "Shapesanity Stitched Mixed", + "3-1 Sb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cy": "Shapesanity Stitched Mixed", + "3-1 Sb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rb": "Shapesanity Stitched Painted", + "3-1 Sb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rc": "Shapesanity Stitched Mixed", + "3-1 Sb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rg": "Shapesanity Stitched Painted", + "3-1 Sb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rp": "Shapesanity Stitched Mixed", + "3-1 Sb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rr": "Shapesanity Stitched Painted", + "3-1 Sb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Ru": "Shapesanity Stitched Painted", + "3-1 Sb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rw": "Shapesanity Stitched Mixed", + "3-1 Sb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Ry": "Shapesanity Stitched Mixed", + "3-1 Sb Sc": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sc": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sc": "Shapesanity Stitched Mixed", + "3-1 Sb Sg": "Shapesanity Colorful Full Painted", + "Half-Half Sb Sg": "Shapesanity Colorful Full Painted", + "Checkered Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Sg": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Sg": "Shapesanity Stitched Painted", + "3-1 Sb Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sp": "Shapesanity Stitched Mixed", + "3-1 Sb Sr": "Shapesanity Colorful Full Painted", + "Half-Half Sb Sr": "Shapesanity Colorful Full Painted", + "Checkered Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Sr": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Sr": "Shapesanity Stitched Painted", + "3-1 Sb Su": "Shapesanity Colorful Full Painted", + "Half-Half Sb Su": "Shapesanity Colorful Full Painted", + "Checkered Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Su": "Shapesanity Stitched Painted", + "3-1 Sb Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sw": "Shapesanity Stitched Mixed", + "3-1 Sb Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sy": "Shapesanity Stitched Mixed", + "3-1 Sb Wb": "Shapesanity Stitched Painted", + "Half-Half Sb Wb": "Shapesanity Half-Half Painted", + "Checkered Sb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wb": "Shapesanity Stitched Painted", + "3-1 Sb Wc": "Shapesanity Stitched Mixed", + "Half-Half Sb Wc": "Shapesanity Half-Half Mixed", + "Checkered Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wc": "Shapesanity Stitched Mixed", + "3-1 Sb Wg": "Shapesanity Stitched Painted", + "Half-Half Sb Wg": "Shapesanity Half-Half Painted", + "Checkered Sb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wg": "Shapesanity Stitched Painted", + "3-1 Sb Wp": "Shapesanity Stitched Mixed", + "Half-Half Sb Wp": "Shapesanity Half-Half Mixed", + "Checkered Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wp": "Shapesanity Stitched Mixed", + "3-1 Sb Wr": "Shapesanity Stitched Painted", + "Half-Half Sb Wr": "Shapesanity Half-Half Painted", + "Checkered Sb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wr": "Shapesanity Stitched Painted", + "3-1 Sb Wu": "Shapesanity Stitched Painted", + "Half-Half Sb Wu": "Shapesanity Half-Half Painted", + "Checkered Sb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wu": "Shapesanity Stitched Painted", + "3-1 Sb Ww": "Shapesanity Stitched Mixed", + "Half-Half Sb Ww": "Shapesanity Half-Half Mixed", + "Checkered Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Ww": "Shapesanity Stitched Mixed", + "3-1 Sb Wy": "Shapesanity Stitched Mixed", + "Half-Half Sb Wy": "Shapesanity Half-Half Mixed", + "Checkered Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wy": "Shapesanity Stitched Mixed", + "3-1 Sc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cb": "Shapesanity Stitched Mixed", + "3-1 Sc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cc": "Shapesanity Stitched Mixed", + "3-1 Sc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cg": "Shapesanity Stitched Mixed", + "3-1 Sc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cp": "Shapesanity Stitched Mixed", + "3-1 Sc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cr": "Shapesanity Stitched Mixed", + "3-1 Sc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cu": "Shapesanity Stitched Mixed", + "3-1 Sc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cw": "Shapesanity Stitched Mixed", + "3-1 Sc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cy": "Shapesanity Stitched Mixed", + "3-1 Sc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rb": "Shapesanity Stitched Mixed", + "3-1 Sc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rc": "Shapesanity Stitched Mixed", + "3-1 Sc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rg": "Shapesanity Stitched Mixed", + "3-1 Sc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rp": "Shapesanity Stitched Mixed", + "3-1 Sc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rr": "Shapesanity Stitched Mixed", + "3-1 Sc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ru": "Shapesanity Stitched Mixed", + "3-1 Sc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rw": "Shapesanity Stitched Mixed", + "3-1 Sc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ry": "Shapesanity Stitched Mixed", + "3-1 Sc Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sb": "Shapesanity Stitched Mixed", + "3-1 Sc Sg": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sg": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sg": "Shapesanity Stitched Mixed", + "3-1 Sc Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sp": "Shapesanity Stitched Mixed", + "3-1 Sc Sr": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sr": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sr": "Shapesanity Stitched Mixed", + "3-1 Sc Su": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Su": "Shapesanity Colorful Full Mixed", + "Checkered Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Su": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Su": "Shapesanity Stitched Mixed", + "3-1 Sc Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sw": "Shapesanity Stitched Mixed", + "3-1 Sc Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sy": "Shapesanity Stitched Mixed", + "3-1 Sc Wb": "Shapesanity Stitched Mixed", + "Half-Half Sc Wb": "Shapesanity Half-Half Mixed", + "Checkered Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wb": "Shapesanity Stitched Mixed", + "3-1 Sc Wc": "Shapesanity Stitched Mixed", + "Half-Half Sc Wc": "Shapesanity Half-Half Mixed", + "Checkered Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wc": "Shapesanity Stitched Mixed", + "3-1 Sc Wg": "Shapesanity Stitched Mixed", + "Half-Half Sc Wg": "Shapesanity Half-Half Mixed", + "Checkered Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wg": "Shapesanity Stitched Mixed", + "3-1 Sc Wp": "Shapesanity Stitched Mixed", + "Half-Half Sc Wp": "Shapesanity Half-Half Mixed", + "Checkered Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wp": "Shapesanity Stitched Mixed", + "3-1 Sc Wr": "Shapesanity Stitched Mixed", + "Half-Half Sc Wr": "Shapesanity Half-Half Mixed", + "Checkered Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wr": "Shapesanity Stitched Mixed", + "3-1 Sc Wu": "Shapesanity Stitched Mixed", + "Half-Half Sc Wu": "Shapesanity Half-Half Mixed", + "Checkered Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wu": "Shapesanity Stitched Mixed", + "3-1 Sc Ww": "Shapesanity Stitched Mixed", + "Half-Half Sc Ww": "Shapesanity Half-Half Mixed", + "Checkered Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ww": "Shapesanity Stitched Mixed", + "3-1 Sc Wy": "Shapesanity Stitched Mixed", + "Half-Half Sc Wy": "Shapesanity Half-Half Mixed", + "Checkered Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wy": "Shapesanity Stitched Mixed", + "3-1 Sg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cb": "Shapesanity Stitched Painted", + "3-1 Sg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cc": "Shapesanity Stitched Mixed", + "3-1 Sg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cg": "Shapesanity Stitched Painted", + "3-1 Sg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cp": "Shapesanity Stitched Mixed", + "3-1 Sg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cr": "Shapesanity Stitched Painted", + "3-1 Sg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cu": "Shapesanity Stitched Painted", + "3-1 Sg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cw": "Shapesanity Stitched Mixed", + "3-1 Sg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cy": "Shapesanity Stitched Mixed", + "3-1 Sg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rb": "Shapesanity Stitched Painted", + "3-1 Sg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rc": "Shapesanity Stitched Mixed", + "3-1 Sg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rg": "Shapesanity Stitched Painted", + "3-1 Sg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rp": "Shapesanity Stitched Mixed", + "3-1 Sg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rr": "Shapesanity Stitched Painted", + "3-1 Sg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Ru": "Shapesanity Stitched Painted", + "3-1 Sg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rw": "Shapesanity Stitched Mixed", + "3-1 Sg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Ry": "Shapesanity Stitched Mixed", + "3-1 Sg Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Sb": "Shapesanity Stitched Painted", + "3-1 Sg Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sc": "Shapesanity Stitched Mixed", + "3-1 Sg Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sp": "Shapesanity Stitched Mixed", + "3-1 Sg Sr": "Shapesanity Colorful Full Painted", + "Half-Half Sg Sr": "Shapesanity Colorful Full Painted", + "Checkered Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sg Sr": "Shapesanity Colorful Half Painted", + "Cornered Singles Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Sr": "Shapesanity Stitched Painted", + "3-1 Sg Su": "Shapesanity Colorful Full Painted", + "Half-Half Sg Su": "Shapesanity Colorful Full Painted", + "Checkered Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sg Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Su": "Shapesanity Stitched Painted", + "3-1 Sg Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sw": "Shapesanity Stitched Mixed", + "3-1 Sg Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sy": "Shapesanity Stitched Mixed", + "3-1 Sg Wb": "Shapesanity Stitched Painted", + "Half-Half Sg Wb": "Shapesanity Half-Half Painted", + "Checkered Sg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wb": "Shapesanity Stitched Painted", + "3-1 Sg Wc": "Shapesanity Stitched Mixed", + "Half-Half Sg Wc": "Shapesanity Half-Half Mixed", + "Checkered Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wc": "Shapesanity Stitched Mixed", + "3-1 Sg Wg": "Shapesanity Stitched Painted", + "Half-Half Sg Wg": "Shapesanity Half-Half Painted", + "Checkered Sg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wg": "Shapesanity Stitched Painted", + "3-1 Sg Wp": "Shapesanity Stitched Mixed", + "Half-Half Sg Wp": "Shapesanity Half-Half Mixed", + "Checkered Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wp": "Shapesanity Stitched Mixed", + "3-1 Sg Wr": "Shapesanity Stitched Painted", + "Half-Half Sg Wr": "Shapesanity Half-Half Painted", + "Checkered Sg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wr": "Shapesanity Stitched Painted", + "3-1 Sg Wu": "Shapesanity Stitched Painted", + "Half-Half Sg Wu": "Shapesanity Half-Half Painted", + "Checkered Sg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wu": "Shapesanity Stitched Painted", + "3-1 Sg Ww": "Shapesanity Stitched Mixed", + "Half-Half Sg Ww": "Shapesanity Half-Half Mixed", + "Checkered Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Ww": "Shapesanity Stitched Mixed", + "3-1 Sg Wy": "Shapesanity Stitched Mixed", + "Half-Half Sg Wy": "Shapesanity Half-Half Mixed", + "Checkered Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wy": "Shapesanity Stitched Mixed", + "3-1 Sp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cb": "Shapesanity Stitched Mixed", + "3-1 Sp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cc": "Shapesanity Stitched Mixed", + "3-1 Sp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cg": "Shapesanity Stitched Mixed", + "3-1 Sp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cp": "Shapesanity Stitched Mixed", + "3-1 Sp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cr": "Shapesanity Stitched Mixed", + "3-1 Sp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cu": "Shapesanity Stitched Mixed", + "3-1 Sp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cw": "Shapesanity Stitched Mixed", + "3-1 Sp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cy": "Shapesanity Stitched Mixed", + "3-1 Sp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rb": "Shapesanity Stitched Mixed", + "3-1 Sp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rc": "Shapesanity Stitched Mixed", + "3-1 Sp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rg": "Shapesanity Stitched Mixed", + "3-1 Sp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rp": "Shapesanity Stitched Mixed", + "3-1 Sp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rr": "Shapesanity Stitched Mixed", + "3-1 Sp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ru": "Shapesanity Stitched Mixed", + "3-1 Sp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rw": "Shapesanity Stitched Mixed", + "3-1 Sp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ry": "Shapesanity Stitched Mixed", + "3-1 Sp Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sb": "Shapesanity Stitched Mixed", + "3-1 Sp Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sc": "Shapesanity Stitched Mixed", + "3-1 Sp Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sg": "Shapesanity Stitched Mixed", + "3-1 Sp Sr": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sr": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sr": "Shapesanity Stitched Mixed", + "3-1 Sp Su": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Su": "Shapesanity Colorful Full Mixed", + "Checkered Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Su": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Su": "Shapesanity Stitched Mixed", + "3-1 Sp Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sw": "Shapesanity Stitched Mixed", + "3-1 Sp Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sy": "Shapesanity Stitched Mixed", + "3-1 Sp Wb": "Shapesanity Stitched Mixed", + "Half-Half Sp Wb": "Shapesanity Half-Half Mixed", + "Checkered Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wb": "Shapesanity Stitched Mixed", + "3-1 Sp Wc": "Shapesanity Stitched Mixed", + "Half-Half Sp Wc": "Shapesanity Half-Half Mixed", + "Checkered Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wc": "Shapesanity Stitched Mixed", + "3-1 Sp Wg": "Shapesanity Stitched Mixed", + "Half-Half Sp Wg": "Shapesanity Half-Half Mixed", + "Checkered Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wg": "Shapesanity Stitched Mixed", + "3-1 Sp Wp": "Shapesanity Stitched Mixed", + "Half-Half Sp Wp": "Shapesanity Half-Half Mixed", + "Checkered Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wp": "Shapesanity Stitched Mixed", + "3-1 Sp Wr": "Shapesanity Stitched Mixed", + "Half-Half Sp Wr": "Shapesanity Half-Half Mixed", + "Checkered Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wr": "Shapesanity Stitched Mixed", + "3-1 Sp Wu": "Shapesanity Stitched Mixed", + "Half-Half Sp Wu": "Shapesanity Half-Half Mixed", + "Checkered Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wu": "Shapesanity Stitched Mixed", + "3-1 Sp Ww": "Shapesanity Stitched Mixed", + "Half-Half Sp Ww": "Shapesanity Half-Half Mixed", + "Checkered Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ww": "Shapesanity Stitched Mixed", + "3-1 Sp Wy": "Shapesanity Stitched Mixed", + "Half-Half Sp Wy": "Shapesanity Half-Half Mixed", + "Checkered Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wy": "Shapesanity Stitched Mixed", + "3-1 Sr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cb": "Shapesanity Stitched Painted", + "3-1 Sr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cc": "Shapesanity Stitched Mixed", + "3-1 Sr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cg": "Shapesanity Stitched Painted", + "3-1 Sr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cp": "Shapesanity Stitched Mixed", + "3-1 Sr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cr": "Shapesanity Stitched Painted", + "3-1 Sr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cu": "Shapesanity Stitched Painted", + "3-1 Sr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cw": "Shapesanity Stitched Mixed", + "3-1 Sr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cy": "Shapesanity Stitched Mixed", + "3-1 Sr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rb": "Shapesanity Stitched Painted", + "3-1 Sr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rc": "Shapesanity Stitched Mixed", + "3-1 Sr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rg": "Shapesanity Stitched Painted", + "3-1 Sr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rp": "Shapesanity Stitched Mixed", + "3-1 Sr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rr": "Shapesanity Stitched Painted", + "3-1 Sr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Ru": "Shapesanity Stitched Painted", + "3-1 Sr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rw": "Shapesanity Stitched Mixed", + "3-1 Sr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Ry": "Shapesanity Stitched Mixed", + "3-1 Sr Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Sb": "Shapesanity Stitched Painted", + "3-1 Sr Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sc": "Shapesanity Stitched Mixed", + "3-1 Sr Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Sg": "Shapesanity Stitched Painted", + "3-1 Sr Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sp": "Shapesanity Stitched Mixed", + "3-1 Sr Su": "Shapesanity Colorful Full Painted", + "Half-Half Sr Su": "Shapesanity Colorful Full Painted", + "Checkered Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sr Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Su": "Shapesanity Stitched Painted", + "3-1 Sr Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sr Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sr Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sw": "Shapesanity Stitched Mixed", + "3-1 Sr Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sr Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sr Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sy": "Shapesanity Stitched Mixed", + "3-1 Sr Wb": "Shapesanity Stitched Painted", + "Half-Half Sr Wb": "Shapesanity Half-Half Painted", + "Checkered Sr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wb": "Shapesanity Stitched Painted", + "3-1 Sr Wc": "Shapesanity Stitched Mixed", + "Half-Half Sr Wc": "Shapesanity Half-Half Mixed", + "Checkered Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wc": "Shapesanity Stitched Mixed", + "3-1 Sr Wg": "Shapesanity Stitched Painted", + "Half-Half Sr Wg": "Shapesanity Half-Half Painted", + "Checkered Sr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wg": "Shapesanity Stitched Painted", + "3-1 Sr Wp": "Shapesanity Stitched Mixed", + "Half-Half Sr Wp": "Shapesanity Half-Half Mixed", + "Checkered Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wp": "Shapesanity Stitched Mixed", + "3-1 Sr Wr": "Shapesanity Stitched Painted", + "Half-Half Sr Wr": "Shapesanity Half-Half Painted", + "Checkered Sr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wr": "Shapesanity Stitched Painted", + "3-1 Sr Wu": "Shapesanity Stitched Painted", + "Half-Half Sr Wu": "Shapesanity Half-Half Painted", + "Checkered Sr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wu": "Shapesanity Stitched Painted", + "3-1 Sr Ww": "Shapesanity Stitched Mixed", + "Half-Half Sr Ww": "Shapesanity Half-Half Mixed", + "Checkered Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Ww": "Shapesanity Stitched Mixed", + "3-1 Sr Wy": "Shapesanity Stitched Mixed", + "Half-Half Sr Wy": "Shapesanity Half-Half Mixed", + "Checkered Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wy": "Shapesanity Stitched Mixed", + "3-1 Su Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cb": "Shapesanity Stitched Painted", + "3-1 Su Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cc": "Shapesanity Stitched Mixed", + "3-1 Su Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cg": "Shapesanity Stitched Painted", + "3-1 Su Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cp": "Shapesanity Stitched Mixed", + "3-1 Su Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cr": "Shapesanity Stitched Painted", + "3-1 Su Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Cu": "Shapesanity Stitched Uncolored", + "3-1 Su Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cw": "Shapesanity Stitched Mixed", + "3-1 Su Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cy": "Shapesanity Stitched Mixed", + "3-1 Su Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rb": "Shapesanity Stitched Painted", + "3-1 Su Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rc": "Shapesanity Stitched Mixed", + "3-1 Su Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rg": "Shapesanity Stitched Painted", + "3-1 Su Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rp": "Shapesanity Stitched Mixed", + "3-1 Su Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rr": "Shapesanity Stitched Painted", + "3-1 Su Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Ru": "Shapesanity Stitched Uncolored", + "3-1 Su Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rw": "Shapesanity Stitched Mixed", + "3-1 Su Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Ry": "Shapesanity Stitched Mixed", + "3-1 Su Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sb": "Shapesanity Stitched Painted", + "3-1 Su Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Su Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sc": "Shapesanity Stitched Mixed", + "3-1 Su Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sg": "Shapesanity Stitched Painted", + "3-1 Su Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Su Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sp": "Shapesanity Stitched Mixed", + "3-1 Su Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sr": "Shapesanity Stitched Painted", + "3-1 Su Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Su Sw": "Shapesanity Colorful Full Mixed", + "Checkered Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Su Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sw": "Shapesanity Stitched Mixed", + "3-1 Su Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Su Sy": "Shapesanity Colorful Full Mixed", + "Checkered Su Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Su Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sy": "Shapesanity Stitched Mixed", + "3-1 Su Wb": "Shapesanity Stitched Painted", + "Half-Half Su Wb": "Shapesanity Half-Half Painted", + "Checkered Su Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wb": "Shapesanity Stitched Painted", + "Cornered Singles Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wb": "Shapesanity Stitched Painted", + "3-1 Su Wc": "Shapesanity Stitched Mixed", + "Half-Half Su Wc": "Shapesanity Half-Half Mixed", + "Checkered Su Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wc": "Shapesanity Stitched Mixed", + "3-1 Su Wg": "Shapesanity Stitched Painted", + "Half-Half Su Wg": "Shapesanity Half-Half Painted", + "Checkered Su Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wg": "Shapesanity Stitched Painted", + "Cornered Singles Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wg": "Shapesanity Stitched Painted", + "3-1 Su Wp": "Shapesanity Stitched Mixed", + "Half-Half Su Wp": "Shapesanity Half-Half Mixed", + "Checkered Su Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wp": "Shapesanity Stitched Mixed", + "3-1 Su Wr": "Shapesanity Stitched Painted", + "Half-Half Su Wr": "Shapesanity Half-Half Painted", + "Checkered Su Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wr": "Shapesanity Stitched Painted", + "Cornered Singles Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wr": "Shapesanity Stitched Painted", + "3-1 Su Wu": "Shapesanity Stitched Uncolored", + "Half-Half Su Wu": "Shapesanity Half-Half Uncolored", + "Checkered Su Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Su Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Su Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Wu": "Shapesanity Stitched Uncolored", + "3-1 Su Ww": "Shapesanity Stitched Mixed", + "Half-Half Su Ww": "Shapesanity Half-Half Mixed", + "Checkered Su Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Ww": "Shapesanity Stitched Mixed", + "3-1 Su Wy": "Shapesanity Stitched Mixed", + "Half-Half Su Wy": "Shapesanity Half-Half Mixed", + "Checkered Su Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wy": "Shapesanity Stitched Mixed", + "3-1 Sw Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cb": "Shapesanity Stitched Mixed", + "3-1 Sw Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cc": "Shapesanity Stitched Mixed", + "3-1 Sw Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cg": "Shapesanity Stitched Mixed", + "3-1 Sw Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cp": "Shapesanity Stitched Mixed", + "3-1 Sw Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cr": "Shapesanity Stitched Mixed", + "3-1 Sw Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cu": "Shapesanity Stitched Mixed", + "3-1 Sw Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cw": "Shapesanity Stitched Mixed", + "3-1 Sw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cy": "Shapesanity Stitched Mixed", + "3-1 Sw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rb": "Shapesanity Stitched Mixed", + "3-1 Sw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rc": "Shapesanity Stitched Mixed", + "3-1 Sw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rg": "Shapesanity Stitched Mixed", + "3-1 Sw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rp": "Shapesanity Stitched Mixed", + "3-1 Sw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rr": "Shapesanity Stitched Mixed", + "3-1 Sw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ru": "Shapesanity Stitched Mixed", + "3-1 Sw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rw": "Shapesanity Stitched Mixed", + "3-1 Sw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ry": "Shapesanity Stitched Mixed", + "3-1 Sw Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sb": "Shapesanity Stitched Mixed", + "3-1 Sw Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sc": "Shapesanity Stitched Mixed", + "3-1 Sw Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sg": "Shapesanity Stitched Mixed", + "3-1 Sw Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sp": "Shapesanity Stitched Mixed", + "3-1 Sw Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sr": "Shapesanity Stitched Mixed", + "3-1 Sw Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Su": "Shapesanity Stitched Mixed", + "3-1 Sw Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sw Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sw Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sw Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sy": "Shapesanity Stitched Mixed", + "3-1 Sw Wb": "Shapesanity Stitched Mixed", + "Half-Half Sw Wb": "Shapesanity Half-Half Mixed", + "Checkered Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wb": "Shapesanity Stitched Mixed", + "3-1 Sw Wc": "Shapesanity Stitched Mixed", + "Half-Half Sw Wc": "Shapesanity Half-Half Mixed", + "Checkered Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wc": "Shapesanity Stitched Mixed", + "3-1 Sw Wg": "Shapesanity Stitched Mixed", + "Half-Half Sw Wg": "Shapesanity Half-Half Mixed", + "Checkered Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wg": "Shapesanity Stitched Mixed", + "3-1 Sw Wp": "Shapesanity Stitched Mixed", + "Half-Half Sw Wp": "Shapesanity Half-Half Mixed", + "Checkered Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wp": "Shapesanity Stitched Mixed", + "3-1 Sw Wr": "Shapesanity Stitched Mixed", + "Half-Half Sw Wr": "Shapesanity Half-Half Mixed", + "Checkered Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wr": "Shapesanity Stitched Mixed", + "3-1 Sw Wu": "Shapesanity Stitched Mixed", + "Half-Half Sw Wu": "Shapesanity Half-Half Mixed", + "Checkered Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wu": "Shapesanity Stitched Mixed", + "3-1 Sw Ww": "Shapesanity Stitched Mixed", + "Half-Half Sw Ww": "Shapesanity Half-Half Mixed", + "Checkered Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ww": "Shapesanity Stitched Mixed", + "3-1 Sw Wy": "Shapesanity Stitched Mixed", + "Half-Half Sw Wy": "Shapesanity Half-Half Mixed", + "Checkered Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wy": "Shapesanity Stitched Mixed", + "3-1 Sy Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cb": "Shapesanity Stitched Mixed", + "3-1 Sy Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cc": "Shapesanity Stitched Mixed", + "3-1 Sy Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cg": "Shapesanity Stitched Mixed", + "3-1 Sy Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cp": "Shapesanity Stitched Mixed", + "3-1 Sy Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cr": "Shapesanity Stitched Mixed", + "3-1 Sy Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cu": "Shapesanity Stitched Mixed", + "3-1 Sy Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cw": "Shapesanity Stitched Mixed", + "3-1 Sy Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cy": "Shapesanity Stitched Mixed", + "3-1 Sy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rb": "Shapesanity Stitched Mixed", + "3-1 Sy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rc": "Shapesanity Stitched Mixed", + "3-1 Sy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rg": "Shapesanity Stitched Mixed", + "3-1 Sy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rp": "Shapesanity Stitched Mixed", + "3-1 Sy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rr": "Shapesanity Stitched Mixed", + "3-1 Sy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ru": "Shapesanity Stitched Mixed", + "3-1 Sy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rw": "Shapesanity Stitched Mixed", + "3-1 Sy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ry": "Shapesanity Stitched Mixed", + "3-1 Sy Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sb": "Shapesanity Stitched Mixed", + "3-1 Sy Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sc": "Shapesanity Stitched Mixed", + "3-1 Sy Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sg": "Shapesanity Stitched Mixed", + "3-1 Sy Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sp": "Shapesanity Stitched Mixed", + "3-1 Sy Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sr": "Shapesanity Stitched Mixed", + "3-1 Sy Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Su": "Shapesanity Stitched Mixed", + "3-1 Sy Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sw": "Shapesanity Stitched Mixed", + "3-1 Sy Wb": "Shapesanity Stitched Mixed", + "Half-Half Sy Wb": "Shapesanity Half-Half Mixed", + "Checkered Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wb": "Shapesanity Stitched Mixed", + "3-1 Sy Wc": "Shapesanity Stitched Mixed", + "Half-Half Sy Wc": "Shapesanity Half-Half Mixed", + "Checkered Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wc": "Shapesanity Stitched Mixed", + "3-1 Sy Wg": "Shapesanity Stitched Mixed", + "Half-Half Sy Wg": "Shapesanity Half-Half Mixed", + "Checkered Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wg": "Shapesanity Stitched Mixed", + "3-1 Sy Wp": "Shapesanity Stitched Mixed", + "Half-Half Sy Wp": "Shapesanity Half-Half Mixed", + "Checkered Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wp": "Shapesanity Stitched Mixed", + "3-1 Sy Wr": "Shapesanity Stitched Mixed", + "Half-Half Sy Wr": "Shapesanity Half-Half Mixed", + "Checkered Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wr": "Shapesanity Stitched Mixed", + "3-1 Sy Wu": "Shapesanity Stitched Mixed", + "Half-Half Sy Wu": "Shapesanity Half-Half Mixed", + "Checkered Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wu": "Shapesanity Stitched Mixed", + "3-1 Sy Ww": "Shapesanity Stitched Mixed", + "Half-Half Sy Ww": "Shapesanity Half-Half Mixed", + "Checkered Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ww": "Shapesanity Stitched Mixed", + "3-1 Sy Wy": "Shapesanity Stitched Mixed", + "Half-Half Sy Wy": "Shapesanity Half-Half Mixed", + "Checkered Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wy": "Shapesanity Stitched Mixed", + "3-1 Wb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cb": "Shapesanity Stitched Painted", + "3-1 Wb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cc": "Shapesanity Stitched Mixed", + "3-1 Wb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cg": "Shapesanity Stitched Painted", + "3-1 Wb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cp": "Shapesanity Stitched Mixed", + "3-1 Wb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cr": "Shapesanity Stitched Painted", + "3-1 Wb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cu": "Shapesanity Stitched Painted", + "3-1 Wb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cw": "Shapesanity Stitched Mixed", + "3-1 Wb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cy": "Shapesanity Stitched Mixed", + "3-1 Wb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rb": "Shapesanity Stitched Painted", + "3-1 Wb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rc": "Shapesanity Stitched Mixed", + "3-1 Wb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rg": "Shapesanity Stitched Painted", + "3-1 Wb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rp": "Shapesanity Stitched Mixed", + "3-1 Wb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rr": "Shapesanity Stitched Painted", + "3-1 Wb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Ru": "Shapesanity Stitched Painted", + "3-1 Wb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rw": "Shapesanity Stitched Mixed", + "3-1 Wb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Ry": "Shapesanity Stitched Mixed", + "3-1 Wb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sb": "Shapesanity Stitched Painted", + "3-1 Wb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sc": "Shapesanity Stitched Mixed", + "3-1 Wb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sg": "Shapesanity Stitched Painted", + "3-1 Wb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sp": "Shapesanity Stitched Mixed", + "3-1 Wb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sr": "Shapesanity Stitched Painted", + "3-1 Wb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Su": "Shapesanity Stitched Painted", + "3-1 Wb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sw": "Shapesanity Stitched Mixed", + "3-1 Wb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sy": "Shapesanity Stitched Mixed", + "3-1 Wb Wc": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wc": "Shapesanity East Windmill Mixed", + "Checkered Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wc": "Shapesanity Stitched Mixed", + "3-1 Wb Wg": "Shapesanity East Windmill Painted", + "Half-Half Wb Wg": "Shapesanity East Windmill Painted", + "Checkered Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wg": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wg": "Shapesanity Stitched Painted", + "3-1 Wb Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wp": "Shapesanity East Windmill Mixed", + "Checkered Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wp": "Shapesanity Stitched Mixed", + "3-1 Wb Wr": "Shapesanity East Windmill Painted", + "Half-Half Wb Wr": "Shapesanity East Windmill Painted", + "Checkered Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wr": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wr": "Shapesanity Stitched Painted", + "3-1 Wb Wu": "Shapesanity East Windmill Painted", + "Half-Half Wb Wu": "Shapesanity East Windmill Painted", + "Checkered Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wu": "Shapesanity Stitched Painted", + "3-1 Wb Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wb Ww": "Shapesanity East Windmill Mixed", + "Checkered Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Ww": "Shapesanity Stitched Mixed", + "3-1 Wb Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wy": "Shapesanity East Windmill Mixed", + "Checkered Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wy": "Shapesanity Stitched Mixed", + "3-1 Wc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cb": "Shapesanity Stitched Mixed", + "3-1 Wc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cc": "Shapesanity Stitched Mixed", + "3-1 Wc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cg": "Shapesanity Stitched Mixed", + "3-1 Wc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cp": "Shapesanity Stitched Mixed", + "3-1 Wc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cr": "Shapesanity Stitched Mixed", + "3-1 Wc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cu": "Shapesanity Stitched Mixed", + "3-1 Wc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cw": "Shapesanity Stitched Mixed", + "3-1 Wc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cy": "Shapesanity Stitched Mixed", + "3-1 Wc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rb": "Shapesanity Stitched Mixed", + "3-1 Wc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rc": "Shapesanity Stitched Mixed", + "3-1 Wc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rg": "Shapesanity Stitched Mixed", + "3-1 Wc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rp": "Shapesanity Stitched Mixed", + "3-1 Wc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rr": "Shapesanity Stitched Mixed", + "3-1 Wc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ru": "Shapesanity Stitched Mixed", + "3-1 Wc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rw": "Shapesanity Stitched Mixed", + "3-1 Wc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ry": "Shapesanity Stitched Mixed", + "3-1 Wc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sb": "Shapesanity Stitched Mixed", + "3-1 Wc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sc": "Shapesanity Stitched Mixed", + "3-1 Wc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sg": "Shapesanity Stitched Mixed", + "3-1 Wc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sp": "Shapesanity Stitched Mixed", + "3-1 Wc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sr": "Shapesanity Stitched Mixed", + "3-1 Wc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Su": "Shapesanity Stitched Mixed", + "3-1 Wc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sw": "Shapesanity Stitched Mixed", + "3-1 Wc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sy": "Shapesanity Stitched Mixed", + "3-1 Wc Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wb": "Shapesanity Stitched Mixed", + "3-1 Wc Wg": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wg": "Shapesanity East Windmill Mixed", + "Checkered Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wg": "Shapesanity Stitched Mixed", + "3-1 Wc Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wp": "Shapesanity East Windmill Mixed", + "Checkered Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wp": "Shapesanity Stitched Mixed", + "3-1 Wc Wr": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wr": "Shapesanity East Windmill Mixed", + "Checkered Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wr": "Shapesanity Stitched Mixed", + "3-1 Wc Wu": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wu": "Shapesanity East Windmill Mixed", + "Checkered Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wu": "Shapesanity Stitched Mixed", + "3-1 Wc Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wc Ww": "Shapesanity East Windmill Mixed", + "Checkered Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ww": "Shapesanity Stitched Mixed", + "3-1 Wc Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wy": "Shapesanity East Windmill Mixed", + "Checkered Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wy": "Shapesanity Stitched Mixed", + "3-1 Wg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cb": "Shapesanity Stitched Painted", + "3-1 Wg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cc": "Shapesanity Stitched Mixed", + "3-1 Wg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cg": "Shapesanity Stitched Painted", + "3-1 Wg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cp": "Shapesanity Stitched Mixed", + "3-1 Wg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cr": "Shapesanity Stitched Painted", + "3-1 Wg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cu": "Shapesanity Stitched Painted", + "3-1 Wg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cw": "Shapesanity Stitched Mixed", + "3-1 Wg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cy": "Shapesanity Stitched Mixed", + "3-1 Wg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rb": "Shapesanity Stitched Painted", + "3-1 Wg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rc": "Shapesanity Stitched Mixed", + "3-1 Wg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rg": "Shapesanity Stitched Painted", + "3-1 Wg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rp": "Shapesanity Stitched Mixed", + "3-1 Wg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rr": "Shapesanity Stitched Painted", + "3-1 Wg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Ru": "Shapesanity Stitched Painted", + "3-1 Wg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rw": "Shapesanity Stitched Mixed", + "3-1 Wg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Ry": "Shapesanity Stitched Mixed", + "3-1 Wg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sb": "Shapesanity Stitched Painted", + "3-1 Wg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sc": "Shapesanity Stitched Mixed", + "3-1 Wg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sg": "Shapesanity Stitched Painted", + "3-1 Wg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sp": "Shapesanity Stitched Mixed", + "3-1 Wg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sr": "Shapesanity Stitched Painted", + "3-1 Wg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Su": "Shapesanity Stitched Painted", + "3-1 Wg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sw": "Shapesanity Stitched Mixed", + "3-1 Wg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sy": "Shapesanity Stitched Mixed", + "3-1 Wg Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wb": "Shapesanity Stitched Painted", + "3-1 Wg Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wc": "Shapesanity Stitched Mixed", + "3-1 Wg Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wg Wp": "Shapesanity East Windmill Mixed", + "Checkered Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wp": "Shapesanity Stitched Mixed", + "3-1 Wg Wr": "Shapesanity East Windmill Painted", + "Half-Half Wg Wr": "Shapesanity East Windmill Painted", + "Checkered Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent Singles Wg Wr": "Shapesanity Colorful Half Painted", + "Cornered Singles Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wr": "Shapesanity Stitched Painted", + "3-1 Wg Wu": "Shapesanity East Windmill Painted", + "Half-Half Wg Wu": "Shapesanity East Windmill Painted", + "Checkered Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wg Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wu": "Shapesanity Stitched Painted", + "3-1 Wg Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wg Ww": "Shapesanity East Windmill Mixed", + "Checkered Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Ww": "Shapesanity Stitched Mixed", + "3-1 Wg Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wg Wy": "Shapesanity East Windmill Mixed", + "Checkered Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wy": "Shapesanity Stitched Mixed", + "3-1 Wp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cb": "Shapesanity Stitched Mixed", + "3-1 Wp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cc": "Shapesanity Stitched Mixed", + "3-1 Wp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cg": "Shapesanity Stitched Mixed", + "3-1 Wp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cp": "Shapesanity Stitched Mixed", + "3-1 Wp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cr": "Shapesanity Stitched Mixed", + "3-1 Wp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cu": "Shapesanity Stitched Mixed", + "3-1 Wp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cw": "Shapesanity Stitched Mixed", + "3-1 Wp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cy": "Shapesanity Stitched Mixed", + "3-1 Wp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rb": "Shapesanity Stitched Mixed", + "3-1 Wp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rc": "Shapesanity Stitched Mixed", + "3-1 Wp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rg": "Shapesanity Stitched Mixed", + "3-1 Wp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rp": "Shapesanity Stitched Mixed", + "3-1 Wp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rr": "Shapesanity Stitched Mixed", + "3-1 Wp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ru": "Shapesanity Stitched Mixed", + "3-1 Wp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rw": "Shapesanity Stitched Mixed", + "3-1 Wp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ry": "Shapesanity Stitched Mixed", + "3-1 Wp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sb": "Shapesanity Stitched Mixed", + "3-1 Wp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sc": "Shapesanity Stitched Mixed", + "3-1 Wp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sg": "Shapesanity Stitched Mixed", + "3-1 Wp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sp": "Shapesanity Stitched Mixed", + "3-1 Wp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sr": "Shapesanity Stitched Mixed", + "3-1 Wp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Su": "Shapesanity Stitched Mixed", + "3-1 Wp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sw": "Shapesanity Stitched Mixed", + "3-1 Wp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sy": "Shapesanity Stitched Mixed", + "3-1 Wp Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wb": "Shapesanity Stitched Mixed", + "3-1 Wp Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wc": "Shapesanity Stitched Mixed", + "3-1 Wp Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wg": "Shapesanity Stitched Mixed", + "3-1 Wp Wr": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wr": "Shapesanity East Windmill Mixed", + "Checkered Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wr": "Shapesanity Stitched Mixed", + "3-1 Wp Wu": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wu": "Shapesanity East Windmill Mixed", + "Checkered Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wu": "Shapesanity Stitched Mixed", + "3-1 Wp Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wp Ww": "Shapesanity East Windmill Mixed", + "Checkered Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ww": "Shapesanity Stitched Mixed", + "3-1 Wp Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wy": "Shapesanity East Windmill Mixed", + "Checkered Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wy": "Shapesanity Stitched Mixed", + "3-1 Wr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cb": "Shapesanity Stitched Painted", + "3-1 Wr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cc": "Shapesanity Stitched Mixed", + "3-1 Wr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cg": "Shapesanity Stitched Painted", + "3-1 Wr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cp": "Shapesanity Stitched Mixed", + "3-1 Wr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cr": "Shapesanity Stitched Painted", + "3-1 Wr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cu": "Shapesanity Stitched Painted", + "3-1 Wr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cw": "Shapesanity Stitched Mixed", + "3-1 Wr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cy": "Shapesanity Stitched Mixed", + "3-1 Wr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rb": "Shapesanity Stitched Painted", + "3-1 Wr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rc": "Shapesanity Stitched Mixed", + "3-1 Wr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rg": "Shapesanity Stitched Painted", + "3-1 Wr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rp": "Shapesanity Stitched Mixed", + "3-1 Wr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rr": "Shapesanity Stitched Painted", + "3-1 Wr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Ru": "Shapesanity Stitched Painted", + "3-1 Wr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rw": "Shapesanity Stitched Mixed", + "3-1 Wr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Ry": "Shapesanity Stitched Mixed", + "3-1 Wr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sb": "Shapesanity Stitched Painted", + "3-1 Wr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sc": "Shapesanity Stitched Mixed", + "3-1 Wr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sg": "Shapesanity Stitched Painted", + "3-1 Wr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sp": "Shapesanity Stitched Mixed", + "3-1 Wr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sr": "Shapesanity Stitched Painted", + "3-1 Wr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Su": "Shapesanity Stitched Painted", + "3-1 Wr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sw": "Shapesanity Stitched Mixed", + "3-1 Wr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sy": "Shapesanity Stitched Mixed", + "3-1 Wr Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wb": "Shapesanity Stitched Painted", + "3-1 Wr Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wc": "Shapesanity Stitched Mixed", + "3-1 Wr Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wg": "Shapesanity Stitched Painted", + "3-1 Wr Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wp": "Shapesanity Stitched Mixed", + "3-1 Wr Wu": "Shapesanity East Windmill Painted", + "Half-Half Wr Wu": "Shapesanity East Windmill Painted", + "Checkered Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wr Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wu": "Shapesanity Stitched Painted", + "3-1 Wr Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wr Ww": "Shapesanity East Windmill Mixed", + "Checkered Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wr Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Ww": "Shapesanity Stitched Mixed", + "3-1 Wr Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wr Wy": "Shapesanity East Windmill Mixed", + "Checkered Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wr Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wy": "Shapesanity Stitched Mixed", + "3-1 Wu Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cb": "Shapesanity Stitched Painted", + "3-1 Wu Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cc": "Shapesanity Stitched Mixed", + "3-1 Wu Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cg": "Shapesanity Stitched Painted", + "3-1 Wu Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cp": "Shapesanity Stitched Mixed", + "3-1 Wu Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cr": "Shapesanity Stitched Painted", + "3-1 Wu Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Cu": "Shapesanity Stitched Uncolored", + "3-1 Wu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cw": "Shapesanity Stitched Mixed", + "3-1 Wu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cy": "Shapesanity Stitched Mixed", + "3-1 Wu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rb": "Shapesanity Stitched Painted", + "3-1 Wu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rc": "Shapesanity Stitched Mixed", + "3-1 Wu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rg": "Shapesanity Stitched Painted", + "3-1 Wu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rp": "Shapesanity Stitched Mixed", + "3-1 Wu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rr": "Shapesanity Stitched Painted", + "3-1 Wu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Ru": "Shapesanity Stitched Uncolored", + "3-1 Wu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rw": "Shapesanity Stitched Mixed", + "3-1 Wu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Ry": "Shapesanity Stitched Mixed", + "3-1 Wu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sb": "Shapesanity Stitched Painted", + "3-1 Wu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sc": "Shapesanity Stitched Mixed", + "3-1 Wu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sg": "Shapesanity Stitched Painted", + "3-1 Wu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sp": "Shapesanity Stitched Mixed", + "3-1 Wu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sr": "Shapesanity Stitched Painted", + "3-1 Wu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Su": "Shapesanity Stitched Uncolored", + "3-1 Wu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sw": "Shapesanity Stitched Mixed", + "3-1 Wu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sy": "Shapesanity Stitched Mixed", + "3-1 Wu Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wb": "Shapesanity Stitched Painted", + "3-1 Wu Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wc": "Shapesanity Stitched Mixed", + "3-1 Wu Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wg": "Shapesanity Stitched Painted", + "3-1 Wu Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wp": "Shapesanity Stitched Mixed", + "3-1 Wu Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wr": "Shapesanity Stitched Painted", + "3-1 Wu Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wu Ww": "Shapesanity East Windmill Mixed", + "Checkered Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wu Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Ww": "Shapesanity Stitched Mixed", + "3-1 Wu Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wu Wy": "Shapesanity East Windmill Mixed", + "Checkered Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wu Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wy": "Shapesanity Stitched Mixed", + "3-1 Ww Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cb": "Shapesanity Stitched Mixed", + "3-1 Ww Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cc": "Shapesanity Stitched Mixed", + "3-1 Ww Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cg": "Shapesanity Stitched Mixed", + "3-1 Ww Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cp": "Shapesanity Stitched Mixed", + "3-1 Ww Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cr": "Shapesanity Stitched Mixed", + "3-1 Ww Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cu": "Shapesanity Stitched Mixed", + "3-1 Ww Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cw": "Shapesanity Stitched Mixed", + "3-1 Ww Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cy": "Shapesanity Stitched Mixed", + "3-1 Ww Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rb": "Shapesanity Stitched Mixed", + "3-1 Ww Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rc": "Shapesanity Stitched Mixed", + "3-1 Ww Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rg": "Shapesanity Stitched Mixed", + "3-1 Ww Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rp": "Shapesanity Stitched Mixed", + "3-1 Ww Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rr": "Shapesanity Stitched Mixed", + "3-1 Ww Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Ru": "Shapesanity Stitched Mixed", + "3-1 Ww Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rw": "Shapesanity Stitched Mixed", + "3-1 Ww Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Ry": "Shapesanity Stitched Mixed", + "3-1 Ww Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sb": "Shapesanity Stitched Mixed", + "3-1 Ww Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sc": "Shapesanity Stitched Mixed", + "3-1 Ww Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sg": "Shapesanity Stitched Mixed", + "3-1 Ww Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sp": "Shapesanity Stitched Mixed", + "3-1 Ww Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sr": "Shapesanity Stitched Mixed", + "3-1 Ww Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Su": "Shapesanity Stitched Mixed", + "3-1 Ww Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sw": "Shapesanity Stitched Mixed", + "3-1 Ww Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sy": "Shapesanity Stitched Mixed", + "3-1 Ww Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wb": "Shapesanity Stitched Mixed", + "3-1 Ww Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wc": "Shapesanity Stitched Mixed", + "3-1 Ww Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wg": "Shapesanity Stitched Mixed", + "3-1 Ww Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wp": "Shapesanity Stitched Mixed", + "3-1 Ww Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wr": "Shapesanity Stitched Mixed", + "3-1 Ww Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wu": "Shapesanity Stitched Mixed", + "3-1 Ww Wy": "Shapesanity East Windmill Mixed", + "Half-Half Ww Wy": "Shapesanity East Windmill Mixed", + "Checkered Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Ww Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wy": "Shapesanity Stitched Mixed", + "3-1 Wy Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cb": "Shapesanity Stitched Mixed", + "3-1 Wy Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cc": "Shapesanity Stitched Mixed", + "3-1 Wy Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cg": "Shapesanity Stitched Mixed", + "3-1 Wy Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cp": "Shapesanity Stitched Mixed", + "3-1 Wy Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cr": "Shapesanity Stitched Mixed", + "3-1 Wy Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cu": "Shapesanity Stitched Mixed", + "3-1 Wy Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cw": "Shapesanity Stitched Mixed", + "3-1 Wy Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cy": "Shapesanity Stitched Mixed", + "3-1 Wy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rb": "Shapesanity Stitched Mixed", + "3-1 Wy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rc": "Shapesanity Stitched Mixed", + "3-1 Wy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rg": "Shapesanity Stitched Mixed", + "3-1 Wy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rp": "Shapesanity Stitched Mixed", + "3-1 Wy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rr": "Shapesanity Stitched Mixed", + "3-1 Wy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ru": "Shapesanity Stitched Mixed", + "3-1 Wy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rw": "Shapesanity Stitched Mixed", + "3-1 Wy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ry": "Shapesanity Stitched Mixed", + "3-1 Wy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sb": "Shapesanity Stitched Mixed", + "3-1 Wy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sc": "Shapesanity Stitched Mixed", + "3-1 Wy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sg": "Shapesanity Stitched Mixed", + "3-1 Wy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sp": "Shapesanity Stitched Mixed", + "3-1 Wy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sr": "Shapesanity Stitched Mixed", + "3-1 Wy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Su": "Shapesanity Stitched Mixed", + "3-1 Wy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sw": "Shapesanity Stitched Mixed", + "3-1 Wy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sy": "Shapesanity Stitched Mixed", + "3-1 Wy Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wb": "Shapesanity Stitched Mixed", + "3-1 Wy Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wc": "Shapesanity Stitched Mixed", + "3-1 Wy Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wg": "Shapesanity Stitched Mixed", + "3-1 Wy Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wp": "Shapesanity Stitched Mixed", + "3-1 Wy Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wr": "Shapesanity Stitched Mixed", + "3-1 Wy Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wu": "Shapesanity Stitched Mixed", + "3-1 Wy Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ww": "Shapesanity Stitched Mixed", +} + +shapesanity_three_parts = { + "Adjacent 2-1-1 Cb Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cg Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cg Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Ru": "Shapesanity Stitched Painted", + "Singles Cb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Rg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Rr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cb Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Ru": "Shapesanity Stitched Painted", + "Singles Cg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Ru": "Shapesanity Stitched Painted", + "Singles Cg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Rg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Rr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rg Rr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rg Ru": "Shapesanity Stitched Painted", + "Singles Cg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Rg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Rr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rg Rr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rg Ru": "Shapesanity Stitched Painted", + "Singles Cr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cu Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Rg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Rr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rg Rr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rg Ru": "Shapesanity Stitched Painted", + "Singles Cu Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Ru Su": "Shapesanity Stitched Uncolored", + "Singles Cu Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Ru Wu": "Shapesanity Stitched Uncolored", + "Singles Cu Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Su Wu": "Shapesanity Stitched Uncolored", + "Singles Cu Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cu Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rg Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rg Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Rb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Rb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Rb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Rb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rb Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Rg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Rg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Rg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Rg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Rg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Rg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Rg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Rg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Rr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Rr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Rr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Ru Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Ru Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Rg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Ru Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Ru Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Ru Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Ru Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Su Wu": "Shapesanity Stitched Uncolored", + "Singles Ru Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Ru Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sg Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sg Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Sb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Sb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Sb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Sb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Sb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Sb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sb Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Sg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Sg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Sg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Sg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Sg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Sg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Sg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Sg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Sg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Sg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Sg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Sg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Sg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Sr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Sr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Sr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Sr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Su Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Su Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Su Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Su Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Su Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Su Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Su Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Su Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Su Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Su Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Su Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Su Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Su Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Su Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Su Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Su Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Su Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Su Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Su Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Su Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Su Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wy": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wg Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wr Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wb Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wr Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wg": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wg": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wu Ww": "Shapesanity East Windmill Mixed", +} + +shapesanity_four_parts = { + "Singles Cb Cc Cg Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Su Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Su Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wu Ww Wy": "Shapesanity Stitched Mixed", +} diff --git a/worlds/shapez/data/strings.py b/worlds/shapez/data/strings.py new file mode 100644 index 0000000000..261ca5317e --- /dev/null +++ b/worlds/shapez/data/strings.py @@ -0,0 +1,337 @@ + +class OTHER: + game_name = "shapez" + + +class SLOTDATA: + goal = "goal" + maxlevel = "maxlevel" + finaltier = "finaltier" + req_shapes_mult = "required_shapes_multiplier" + allow_float_layers = "allow_floating_layers" + rand_level_req = "randomize_level_requirements" + rand_upgrade_req = "randomize_upgrade_requirements" + rand_level_logic = "randomize_level_logic" + rand_upgrade_logic = "randomize_upgrade_logic" + throughput_levels_ratio = "throughput_levels_ratio" + comp_growth_gradient = "complexity_growth_gradient" + same_late = "same_late_upgrade_requirements" + toolbar_shuffling = "toolbar_shuffling" + seed = "seed" + shapesanity = "shapesanity" + + @staticmethod + def level_building(number: int) -> str: + return f"Level building {number}" + + @staticmethod + def upgrade_building(number: int) -> str: + return f"Upgrade building {number}" + + @staticmethod + def phase_length(number: int) -> str: + return f"Phase {number} length" + + @staticmethod + def cat_buildings_amount(category: str) -> str: + return f"{category} category buildings amount" + + +class GOALS: + vanilla = "vanilla" + mam = "mam" + even_fasterer = "even_fasterer" + efficiency_iii = "efficiency_iii" + + +class CATEGORY: + belt = "Belt" + miner = "Miner" + processors = "Processors" + painting = "Painting" + random = "Random" + belt_low = "belt" + miner_low = "miner" + processors_low = "processors" + painting_low = "painting" + big = "Big" + small = "Small" + gigantic = "Gigantic" + rising = "Rising" + demonic = "Demonic" + + +class OPTIONS: + logic_vanilla = "vanilla" + logic_stretched = "stretched" + logic_quick = "quick" + logic_random_steps = "random_steps" + logic_hardcore = "hardcore" + logic_dopamine = "dopamine" + logic_dopamine_overflow = "dopamine_overflow" + logic_vanilla_like = "vanilla_like" + logic_linear = "linear" + logic_category = "category" + logic_category_random = "category_random" + logic_shuffled = "shuffled" + sphere_1 = "sphere_1" + buildings_3 = "3_buildings" + buildings_5 = "5_buildings" + + +class REGIONS: + menu = "Menu" + belt = "Shape transportation" + extract = "Shape extraction" + main = "Main" + levels_1 = "Levels with 1 building" + levels_2 = "Levels with 2 buildings" + levels_3 = "Levels with 3 buildings" + levels_4 = "Levels with 4 buildings" + levels_5 = "Levels with 5 buildings" + upgrades_1 = "Upgrades with 1 building" + upgrades_2 = "Upgrades with 2 buildings" + upgrades_3 = "Upgrades with 3 buildings" + upgrades_4 = "Upgrades with 4 buildings" + upgrades_5 = "Upgrades with 5 buildings" + paint_not_quad = "Achievements with (double) painter" + cut_not_quad = "Achievements with half cutter" + rotate_cw = "Achievements with clockwise rotator" + stack_shape = "Achievements with stacker" + store_shape = "Achievements with storage" + trash_shape = "Achievements with trash" + blueprint = "Achievements with blueprints" + wiring = "Achievements with wires" + mam = "Achievements needing a MAM" + any_building = "Achievements with any placeable building" + all_buildings = "Achievements with all main buildings" + all_buildings_x1_6_belt = "Achievements with x1.6 belt speed" + full = "Full" + half = "Half" + piece = "Piece" + stitched = "Stitched" + east_wind = "East Windmill" + half_half = "Half-Half" + col_east_wind = "Colorful East Windmill" + col_half_half = "Colorful Half-Half" + col_full = "Colorful Full" + col_half = "Colorful Half" + uncol = "Uncolored" + painted = "Painted" + mixed = "Mixed" + + @staticmethod + def sanity(processing: str, coloring: str): + return f"Shapesanity {processing} {coloring}" + + +class LOCATIONS: + my_eyes = "My eyes no longer hurt" + painter = "Painter" + cutter = "Cutter" + rotater = "Rotater" + wait_they_stack = "Wait, they stack?" + wires = "Wires" + storage = "Storage" + freedom = "Freedom" + the_logo = "The logo!" + to_the_moon = "To the moon" + its_piling_up = "It's piling up" + use_it_later = "I'll use it later" + efficiency_1 = "Efficiency 1" + preparing_to_launch = "Preparing to launch" + spacey = "SpaceY" + stack_overflow = "Stack overflow" + its_a_mess = "It's a mess" + faster = "Faster" + even_faster = "Even faster" + get_rid_of_them = "Get rid of them" + a_long_time = "It's been a long time" + addicted = "Addicted" + cant_stop = "Can't stop" + is_this_the_end = "Is this the end?" + getting_into_it = "Getting into it" + now_its_easy = "Now it's easy" + computer_guy = "Computer Guy" + speedrun_master = "Speedrun Master" + speedrun_novice = "Speedrun Novice" + not_idle_game = "Not an idle game" + efficiency_2 = "Efficiency 2" + branding_1 = "Branding specialist 1" + branding_2 = "Branding specialist 2" + king_of_inefficiency = "King of Inefficiency" + its_so_slow = "It's so slow" + mam = "MAM (Make Anything Machine)" + perfectionist = "Perfectionist" + next_dimension = "The next dimension" + oops = "Oops" + copy_pasta = "Copy-Pasta" + ive_seen_that_before = "I've seen that before ..." + memories = "Memories from the past" + i_need_trains = "I need trains" + a_bit_early = "A bit early?" + gps = "GPS" + goal = "Goal" + + @staticmethod + def level(number: int, additional: int = 0) -> str: + if not additional: + return f"Level {number}" + elif additional == 1: + return f"Level {number} Additional" + else: + return f"Level {number} Additional {additional}" + + @staticmethod + def upgrade(category: str, tier: str) -> str: + return f"{category} Upgrade Tier {tier}" + + @staticmethod + def shapesanity(number: int) -> str: + return f"Shapesanity {number}" + + +class ITEMS: + cutter = "Cutter" + cutter_quad = "Quad Cutter" + rotator = "Rotator" + rotator_ccw = "Rotator (CCW)" + rotator_180 = "Rotator (180°)" + stacker = "Stacker" + painter = "Painter" + painter_double = "Double Painter" + painter_quad = "Quad Painter" + color_mixer = "Color Mixer" + + belt = "Belt" + extractor = "Extractor" + extractor_chain = "Chaining Extractor" + balancer = "Balancer" + comp_merger = "Compact Merger" + comp_splitter = "Compact Splitter" + tunnel = "Tunnel" + tunnel_tier_ii = "Tunnel Tier II" + trash = "Trash" + + belt_reader = "Belt Reader" + storage = "Storage" + switch = "Switch" + item_filter = "Item Filter" + display = "Display" + wires = "Wires" + const_signal = "Constant Signal" + logic_gates = "Logic Gates" + virtual_proc = "Virtual Processing" + blueprints = "Blueprints" + + upgrade_big_belt = "Big Belt Upgrade" + upgrade_big_miner = "Big Miner Upgrade" + upgrade_big_proc = "Big Processors Upgrade" + upgrade_big_paint = "Big Painting Upgrade" + upgrade_small_belt = "Small Belt Upgrade" + upgrade_small_miner = "Small Miner Upgrade" + upgrade_small_proc = "Small Processors Upgrade" + upgrade_small_paint = "Small Painting Upgrade" + upgrade_gigantic_belt = "Gigantic Belt Upgrade" + upgrade_gigantic_miner = "Gigantic Miner Upgrade" + upgrade_gigantic_proc = "Gigantic Processors Upgrade" + upgrade_gigantic_paint = "Gigantic Painting Upgrade" + upgrade_rising_belt = "Rising Belt Upgrade" + upgrade_rising_miner = "Rising Miner Upgrade" + upgrade_rising_proc = "Rising Processors Upgrade" + upgrade_rising_paint = "Rising Painting Upgrade" + trap_upgrade_belt = "Belt Upgrade Trap" + trap_upgrade_miner = "Miner Upgrade Trap" + trap_upgrade_proc = "Processors Upgrade Trap" + trap_upgrade_paint = "Painting Upgrade Trap" + trap_upgrade_demonic_belt = "Demonic Belt Upgrade Trap" + trap_upgrade_demonic_miner = "Demonic Miner Upgrade Trap" + trap_upgrade_demonic_proc = "Demonic Processors Upgrade Trap" + trap_upgrade_demonic_paint = "Demonic Painting Upgrade Trap" + upgrade_big_random = "Big Random Upgrade" + upgrade_small_random = "Small Random Upgrade" + + @staticmethod + def upgrade(size: str, category: str) -> str: + return f"{size} {category} Upgrade" + + @staticmethod + def trap_upgrade(category: str, size: str = "") -> str: + return f"{size} {category} Upgrade Trap".strip() + + bundle_blueprint = "Blueprint Shapes Bundle" + bundle_level = "Level Shapes Bundle" + bundle_upgrade = "Upgrade Shapes Bundle" + + trap_locked = "Locked Building Trap" + trap_throttled = "Throttled Building Trap" + trap_malfunction = "Malfunctioning Trap" + trap_inflation = "Inflation Trap" + trap_draining_inv = "Inventory Draining Trap" + trap_draining_blueprint = "Blueprint Shapes Draining Trap" + trap_draining_level = "Level Shapes Draining Trap" + trap_draining_upgrade = "Upgrade Shapes Draining Trap" + trap_clear_belts = "Belts Clearing Trap" + + goal = "Goal" + + +class SHAPESANITY: + circle = "Circle" + square = "Square" + star = "Star" + windmill = "Windmill" + red = "Red" + blue = "Blue" + green = "Green" + yellow = "Yellow" + purple = "Purple" + cyan = "Cyan" + white = "White" + uncolored = "Uncolored" + adjacent_pos = "Adjacent" + cornered_pos = "Cornered" + + @staticmethod + def full(color: str, subshape: str): + return f"{color} {subshape}" + + @staticmethod + def half(color: str, subshape: str): + return f"Half {color} {subshape}" + + @staticmethod + def piece(color: str, subshape: str): + return f"{color} {subshape} Piece" + + @staticmethod + def cutout(color: str, subshape: str): + return f"Cut Out {color} {subshape}" + + @staticmethod + def cornered(color: str, subshape: str): + return f"Cornered {color} {subshape}" + + @staticmethod + def three_one(first: str, second: str): + return f"3-1 {first} {second}" + + @staticmethod + def halfhalf(combo: str): + return f"Half-Half {combo}" + + @staticmethod + def checkered(combo: str): + return f"Checkered {combo}" + + @staticmethod + def singles(combo: str, position: str = ""): + return f"{position} Singles {combo}".strip() + + @staticmethod + def two_one(first: str, second: str, position: str): + return f"{position} 2-1 {first} {second}" + + @staticmethod + def two_one_one(first: str, second: str, position: str): + return f"{position} 2-1-1 {first} {second}" diff --git a/worlds/shapez/docs/datapackage_settings_de.md b/worlds/shapez/docs/datapackage_settings_de.md new file mode 100644 index 0000000000..ae375f3e3c --- /dev/null +++ b/worlds/shapez/docs/datapackage_settings_de.md @@ -0,0 +1,35 @@ +# Anleitung zum Ändern der maximalen Anzahl an Locations in shapez + +## Wo finde ich die Einstellungen zum Erhöhen/Verringern der maximalen Anzahl an Locations? + +Die Maximalwerte von `goal_amount` und `shapesanity_amount` sind fest eingebaute Einstellungen, die das Datenpaket des +Spiels beeinflussen. Sie sind in einer Datei names `options.json` innerhalb der APWorld festgelegt. Durch das Ändern +dieser Werte erschaffst du eine custom APWorld, die nur auf deinem PC existiert. + +## Wie du die Datenpaket-Einstellungen änderst + +Diese Anleitung ist für erfahrene Nutzer und kann in nicht richtig funktionierender Software resultieren, wenn sie nicht +ordnungsgemäß befolgt wird. Anwendung auf eigene Gefahr. + +1. Navigiere zu `/lib/worlds`. +2. Benenne `shapez.apworld` zu `shapez.zip` um. +3. Öffne die Zip-Datei und navigiere zu `shapez/data/options.json`. +4. Ändere die Werte in dieser Datei nach Belieben und speichere die Datei. + - `max_shapesanity` kann nicht weniger als `4` sein, da dies die benötigte Mindestanzahl zum Verhindern von + FillErrors ist. + - `max_shapesanity` kann auch nicht mehr als `75800` sein, da dies die maximale Anzahl an möglichen Shapesanity-Namen + ist. Ansonsten könnte die Generierung der Multiworld fehlschlagen. + - `max_levels_and_upgrades` kann nicht weniger als `27` sein, da dies die Mindestanzahl für das `mam`-Ziel ist. +5. Schließe die Zip-Datei und benenne sie zurück zu `shapez.apworld`. + +## Warum muss ich das ganze selbst machen? + +Alle Spiele in Archipelago müssen eine Liste aller möglichen Locations **unabhängig der Spieler-Optionen** +bereitstellen. Diese Listen aller in einer Multiworld inkludierten Spiele werden in den Daten der Multiworld gespeichert +und an alle verbundenen Clients gesendet. Je mehr mögliche Locations, desto größer das Datenpaket. Und mit ~80000 +möglichen Locations hatte shapez zu einem gewissen Zeitpunkt ein (von der Datenmenge her) größeres Datenpaket als alle +supporteten Spiele zusammen. Um also diese Datenmenge zu reduzieren wurden die ausgeschriebenen +Shapesanity-Locations-Namen (`Shapesanity Uncolored Circle`, `Shapesanity Blue Rectangle`, ...) durch standardisierte +Namen (`Shapesanity 1`, `Shapesanity 2`, ...) ersetzt. Durch das Ändern dieser Maximalwerte, und damit das Erstellen +einer custom APWorld, kannst du die Anzahl der möglichen Locations erhöhen, wirst aber auch gleichzeitig das Datenpaket +vergrößern. diff --git a/worlds/shapez/docs/datapackage_settings_en.md b/worlds/shapez/docs/datapackage_settings_en.md new file mode 100644 index 0000000000..fd0ed1673d --- /dev/null +++ b/worlds/shapez/docs/datapackage_settings_en.md @@ -0,0 +1,33 @@ +# Guide to change maximum locations in shapez + +## Where do I find the settings to increase/decrease the amount of possible locations? + +The maximum values of the `goal_amount` and `shapesanity_amount` are hardcoded settings that affect the datapackage. +They are stored in a file called `options.json` inside the apworld. By changing them, you will create a custom apworld +on your local machine. + +## How to change datapackage options + +This tutorial is for advanced users and can result in the software not working properly, if not read carefully. +Proceed at your own risk. + +1. Go to `/lib/worlds`. +2. Rename `shapez.apworld` to `shapez.zip`. +3. Open the zip file and go to `shapez/data/options.json`. +4. Edit the values in this file to your desire and save the file. + - `max_shapesanity` cannot be lower than `4`, as this is the minimum amount to prevent FillErrors. + - `max_shapesanity` also cannot be higher than `75800`, as this is the maximum amount of possible shapesanity names. + Else the multiworld generation might fail. + - `max_levels_and_upgrades` cannot be lower than `27`, as this is the minimum amount for the `mam` goal to properly + work. +5. Close the zip and rename it back to `shapez.apworld`. + +## Why do I have to do this manually? + +For every game in Archipelago, there must be a list of all possible locations, **regardless of player options**. When +generating a multiworld, a list of all locations of all included games will be saved in the multiworld data and sent to +all clients. The higher the amount of possible locations, the bigger the datapackage. And having ~80000 possible +locations at one point made the datapackage for shapez bigger than all other supported games combined. So to reduce the +datapackage of shapez, the locations for shapesanity are named `Shapesanity 1`, `Shapesanity 2` etc. instead of their +actual names. By creating a custom apworld, you can increase the amount of possible locations, but you will also +increase the size of the datapackage at the same time. diff --git a/worlds/shapez/docs/de_shapez.md b/worlds/shapez/docs/de_shapez.md new file mode 100644 index 0000000000..5ef8f13f79 --- /dev/null +++ b/worlds/shapez/docs/de_shapez.md @@ -0,0 +1,71 @@ +# shapez + +## Was für ein Spiel ist das? + +shapez ist ein Automatisierungsspiel, in dem du Formen aus zufällig generierten Vorkommen in einer endlosen Welt +extrahierst, zerschneidest, rotierst, stapelst, anmalst und schließlich zum Zentrum beförderst, um Level abzuschließen +und Upgrades zu kaufen. Das Tutorial beinhaltet 26 Level, in denen du (fast) immer ein neues Gebäude oder eine neue +Spielmechanik freischaltest. Danach folgen endlos weitere Level mit zufällig generierten Vorgaben. Um das Spiel bzw. +deine Gebäude schneller zu machen, kannst du bis zu 1000 Upgrades (pro Kategorie) kaufen. + +## Wo ist die Optionen-Seite? + +Die [Spieler-Optionen-Seite für dieses Spiel](../player-options) enthält alle Optionen zum Erstellen und exportieren +einer YAML-Datei. +Zusätzlich gibt es zu diesem Spiel "Datenpaket-Einstellungen", die du nach +[dieser Anleitung](/tutorial/shapez/datapackage_settings/de) einstellen kannst. + +## Inwiefern wird das Spiel randomisiert? + +Alle Belohnungen aus den Tutorial-Level (das Freischalten von Gebäuden und Spielmechaniken) und Verbesserungen durch +Upgrades werden dem Itempool der Multiworld hinzugefügt. Außerdem werden, wenn so in den Spieler-Optionen festgelegt, +die Bedingungen zum Abschließen eines Levels und zum Kaufen der Upgrades randomisiert. + +## Was ist das Ziel von shapez in Archipelago? + +Da das Spiel eigentlich kein konkretes Ziel (nach dem Tutorial) hat, kann man sich zwischen (momentan) 4 verschiedenen +Zielen entscheiden: +1. Vanilla: Schließe Level 26 ab (eigentlich das Ende des Tutorials). +2. MAM: Schließe ein bestimmtes Level nach Level 26 ab, das zuvor in den Spieler-Optionen festgelegt wurde. Es ist +empfohlen, eine Maschine zu bauen, die alles automatisch herstellt ("Make-Anything-Machine", kurz MAM). +3. Even Fasterer: Kaufe alle Upgrades bis zu einer in den Spieler-Optionen festgelegten Stufe (nach Stufe 8). +4. Efficiency III: Liefere 256 Blaupausen-Formen pro Sekunde ins Zentrum. + +## Welche Items können in den Welten anderer Spieler erscheinen? + +- Freischalten verschiedener Gebäude +- Blaupausen freischalten +- Große Upgrades (addiert 1 zum Geschwindigkeitsmultiplikator) +- Kleine Upgrades (addiert 0.1 zum Geschwindigkeitsmultiplikator) +- Andere ungewöhnliche Upgrades (optional) +- Verschiedene Bündel, die bestimmte Formen enthalten +- Fallen, die bestimmte Formen aus dem Zentrum dränieren (ja, das Wort gibt es) +- Fallen, die zufällige Gebäude oder andere Spielmechaniken betreffen + +## Was ist eine Location / ein Check? + +- Level (minimum 1-25, bis zu 499 je nach Spieler-Optionen, mit zusätzlichen Checks für Level 1 und 20) +- Upgrades (minimum Stufen II-VIII (2-8), bis zu D (500) je nach Spieler-Optionen) +- Bestimmte Formen mindestens einmal ins Zentrum liefern ("Shapesanity", bis zu 1000 zufällig gewählte Definitionen) +- Errungenschaften (bis zu 45) + +## Was passiert, wenn der Spieler ein Item erhält? + +Ein Pop-Up erscheint, das das/die erhaltene(n) Item(s) und eventuell weitere Informationen auflistet. + +## Was bedeuten die Namen dieser ganzen Shapesanity Dinger? + +Hier ist ein Spicker für die Englischarbeit (bloß nicht dem Lehrer zeigen): + +![image](https://raw.githubusercontent.com/BlastSlimey/Archipelago/refs/heads/main/worlds/shapez/docs/shapesanity_full.png) + +## Kann ich auch weitere Mods neben dem AP Client installieren? + +Zurzeit wird Kompatibilität mit anderen Mods nicht unterstützt, aber niemand kann dich davon abhalten, es trotzdem zu +versuchen. Mods, die das Gameplay verändern, werden wahrscheinlich nicht funktionieren, indem sie das Laden der +jeweiligen Mods verhindern oder das Spiel zum Abstürzen bringen, während einfache QoL-Mods vielleicht problemlos +funktionieren könnten. Wenn du es versuchst, dann also auf eigene Gefahr. + +## Hast du wirklich eine deutschsprachige Infoseite geschrieben, obwohl man sie aktuell nur über Umwege erreichen kann und du eigentlich an dem Praktikumsportfolio arbeiten solltest? + +Ja diff --git a/worlds/shapez/docs/en_shapez.md b/worlds/shapez/docs/en_shapez.md new file mode 100644 index 0000000000..4af398c5f1 --- /dev/null +++ b/worlds/shapez/docs/en_shapez.md @@ -0,0 +1,65 @@ +# shapez + +## What is this game? + +shapez is an automation game about cutting, rotating, stacking, and painting shapes, that you extract from randomly +generated patches on an infinite canvas, and sending them to the hub to complete levels. The "tutorial", where you +unlock a new building or game mechanic (almost) each level, lasts until level 26, where you unlock freeplay with +infinitely more levels, that require a new, randomly generated shape. Alongside the levels, you can unlock upgrades, +that make your buildings work faster. + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure +and export a config file. +There are also some advanced "datapackage settings" that can be changed by following +[this guide](/tutorial/shapez/datapackage_settings/en). + +## What does randomization do to this game? + +Buildings and gameplay mechanics, that you normally unlock by completing a level, and upgrade improvements are put +into the item pool of the multiworld. Also, if enabled, the requirements for completing a level or buying an upgrade are +randomized. + +## What is the goal of shapez in Archipelago? + +As the game has no actual goal where the game ends, there are (currently) 4 different goals you can choose from in the +player options: +1. Vanilla: Complete level 26 (the end of the tutorial). +2. MAM: Complete a player-specified level after level 26. It's recommended to build a Make-Anything-Machine (MAM). +3. Even Fasterer: Upgrade everything to a player-specified tier after tier 8. +4. Efficiency III: Deliver 256 blueprint shapes per second to the hub. + +## Which items can be in another player's world? + +- Unlock different buildings +- Unlock blueprints +- Big upgrade improvements (adds 1 to the multiplier) +- Small upgrade improvements (adds .1 to the multiplier) +- Other unusual upgrade improvements (optional) +- Different shapes bundles +- Inventory draining traps +- Different traps afflicting random buildings and game mechanics + +## What is considered a location check? + +- Levels (minimum 1-25, up to 499 depending on player options, with additional checks for levels 1 and 20) +- Upgrades (minimum tiers II-VIII (2-8), up to D (500) depending on player options) +- Delivering certain shapes at least once to the hub ("shapesanity", up to 1000 from a 75800 names pool) +- Achievements (up to 45) + +## When the player receives an item, what happens? + +A pop-up will show, which item(s) were received, with additional information on some of them. + +## What do the names of all these shapesanity locations mean? + +Here's a cheat sheet: + +![image](https://raw.githubusercontent.com/BlastSlimey/Archipelago/refs/heads/main/worlds/shapez/docs/shapesanity_full.png) + +## Can I use other mods alongside the AP client? + +At the moment, compatibility with other mods is not supported, but not forbidden. Gameplay altering mods will most +likely crash the game or disable loading the afflicted mods, while QoL mods might work without problems. Try at your own +risk. diff --git a/worlds/shapez/docs/setup_de.md b/worlds/shapez/docs/setup_de.md new file mode 100644 index 0000000000..1b927f3790 --- /dev/null +++ b/worlds/shapez/docs/setup_de.md @@ -0,0 +1,62 @@ +# Setup-Anleitung für shapez: Archipelago + +## Schnelle Links + +- Info-Seite zum Spiel + * [English](/games/shapez/info/en) + * [Deutsch](/games/shapez/info/de) +- [Spieler-Optionen-Seite](/games/shapez/player-options) + +## Benötigte Software + +- Eine installierbare und aktuelle PC-Version von shapez ([Steam](https://store.steampowered.com/app/1318690/shapez/)). +- Die shapezipelago Mod von der [mod.io-Seite](https://mod.io/g/shapez/m/shapezipelago). + +## Optionale Software + +- Archipelago von der [Archipelago-Release-Seite](https://github.com/ArchipelagoMW/Archipelago/releases) + * (Für den Text-Client) + * (Alternativ kannst du auch die eingebaute Konsole (nur lesbar) nutzen, indem du beim Starten des Spiels den + `-dev`-Parameter verwendest) +- Universal Tracker (schau im `#future-game-design`-Thread für UT auf dem Discord-Server nach der aktuellen Anleitung) + +## Installation + +Da das Spiel einen eingebauten Mod-Loader hat, musst du nur die "shapezipelago@X.X.X.js"-Datei in den dafür vorgesehenen +Ordner kopieren. Wenn du nicht weißt, wo dieser ist, dann öffne das Spiel, drücke auf "MODS" und schließlich auf +"MODORDNER ÖFFNEN". + +Du solltest (egal ob vor oder nach der Installation) die Einstellungen des Spiels öffnen und `HINWEISE & TUTORIALS` im +Reiter `BENUTZEROBERFLÄCHE` ausschalten, da sie sonst den Upgrade-Shop verstecken wird, bis du ein paar Level +abgeschlossen hast. + +## Erstellen deiner YAML-Datei + +### Was ist eine YAML-Datei und wofür brauche ich die? + +Deine persönliche YAML-Datei beinhaltet eine Reihe von Optionen, die der Zufallsgenerator zum Erstellen von deinem +Spiel benötigt. Jeder Spieler einer Multiworld stellt seine eigene YAML-Datei zur Verfügung. Dadurch kann jeder Spieler +sein Spiel nach seinem eigenen Geschmack gestalten, während andere Spieler unabhängig davon ihre eigenen Optionen +wählen können! + +### Wo bekomme ich so eine YAML-Datei her? + +Du kannst auf der [shapez-Spieler-Optionen-Seite](/games/shapez/player-options) eine YAML-Datei generieren oder ein +Template herunterladen. + +## Einer MultiWorld beitreten + +1. Öffne das Spiel. +2. Gib im Hauptmenü den Slot-Namen, die Adresse, den Port und das Passwort (optional) in die dafür vorgesehene Box ein. +3. Drücke auf "Connect". + - Erneutes Drücken trennt die Verbindung zum Server. + - Ob du verbunden bist, steht direkt daneben. +4. Starte ein neues Spiel. + +Nachdem der Speicherstand erstellt wurde und du zum Hauptmenü zurückkehrst, wird das erneute Öffnen des Speicherstandes +erneut verbinden. + +### Der Port/Die Adresse der MultiWorld hat sich geändert, wie trete ich mit meinem existierenden Speicherstand bei? + +Wiederhole die Schritte 1-3 und öffne den existierenden Speicherstand. Dies wird außerdem die gespeicherten Login-Daten +überschreiben, sodass du dies nur einmal machen musst. \ No newline at end of file diff --git a/worlds/shapez/docs/setup_en.md b/worlds/shapez/docs/setup_en.md new file mode 100644 index 0000000000..4c91c16a0b --- /dev/null +++ b/worlds/shapez/docs/setup_en.md @@ -0,0 +1,58 @@ +# Setup Guide for shapez: Archipelago + +## Quick Links + +- Game Info Page + * [English](/games/shapez/info/en) + * [Deutsch](/games/shapez/info/de) +- [Player Options Page](/games/shapez/player-options) + +## Required Software + +- An installable, up-to-date PC version of shapez ([Steam](https://store.steampowered.com/app/1318690/shapez/)). +- The shapezipelago mod from the [mod.io page](https://mod.io/g/shapez/m/shapezipelago). + +## Optional Software + +- Archipelago from the [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) + * (Only for the TextClient) + * (If you want, you can use the built-in console as a read-only text client by launching the game + with the `-dev` parameter) +- Universal Tracker (check UT's `#future-game-design` thread in the discord server for instructions) + +## Installation + +As the game has a built-in mod loader, all you need to do is copy the `shapezipelago@X.X.X.js` mod file into the mods +folder. If you don't know where that is, open the game, click on `MODS`, and then `OPEN MODS FOLDER`. + +It is recommended to go into the settings of the game and disable `HINTS & TUTORIALS` in the `USER INTERFACE` tab, as +this setting will disable the upgrade shop until you complete a few levels. + +## Configuring your YAML file + +### What is a YAML file and why do I need one? + +Your YAML file contains a set of configuration options which provide the generator with information about how it should +generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy +an experience customized for their taste, and different players in the same multiworld can all have different options. + +### Where do I get a YAML file? + +You can generate a yaml or download a template by visiting the +[shapez Player Options Page](/games/shapez/player-options) + +## Joining a MultiWorld Game + +1. Open the game. +2. In the main menu, type the slot name, address, port, and password (optional) into the input box. +3. Click "Connect". + - To disconnect, just press this button again. + - The status of your connection is shown right next to the button. +4. Create a new game. + +After creating the save file and returning to the main menu, opening the save file again will automatically reconnect. + +### The MultiWorld changed its port/address, how do I reconnect correctly with my existing save file? + +Repeat steps 1-3 and open the existing save file. This will also overwrite the saved connection details, so you will +only have to do this once. diff --git a/worlds/shapez/docs/shapesanity_full.png b/worlds/shapez/docs/shapesanity_full.png new file mode 100644 index 0000000000000000000000000000000000000000..494065d51454bded26be04c191e080028a17eef5 GIT binary patch literal 127240 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%0D8uo? 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∓OIY_C6szbNeM% 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 literal 0 HcmV?d00001 diff --git a/worlds/shapez/items.py b/worlds/shapez/items.py new file mode 100644 index 0000000000..aef4c03317 --- /dev/null +++ b/worlds/shapez/items.py @@ -0,0 +1,279 @@ +from typing import Dict, Callable, Any, List + +from BaseClasses import Item, ItemClassification as IClass +from .options import ShapezOptions +from .data.strings import GOALS, ITEMS, OTHER + + +def is_mam_achievement_included(options: ShapezOptions) -> IClass: + return IClass.progression if options.include_achievements and (not options.goal == GOALS.vanilla) else IClass.useful + + +def is_achievements_included(options: ShapezOptions) -> IClass: + return IClass.progression if options.include_achievements else IClass.useful + + +def is_goal_efficiency_iii(options: ShapezOptions) -> IClass: + return IClass.progression if options.goal == GOALS.efficiency_iii else IClass.useful + + +def always_progression(options: ShapezOptions) -> IClass: + return IClass.progression + + +def always_useful(options: ShapezOptions) -> IClass: + return IClass.useful + + +def always_filler(options: ShapezOptions) -> IClass: + return IClass.filler + + +def always_trap(options: ShapezOptions) -> IClass: + return IClass.trap + + +# Routing buildings are not needed to complete the game, but building factories without balancers and tunnels +# would be unreasonably complicated and time-consuming. +# Some buildings are not needed to complete the game, but are "logically needed" for the "MAM" achievement. + +buildings_processing: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.cutter: always_progression, + ITEMS.cutter_quad: always_progression, + ITEMS.rotator: always_progression, + ITEMS.rotator_ccw: always_progression, + ITEMS.rotator_180: always_progression, + ITEMS.stacker: always_progression, + ITEMS.painter: always_progression, + ITEMS.painter_double: always_progression, + ITEMS.painter_quad: always_progression, + ITEMS.color_mixer: always_progression, +} + +buildings_routing: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.balancer: always_progression, + ITEMS.comp_merger: always_progression, + ITEMS.comp_splitter: always_progression, + ITEMS.tunnel: always_progression, + ITEMS.tunnel_tier_ii: is_mam_achievement_included, +} + +buildings_other: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trash: always_progression, + ITEMS.extractor_chain: always_useful +} + +buildings_top_row: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.belt_reader: is_mam_achievement_included, + ITEMS.storage: is_achievements_included, + ITEMS.switch: always_progression, + ITEMS.item_filter: is_mam_achievement_included, + ITEMS.display: always_useful +} + +buildings_wires: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.wires: always_progression, + ITEMS.const_signal: always_progression, + ITEMS.logic_gates: is_mam_achievement_included, + ITEMS.virtual_proc: is_mam_achievement_included +} + +gameplay_unlocks: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.blueprints: is_achievements_included +} + +upgrades: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.upgrade_big_belt: always_progression, + ITEMS.upgrade_big_miner: always_useful, + ITEMS.upgrade_big_proc: always_useful, + ITEMS.upgrade_big_paint: always_useful, + ITEMS.upgrade_small_belt: always_filler, + ITEMS.upgrade_small_miner: always_filler, + ITEMS.upgrade_small_proc: always_filler, + ITEMS.upgrade_small_paint: always_filler +} + +whacky_upgrades: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.upgrade_gigantic_belt: always_progression, + ITEMS.upgrade_gigantic_miner: always_useful, + ITEMS.upgrade_gigantic_proc: always_useful, + ITEMS.upgrade_gigantic_paint: always_useful, + ITEMS.upgrade_rising_belt: always_progression, + ITEMS.upgrade_rising_miner: always_useful, + ITEMS.upgrade_rising_proc: always_useful, + ITEMS.upgrade_rising_paint: always_useful, + ITEMS.upgrade_big_random: always_useful, + ITEMS.upgrade_small_random: always_filler, +} + +whacky_upgrade_traps: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_upgrade_belt: always_trap, + ITEMS.trap_upgrade_miner: always_trap, + ITEMS.trap_upgrade_proc: always_trap, + ITEMS.trap_upgrade_paint: always_trap, + ITEMS.trap_upgrade_demonic_belt: always_trap, + ITEMS.trap_upgrade_demonic_miner: always_trap, + ITEMS.trap_upgrade_demonic_proc: always_trap, + ITEMS.trap_upgrade_demonic_paint: always_trap, +} + +bundles: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.bundle_blueprint: always_filler, + ITEMS.bundle_level: always_filler, + ITEMS.bundle_upgrade: always_filler +} + +standard_traps: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_locked: always_trap, + ITEMS.trap_throttled: always_trap, + ITEMS.trap_malfunction: always_trap, + ITEMS.trap_inflation: always_trap, + ITEMS.trap_clear_belts: always_trap, +} + +random_draining_trap: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_draining_inv: always_trap +} + +split_draining_traps: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_draining_blueprint: always_trap, + ITEMS.trap_draining_level: always_trap, + ITEMS.trap_draining_upgrade: always_trap +} + +belt_and_extractor: Dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.belt: always_progression, + ITEMS.extractor: always_progression +} + +item_table: Dict[str, Callable[[ShapezOptions], IClass]] = { + **buildings_processing, + **buildings_routing, + **buildings_other, + **buildings_top_row, + **buildings_wires, + **gameplay_unlocks, + **upgrades, + **whacky_upgrades, + **whacky_upgrade_traps, + **bundles, + **standard_traps, + **random_draining_trap, + **split_draining_traps, + **belt_and_extractor +} + +big_upgrades = [ + ITEMS.upgrade_big_belt, + ITEMS.upgrade_big_miner, + ITEMS.upgrade_big_proc, + ITEMS.upgrade_big_paint +] + +small_upgrades = [ + ITEMS.upgrade_small_belt, + ITEMS.upgrade_small_miner, + ITEMS.upgrade_small_proc, + ITEMS.upgrade_small_paint +] + + +def filler(random: float, whacky_allowed: bool) -> str: + """Returns a random filler item.""" + bundles_list = [*bundles] + return random_choice_nested(random, [ + small_upgrades, + [ + bundles_list, + bundles_list, + [ + big_upgrades, + [*whacky_upgrades] if whacky_allowed else big_upgrades, + ], + ], + ]) + + +def trap(random: float, split_draining: bool, whacky_allowed: bool) -> str: + """Returns a random trap item.""" + pool = [ + *standard_traps, + ITEMS.trap_draining_inv if not split_draining else [*split_draining_traps], + ] + if whacky_allowed: + pool.append([*whacky_upgrade_traps]) + return random_choice_nested(random, pool) + + +def random_choice_nested(random: float, nested: List[Any]) -> Any: + """Helper function for getting a random element from a nested list.""" + current: Any = nested + while isinstance(current, List): + index_float = random*len(current) + current = current[int(index_float)] + random = index_float-int(index_float) + return current + + +item_descriptions = { # TODO replace keys with global strings and update with whacky upgrades + "Balancer": "A routing building, that can merge two belts into one, split a belt in two, " + + "or balance the items of two belts", + "Tunnel": "A routing building consisting of two parts, that allows for gaps in belts", + "Compact Merger": "A small routing building, that merges two belts into one", + "Tunnel Tier II": "A routing building consisting of two parts, that allows for even longer gaps in belts", + "Compact Splitter": "A small routing building, that splits a belt in two", + "Cutter": "A processing building, that cuts shapes vertically in two halves", + "Rotator": "A processing building, that rotates shapes 90 degrees clockwise", + "Painter": "A processing building, that paints shapes in a given color", + "Rotator (CCW)": "A processing building, that rotates shapes 90 degrees counter-clockwise", + "Color Mixer": "A processing building, that mixes two colors together to create a new one", + "Stacker": "A processing building, that combines two shapes with missing parts or puts one on top of the other", + "Quad Cutter": "A processing building, that cuts shapes in four quarter parts", + "Double Painter": "A processing building, that paints two shapes in a given color", + "Rotator (180°)": "A processing building, that rotates shapes 180 degrees", + "Quad Painter": "A processing building, that paint each quarter of a shape in another given color and requires " + + "wire inputs for each color to work", + "Trash": "A building, that destroys unused shapes", + "Chaining Extractor": "An upgrade to extractors, that can increase the output without balancers or mergers", + "Belt Reader": "A wired building, that shows the average amount of items passing through per second", + "Storage": "A building, that stores up to 5000 of a certain shape", + "Switch": "A building, that sends a constant boolean signal", + "Item Filter": "A wired building, that filters items based on wire input", + "Display": "A wired building, that displays a shape or color based on wire input", + "Wires": "The main building of the wires layer, that carries signals between other buildings", + "Constant Signal": "A building on the wires layer, that sends a constant shape, color, or boolean signal", + "Logic Gates": "Multiple buildings on the wires layer, that perform logical operations on wire signals", + "Virtual Processing": "Multiple buildings on the wires layer, that process wire signals like processor buildings", + "Blueprints": "A game mechanic, that allows copy-pasting multiple buildings at once", + "Big Belt Upgrade": "An upgrade, that adds 1 to the speed multiplier of belts, distributors, and tunnels", + "Big Miner Upgrade": "An upgrade, that adds 1 to the speed multiplier of extractors", + "Big Processors Upgrade": "An upgrade, that adds 1 to the speed multiplier of cutters, rotators, and stackers", + "Big Painting Upgrade": "An upgrade, that adds 1 to the speed multiplier of painters and color mixers", + "Small Belt Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of belts, distributors, and tunnels", + "Small Miner Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of extractors", + "Small Processors Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of cutters, rotators, and stackers", + "Small Painting Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of painters and color mixers", + "Blueprint Shapes Bundle": "A bundle with 1000 blueprint shapes, instantly delivered to the hub", + "Level Shapes Bundle": "A bundle with some shapes needed for the current level, " + + "instantly delivered to the hub", + "Upgrade Shapes Bundle": "A bundle with some shapes needed for a random upgrade, " + + "instantly delivered to the hub", + "Inventory Draining Trap": "Randomly drains either blueprint shapes, current level requirement shapes, " + + "or random upgrade requirement shapes, by half", + "Blueprint Shapes Draining Trap": "Drains the stored blueprint shapes by half", + "Level Shapes Draining Trap": "Drains the current level requirement shapes by half", + "Upgrade Shapes Draining Trap": "Drains a random upgrade requirement shape by half", + "Locked Building Trap": "Locks a random building from being placed for 15-60 seconds", + "Throttled Building Trap": "Halves the speed of a random building for 15-60 seconds", + "Malfunctioning Trap": "Makes a random building process items incorrectly for 15-60 seconds", + "Inflation Trap": "Permanently increases the required shapes multiplier by 1. " + "In other words: Permanently increases required shapes by 10% of the standard amount.", + "Belt": "One of the most important buildings in the game, that transports your shapes and colors from one " + + "place to another", + "Extractor": "One of the most important buildings in the game, that extracts shapes from those randomly " + + "generated patches" +} + + +class ShapezItem(Item): + game = OTHER.game_name diff --git a/worlds/shapez/locations.py b/worlds/shapez/locations.py new file mode 100644 index 0000000000..6d069afaa8 --- /dev/null +++ b/worlds/shapez/locations.py @@ -0,0 +1,546 @@ +from random import Random +from typing import List, Tuple, Dict, Optional, Callable + +from BaseClasses import Location, LocationProgressType, Region +from .data.strings import CATEGORY, LOCATIONS, REGIONS, OPTIONS, GOALS, OTHER, SHAPESANITY +from .options import max_shapesanity, max_levels_and_upgrades + +categories = [CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting] + +translate: List[Tuple[int, str]] = [ + (1000, "M"), + (900, "CM"), + (500, "D"), + (400, "CD"), + (100, "C"), + (90, "XC"), + (50, "L"), + (40, "XL"), + (10, "X"), + (9, "IX"), + (5, "V"), + (4, "IV"), + (1, "I") +] + + +def roman(num: int) -> str: + """Converts positive non-zero integers into roman numbers.""" + rom: str = "" + for key, val in translate: + while num >= key: + rom += val + num -= key + return rom + + +location_description = { # TODO change keys to global strings + "Level 1": "Levels are completed by delivering certain shapes in certain amounts to the hub. The required shape " + "and amount for the current level are always displayed on the hub.", + "Level 1 Additional": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 20 Additional": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 20 Additional 2": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 26": "In the vanilla game, level 26 is the final level of the tutorial, unlocking freeplay.", + f"Level {max_levels_and_upgrades-1}": "This is the highest possible level that can contains an item, if your goal " + "is set to \"mam\"", + "Belt Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your hub. " + "This is the first upgrade in the belt, balancers, and tunnel category.", + "Miner Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your " + "hub. This is the first upgrade in the extractor category.", + "Processors Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in " + "your hub. This is the first upgrade in the cutter, rotators, and stacker category.", + "Painting Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your " + "hub. This is the first upgrade in the painters and color mixer category.", + "Belt Upgrade Tier VIII": "This is the final upgrade in the belt, balancers, and tunnel category, if your goal is " + "**not** set to \"even_fasterer\".", + "Miner Upgrade Tier VIII": "This is the final upgrade in the extractor category, if your goal is **not** set to " + "\"even_fasterer\".", + "Processors Upgrade Tier VIII": "This is the final upgrade in the cutter, rotators, and stacker category, if your " + "goal is **not** set to \"even_fasterer\".", + "Painting Upgrade Tier VIII": "This is the final upgrade in the painters and color mixer category, if your goal is " + "**not** set to \"even_fasterer\".", + f"Belt Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the belt, " + "balancers, and tunnel category, if your goal is set to " + "\"even_fasterer\".", + f"Miner Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the extractor " + "category, if your goal is set to \"even_fasterer\".", + f"Processors Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the cutter, " + "rotators, and stacker category, if your goal is set " + "to \"even_fasterer\".", + f"Painting Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the painters " + "and color mixer category, if your goal is set to " + "\"even_fasterer\".", + "My eyes no longer hurt": "This is an achievement, that is unlocked by activating dark mode.", + "Painter": "This is an achievement, that is unlocked by painting a shape using the painter or double painter.", + "Cutter": "This is an achievement, that is unlocked by cutting a shape in half using the cutter.", + "Rotater": "This is an achievement, that is unlocked by rotating a shape clock wise.", + "Wait, they stack?": "This is an achievement, that is unlocked by stacking two shapes on top of each other.", + "Wires": "This is an achievement, that is unlocked by completing level 20.", + "Storage": "This is an achievement, that is unlocked by storing a shape in a storage.", + "Freedom": "This is an achievement, that is unlocked by completing level 20. It is only included if the goal is " + "**not** set to vanilla.", + "The logo!": "This is an achievement, that is unlocked by producing the logo of the game.", + "To the moon": "This is an achievement, that is unlocked by producing the rocket shape.", + "It's piling up": "This is an achievement, that is unlocked by having 100.000 blueprint shapes stored in the hub.", + "I'll use it later": "This is an achievement, that is unlocked by having one million blueprint shapes stored in " + "the hub.", + "Efficiency 1": "This is an achievement, that is unlocked by delivering 25 blueprint shapes per second to the hub.", + "Preparing to launch": "This is an achievement, that is unlocked by delivering 10 rocket shapes per second to the " + "hub.", + "SpaceY": "This is an achievement, that is unlocked by 20 rocket shapes per second to the hub.", + "Stack overflow": "This is an achievement, that is unlocked by stacking 4 layers on top of each other.", + "It's a mess": "This is an achievement, that is unlocked by having 100 different shapes stored in the hub.", + "Faster": "This is an achievement, that is unlocked by upgrading everything to at least tier V.", + "Even faster": "This is an achievement, that is unlocked by upgrading everything to at least tier VIII.", + "Get rid of them": "This is an achievement, that is unlocked by transporting 1000 shapes into a trash can.", + "It's been a long time": "This is an achievement, that is unlocked by playing your save file for 10 hours " + "(combined playtime).", + "Addicted": "This is an achievement, that is unlocked by playing your save file for 20 hours (combined playtime).", + "Can't stop": "This is an achievement, that is unlocked by reaching level 50.", + "Is this the end?": "This is an achievement, that is unlocked by reaching level 100.", + "Getting into it": "This is an achievement, that is unlocked by playing your save file for 1 hour (combined " + "playtime).", + "Now it's easy": "This is an achievement, that is unlocked by placing a blueprint.", + "Computer Guy": "This is an achievement, that is unlocked by placing 5000 wires.", + "Speedrun Master": "This is an achievement, that is unlocked by completing level 12 in under 30 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Speedrun Novice": "This is an achievement, that is unlocked by completing level 12 in under 60 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Not an idle game": "This is an achievement, that is unlocked by completing level 12 in under 120 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Efficiency 2": "This is an achievement, that is unlocked by delivering 50 blueprint shapes per second to the hub.", + "Branding specialist 1": "This is an achievement, that is unlocked by delivering 25 logo shapes per second to the " + "hub.", + "Branding specialist 2": "This is an achievement, that is unlocked by delivering 50 logo shapes per second to the " + "hub.", + "King of Inefficiency": "This is an achievement, that is unlocked by **not** placing a counter clock wise rotator " + "until level 14. This location is excluded by default, as it can become inaccessible in a " + "save file after placing that building.", + "It's so slow": "This is an achievement, that is unlocked by completing level 12 **without** buying any belt " + "upgrade. This location is excluded by default, as it can become inaccessible in a save file after " + "buying that upgrade.", + "MAM (Make Anything Machine)": "This is an achievement, that is unlocked by completing any level after level 26 " + "**without** modifying your factory. It is recommended to build a Make Anything " + "Machine.", + "Perfectionist": "This is an achievement, that is unlocked by destroying more than 1000 buildings at once.", + "The next dimension": "This is an achievement, that is unlocked by opening the wires layer.", + "Oops": "This is an achievement, that is unlocked by delivering a shape, that neither a level requirement nor an " + "upgrade requirement.", + "Copy-Pasta": "This is an achievement, that is unlocked by placing a blueprint with at least 1000 buildings.", + "I've seen that before ...": "This is an achievement, that is unlocked by producing RgRyRbRr.", + "Memories from the past": "This is an achievement, that is unlocked by producing WrRgWrRg:CwCrCwCr:SgSgSgSg.", + "I need trains": "This is an achievement, that is unlocked by placing a 500 tiles long belt.", + "A bit early?": "This is an achievement, that is unlocked by producing the logo shape before reaching level 18. " + "This location is excluded by default, as it can become inaccessible in a save file after reaching " + "that level.", + "GPS": "This is an achievement, that is unlocked by placing 15 or more map markers.", + "Shapesanity 1": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 1 is always an uncolored " + "circle.", + "Shapesanity 2": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 2 is always an uncolored " + "square.", + "Shapesanity 3": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 3 is always an uncolored " + "star.", + "Shapesanity 4": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 4 is always an uncolored " + "windmill.", +} + +shapesanity_simple: Dict[str, str] = {} +shapesanity_1_4: Dict[str, str] = {} +shapesanity_two_sided: Dict[str, str] = {} +shapesanity_three_parts: Dict[str, str] = {} +shapesanity_four_parts: Dict[str, str] = {} + +level_locations: List[str] = ([LOCATIONS.level(1, 1), LOCATIONS.level(20, 1), LOCATIONS.level(20, 2)] + + [LOCATIONS.level(x) for x in range(1, max_levels_and_upgrades)]) +upgrade_locations: List[str] = [LOCATIONS.upgrade(cat, roman(x)) + for cat in categories for x in range(2, max_levels_and_upgrades+1)] +achievement_locations: List[str] = [LOCATIONS.my_eyes, LOCATIONS.painter, LOCATIONS.cutter, LOCATIONS.rotater, + LOCATIONS.wait_they_stack, LOCATIONS.wires, LOCATIONS.storage, LOCATIONS.freedom, + LOCATIONS.the_logo, LOCATIONS.to_the_moon, LOCATIONS.its_piling_up, + LOCATIONS.use_it_later, LOCATIONS.efficiency_1, LOCATIONS.preparing_to_launch, + LOCATIONS.spacey, LOCATIONS.stack_overflow, LOCATIONS.its_a_mess, LOCATIONS.faster, + LOCATIONS.even_faster, LOCATIONS.get_rid_of_them, LOCATIONS.a_long_time, + LOCATIONS.addicted, LOCATIONS.cant_stop, LOCATIONS.is_this_the_end, + LOCATIONS.getting_into_it, LOCATIONS.now_its_easy, LOCATIONS.computer_guy, + LOCATIONS.speedrun_master, LOCATIONS.speedrun_novice, LOCATIONS.not_idle_game, + LOCATIONS.efficiency_2, LOCATIONS.branding_1, + LOCATIONS.branding_2, LOCATIONS.king_of_inefficiency, LOCATIONS.its_so_slow, + LOCATIONS.mam, LOCATIONS.perfectionist, LOCATIONS.next_dimension, LOCATIONS.oops, + LOCATIONS.copy_pasta, LOCATIONS.ive_seen_that_before, LOCATIONS.memories, + LOCATIONS.i_need_trains, LOCATIONS.a_bit_early, LOCATIONS.gps] +shapesanity_locations: List[str] = [LOCATIONS.shapesanity(x) for x in range(1, max_shapesanity+1)] + + +def init_shapesanity_pool() -> None: + """Imports the pregenerated shapesanity pool.""" + from .data import shapesanity_pool + shapesanity_simple.update(shapesanity_pool.shapesanity_simple) + shapesanity_1_4.update(shapesanity_pool.shapesanity_1_4) + shapesanity_two_sided.update(shapesanity_pool.shapesanity_two_sided) + shapesanity_three_parts.update(shapesanity_pool.shapesanity_three_parts) + shapesanity_four_parts.update(shapesanity_pool.shapesanity_four_parts) + + +def addlevels(maxlevel: int, logictype: str, + random_logic_phase_length: List[int]) -> Dict[str, Tuple[str, LocationProgressType]]: + """Returns a dictionary with all level locations based on player options (maxlevel INCLUDED). + If shape requirements are not randomized, the logic type is expected to be vanilla.""" + + # Level 1 is always directly accessible + locations: Dict[str, Tuple[str, LocationProgressType]] \ + = {LOCATIONS.level(1): (REGIONS.main, LocationProgressType.PRIORITY), + LOCATIONS.level(1, 1): (REGIONS.main, LocationProgressType.PRIORITY)} + level_regions = [REGIONS.main, REGIONS.levels_1, REGIONS.levels_2, REGIONS.levels_3, + REGIONS.levels_4, REGIONS.levels_5] + + def f(name: str, region: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + locations[name] = (region, progress) + + if logictype.startswith(OPTIONS.logic_vanilla): + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + f(LOCATIONS.level(2), REGIONS.levels_1) + f(LOCATIONS.level(3), REGIONS.levels_1) + f(LOCATIONS.level(4), REGIONS.levels_1) + f(LOCATIONS.level(5), REGIONS.levels_2) + f(LOCATIONS.level(6), REGIONS.levels_2) + f(LOCATIONS.level(7), REGIONS.levels_3) + f(LOCATIONS.level(8), REGIONS.levels_3) + f(LOCATIONS.level(9), REGIONS.levels_4) + f(LOCATIONS.level(10), REGIONS.levels_4) + for x in range(11, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_stretched): + phaselength = maxlevel//6 + f(LOCATIONS.level(20, 1), level_regions[20//phaselength]) + f(LOCATIONS.level(20, 2), level_regions[20//phaselength]) + for x in range(2, phaselength): + f(LOCATIONS.level(x), REGIONS.main) + for x in range(phaselength, phaselength*2): + f(LOCATIONS.level(x), REGIONS.levels_1) + for x in range(phaselength*2, phaselength*3): + f(LOCATIONS.level(x), REGIONS.levels_2) + for x in range(phaselength*3, phaselength*4): + f(LOCATIONS.level(x), REGIONS.levels_3) + for x in range(phaselength*4, phaselength*5): + f(LOCATIONS.level(x), REGIONS.levels_4) + for x in range(phaselength*5, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_quick): + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + f(LOCATIONS.level(2), REGIONS.levels_1) + f(LOCATIONS.level(3), REGIONS.levels_2) + f(LOCATIONS.level(4), REGIONS.levels_3) + f(LOCATIONS.level(5), REGIONS.levels_4) + for x in range(6, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_random_steps): + next_level = 2 + for phase in range(5): + for x in range(random_logic_phase_length[phase]): + f(LOCATIONS.level(next_level+x), level_regions[phase]) + next_level += random_logic_phase_length[phase] + if next_level > 20: + f(LOCATIONS.level(20, 1), level_regions[phase]) + f(LOCATIONS.level(20, 2), level_regions[phase]) + for x in range(next_level, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + if next_level <= 20: + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + + elif logictype == OPTIONS.logic_hardcore: + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype == OPTIONS.logic_dopamine: + f(LOCATIONS.level(20, 1), REGIONS.levels_2) + f(LOCATIONS.level(20, 2), REGIONS.levels_2) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_2) + + elif logictype == OPTIONS.logic_dopamine_overflow: + f(LOCATIONS.level(20, 1), REGIONS.main) + f(LOCATIONS.level(20, 2), REGIONS.main) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.main) + + else: + raise Exception(f"Illegal level logic type {logictype}") + + return locations + + +def addupgrades(finaltier: int, logictype: str, + category_random_logic_amounts: Dict[str, int]) -> Dict[str, Tuple[str, LocationProgressType]]: + """Returns a dictionary with all upgrade locations based on player options (finaltier INCLUDED). + If shape requirements are not randomized, give logic type 0.""" + + locations: Dict[str, Tuple[str, LocationProgressType]] = {} + upgrade_regions = [REGIONS.main, REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, + REGIONS.upgrades_4, REGIONS.upgrades_5] + + def f(name: str, region: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + locations[name] = (region, progress) + + if logictype == OPTIONS.logic_vanilla_like: + f(LOCATIONS.upgrade(CATEGORY.belt, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.miner, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.processors, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.painting, "II"), REGIONS.upgrades_3) + f(LOCATIONS.upgrade(CATEGORY.belt, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.miner, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "III"), REGIONS.upgrades_1) + f(LOCATIONS.upgrade(CATEGORY.painting, "III"), REGIONS.upgrades_3) + for x in range(4, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_linear: + for x in range(2, 7): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), upgrade_regions[x-2]) + for x in range(7, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_category: + for x in range(2, 7): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), REGIONS.main) + for x in range(7, finaltier + 1): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), REGIONS.upgrades_5) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), REGIONS.upgrades_5) + f(LOCATIONS.upgrade(CATEGORY.processors, "II"), REGIONS.upgrades_1) + f(LOCATIONS.upgrade(CATEGORY.processors, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "IV"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "V"), REGIONS.upgrades_3) + f(LOCATIONS.upgrade(CATEGORY.processors, "VI"), REGIONS.upgrades_3) + for x in range(7, finaltier+1): + f(LOCATIONS.upgrade(CATEGORY.processors, roman(x)), REGIONS.upgrades_5) + for x in range(2, 4): + f(LOCATIONS.upgrade(CATEGORY.painting, roman(x)), REGIONS.upgrades_4) + for x in range(4, finaltier+1): + f(LOCATIONS.upgrade(CATEGORY.painting, roman(x)), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_category_random: + for x in range(2, 7): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.belt_low]]) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.miner_low]]) + f(LOCATIONS.upgrade(CATEGORY.processors, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.processors_low]]) + f(LOCATIONS.upgrade(CATEGORY.painting, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.painting_low]]) + for x in range(7, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + else: # logictype == hardcore + for cat in categories: + f(LOCATIONS.upgrade(cat, "II"), REGIONS.main) + for x in range(3, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + return locations + + +def addachievements(excludesoftlock: bool, excludelong: bool, excludeprogressive: bool, + maxlevel: int, upgradelogictype: str, category_random_logic_amounts: Dict[str, int], + goal: str, presentlocations: Dict[str, Tuple[str, LocationProgressType]], + add_alias: Callable[[str, str], None], has_upgrade_traps: bool + ) -> Dict[str, Tuple[str, LocationProgressType]]: + """Returns a dictionary with all achievement locations based on player options.""" + + locations: Dict[str, Tuple[str, LocationProgressType]] = dict() + upgrade_regions = [REGIONS.main, REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, + REGIONS.upgrades_4, REGIONS.upgrades_5] + + def f(name: str, region: str, alias: str, progress: LocationProgressType = LocationProgressType.DEFAULT): + locations[name] = (region, progress) + add_alias(name, alias) + + f(LOCATIONS.my_eyes, REGIONS.menu, "Activate dark mode") + f(LOCATIONS.painter, REGIONS.paint_not_quad, "Paint a shape (no Quad Painter)") + f(LOCATIONS.cutter, REGIONS.cut_not_quad, "Cut a shape (no Quad Cutter)") + f(LOCATIONS.rotater, REGIONS.rotate_cw, "Rotate a shape clock wise") + f(LOCATIONS.wait_they_stack, REGIONS.stack_shape, "Stack a shape") + f(LOCATIONS.storage, REGIONS.store_shape, "Store a shape in the storage") + f(LOCATIONS.the_logo, REGIONS.all_buildings, "Produce the shapez logo") + f(LOCATIONS.to_the_moon, REGIONS.all_buildings, "Produce the rocket shape") + f(LOCATIONS.its_piling_up, REGIONS.all_buildings, "100k blueprint shapes") + f(LOCATIONS.use_it_later, REGIONS.all_buildings, "1 million blueprint shapes") + + f(LOCATIONS.stack_overflow, REGIONS.stack_shape, "4 layers shape") + f(LOCATIONS.its_a_mess, REGIONS.main, "100 different shapes in hub") + f(LOCATIONS.get_rid_of_them, REGIONS.trash_shape, "1000 shapes trashed") + f(LOCATIONS.getting_into_it, REGIONS.menu, "1 hour") + f(LOCATIONS.now_its_easy, REGIONS.blueprint, "Place a blueprint") + f(LOCATIONS.computer_guy, REGIONS.wiring, "Place 5000 wires") + f(LOCATIONS.perfectionist, REGIONS.any_building, "Destroy more than 1000 objects at once") + f(LOCATIONS.next_dimension, REGIONS.wiring, "Open the wires layer") + f(LOCATIONS.copy_pasta, REGIONS.blueprint, "Place a 1000 buildings blueprint") + f(LOCATIONS.ive_seen_that_before, REGIONS.all_buildings, "Produce RgRyRbRr") + f(LOCATIONS.memories, REGIONS.all_buildings, "Produce WrRgWrRg:CwCrCwCr:SgSgSgSg") + f(LOCATIONS.i_need_trains, REGIONS.belt, "Have a 500 tiles belt") + f(LOCATIONS.gps, REGIONS.menu, "15 map markers") + + # Per second delivery achievements + f(LOCATIONS.preparing_to_launch, REGIONS.all_buildings, "10 rocket shapes / second") + if not has_upgrade_traps: + f(LOCATIONS.spacey, REGIONS.all_buildings, "20 rocket shapes / second") + f(LOCATIONS.efficiency_1, REGIONS.all_buildings, "25 blueprints shapes / second") + f(LOCATIONS.efficiency_2, REGIONS.all_buildings_x1_6_belt, "50 blueprints shapes / second") + f(LOCATIONS.branding_1, REGIONS.all_buildings, "25 logo shapes / second") + f(LOCATIONS.branding_2, REGIONS.all_buildings_x1_6_belt, "50 logo shapes / second") + + # Achievements that depend on upgrades + f(LOCATIONS.even_faster, REGIONS.upgrades_5, "All upgrades on tier VIII") + if upgradelogictype == OPTIONS.logic_linear: + f(LOCATIONS.faster, REGIONS.upgrades_3, "All upgrades on tier V") + elif upgradelogictype == OPTIONS.logic_category_random: + f(LOCATIONS.faster, upgrade_regions[ + max(category_random_logic_amounts[CATEGORY.belt_low], + category_random_logic_amounts[CATEGORY.miner_low], + category_random_logic_amounts[CATEGORY.processors_low], + category_random_logic_amounts[CATEGORY.painting_low]) + ], "All upgrades on tier V") + else: + f(LOCATIONS.faster, REGIONS.upgrades_5, "All upgrades on tier V") + + # Achievements that depend on the level + f(LOCATIONS.wires, presentlocations[LOCATIONS.level(20)][0], "Complete level 20") + if not goal == GOALS.vanilla: + f(LOCATIONS.freedom, presentlocations[LOCATIONS.level(26)][0], "Complete level 26") + f(LOCATIONS.mam, REGIONS.mam, "Complete any level > 26 without modifications") + if maxlevel >= 50: + f(LOCATIONS.cant_stop, presentlocations[LOCATIONS.level(50)][0], "Reach level 50") + elif goal not in [GOALS.vanilla, GOALS.mam]: + f(LOCATIONS.cant_stop, REGIONS.levels_5, "Reach level 50") + if maxlevel >= 100: + f(LOCATIONS.is_this_the_end, presentlocations[LOCATIONS.level(100)][0], "Reach level 100") + elif goal not in [GOALS.vanilla, GOALS.mam]: + f(LOCATIONS.is_this_the_end, REGIONS.levels_5, "Reach level 100") + + # Achievements that depend on player preferences + if excludeprogressive: + unreasonable_type = LocationProgressType.EXCLUDED + else: + unreasonable_type = LocationProgressType.DEFAULT + if not excludesoftlock: + f(LOCATIONS.speedrun_master, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 30 min", unreasonable_type) + f(LOCATIONS.speedrun_novice, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 60 min", unreasonable_type) + f(LOCATIONS.not_idle_game, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 120 min", unreasonable_type) + f(LOCATIONS.its_so_slow, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 without upgrading belts", unreasonable_type) + f(LOCATIONS.king_of_inefficiency, presentlocations[LOCATIONS.level(14)][0], + "No ccw rotator until level 14", unreasonable_type) + f(LOCATIONS.a_bit_early, REGIONS.all_buildings, + "Produce logo shape before level 18", unreasonable_type) + if not excludelong: + f(LOCATIONS.a_long_time, REGIONS.menu, "10 hours") + f(LOCATIONS.addicted, REGIONS.menu, "20 hours") + + # Achievements with a softlock chance of less than + # 1 divided by 2 to the power of the number of all atoms in the universe + f(LOCATIONS.oops, REGIONS.main, "Deliver an irrelevant shape") + + return locations + + +def addshapesanity(amount: int, random: Random, append_shapesanity: Callable[[str], None], + add_alias: Callable[[str, str], None]) -> Dict[str, Tuple[str, LocationProgressType]]: + """Returns a dictionary with a given number of random shapesanity locations.""" + + included_shapes: Dict[str, Tuple[str, LocationProgressType]] = {} + + def f(name: str, region: str, alias: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + included_shapes[name] = (region, progress) + append_shapesanity(alias) + shapes_list.remove((alias, region)) + add_alias(name, alias) + + # Always have at least 4 shapesanity checks because of sphere 1 usefulls + both hardcore logic + shapes_list = list(shapesanity_simple.items()) + f(LOCATIONS.shapesanity(1), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.circle)) + f(LOCATIONS.shapesanity(2), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.square)) + f(LOCATIONS.shapesanity(3), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.star)) + f(LOCATIONS.shapesanity(4), REGIONS.sanity(REGIONS.east_wind, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.windmill)) + + # The pool switches dynamically depending on if either it's ratio or limit is reached + switched = 0 + for counting in range(4, amount): + if switched == 0 and (len(shapes_list) == 0 or counting == amount//2): + shapes_list = list(shapesanity_1_4.items()) + switched = 1 + elif switched == 1 and (len(shapes_list) == 0 or counting == amount*7//12): + shapes_list = list(shapesanity_two_sided.items()) + switched = 2 + elif switched == 2 and (len(shapes_list) == 0 or counting == amount*5//6): + shapes_list = list(shapesanity_three_parts.items()) + switched = 3 + elif switched == 3 and (len(shapes_list) == 0 or counting == amount*11//12): + shapes_list = list(shapesanity_four_parts.items()) + switched = 4 + x = random.randint(0, len(shapes_list)-1) + next_shape = shapes_list.pop(x) + included_shapes[LOCATIONS.shapesanity(counting+1)] = (next_shape[1], LocationProgressType.DEFAULT) + append_shapesanity(next_shape[0]) + add_alias(LOCATIONS.shapesanity(counting+1), next_shape[0]) + + return included_shapes + + +def addshapesanity_ut(shapesanity_names: List[str], add_alias: Callable[[str, str], None] + ) -> Dict[str, Tuple[str, LocationProgressType]]: + """Returns the same information as addshapesanity but will add specific values based on a UT rebuild.""" + + included_shapes: Dict[str, Tuple[str, LocationProgressType]] = {} + + for name in shapesanity_names: + for options in [shapesanity_simple, shapesanity_1_4, shapesanity_two_sided, shapesanity_three_parts, + shapesanity_four_parts]: + if name in options: + next_shape = options[name] + break + else: + raise ValueError(f"Could not find shapesanity name {name}") + included_shapes[LOCATIONS.shapesanity(len(included_shapes)+1)] = (next_shape, LocationProgressType.DEFAULT) + add_alias(LOCATIONS.shapesanity(len(included_shapes)), name) + return included_shapes + + +class ShapezLocation(Location): + game = OTHER.game_name + + def __init__(self, player: int, name: str, address: Optional[int], region: Region, + progress_type: LocationProgressType): + super(ShapezLocation, self).__init__(player, name, address, region) + self.progress_type = progress_type diff --git a/worlds/shapez/options.py b/worlds/shapez/options.py new file mode 100644 index 0000000000..bc3fc1ed2f --- /dev/null +++ b/worlds/shapez/options.py @@ -0,0 +1,310 @@ +import pkgutil +from dataclasses import dataclass + +import orjson + +from Options import Toggle, Choice, PerGameCommonOptions, NamedRange, Range +from .common.options import FloatRangeText + +datapackage_options = orjson.loads(pkgutil.get_data(__name__, "data/options.json")) +max_levels_and_upgrades = datapackage_options["max_levels_and_upgrades"] +max_shapesanity = datapackage_options["max_shapesanity"] +del datapackage_options + + +class Goal(Choice): + """Sets the goal of your world. + + - **Vanilla:** Complete level 26. + - **MAM:** Complete a specified level after level 26. Every level before that will be a location. It's recommended + to build a Make-Anything-Machine (MAM). + - **Even fasterer:** Upgrade everything to a specified tier after tier 8. Every upgrade before that will be a + location. + - **Efficiency III:** Deliver 256 blueprint shapes per second to the hub.""" + display_name = "Goal" + rich_text_doc = True + option_vanilla = 0 + option_mam = 1 + option_even_fasterer = 2 + option_efficiency_iii = 3 + default = 0 + + +class GoalAmount(NamedRange): + """Specify, what level or tier (when either MAM or Even Fasterer is chosen as goal) is required to reach the goal. + + If MAM is set as the goal, this has to be set to 27 or more. Else it will raise an error.""" + display_name = "Goal amount" + rich_text_doc = True + range_start = 9 + range_end = max_levels_and_upgrades + default = 27 + special_range_names = { + "minimum_mam": 27, + "recommended_mam": 50, + "long_game_mam": 120, + "minimum_even_fasterer": 9, + "recommended_even_fasterer": 16, + "long_play_even_fasterer": 35, + } + + +class RequiredShapesMultiplier(Range): + """Multiplies the amount of required shapes for levels and upgrades by value/10. + + For level 1, the amount of shapes ranges from 3 to 300. + + For level 26, it ranges from 5k to 500k.""" + display_name = "Required shapes multiplier" + rich_text_doc = True + range_start = 1 + range_end = 100 + default = 10 + + +class AllowFloatingLayers(Toggle): + """Toggle whether shape requirements are allowed to have floating layers (like the logo or the rocket shape). + + However, be aware that floating shapes make MAMs much more complex.""" + display_name = "Allow floating layers" + rich_text_doc = True + default = False + + +class RandomizeLevelRequirements(Toggle): + """Randomize the required shapes to complete levels.""" + display_name = "Randomize level requirements" + rich_text_doc = True + default = True + + +class RandomizeUpgradeRequirements(Toggle): + """Randomize the required shapes to buy upgrades.""" + display_name = "Randomize upgrade requirements" + rich_text_doc = True + default = True + + +class RandomizeLevelLogic(Choice): + """If level requirements are randomized, this sets how those random shapes are generated and how logic works for + levels. The shuffled variants shuffle the order of progression buildings obtained in the multiworld. The standard + order is: **cutter -> rotator -> painter -> color mixer -> stacker** + + - **Vanilla:** Level 1 requires nothing, 2-4 require the first building, 5-6 require also the second, 7-8 the + third, 9-10 the fourth, and 11 and onwards the fifth and thereby all buildings. + - **Stretched:** After every floor(maxlevel/6) levels, another building is required. + - **Quick:** Every Level, except level 1, requires another building, with level 6 and onwards requiring all + buildings. + - **Random steps:** After a random amount of levels, another building is required, with level 1 always requiring + none. This can potentially generate like any other option. + - **Hardcore:** All levels (except level 1) have completely random shape requirements and thus require all + buildings. Expect early BKs. + - **Dopamine (overflow):** All levels (except level 1 and the goal) require 2 random buildings (or none in case of + overflow).""" + display_name = "Randomize level logic" + rich_text_doc = True + option_vanilla = 0 + option_vanilla_shuffled = 1 + option_stretched = 2 + option_stretched_shuffled = 3 + option_quick = 4 + option_quick_shuffled = 5 + option_random_steps = 6 + option_random_steps_shuffled = 7 + option_hardcore = 8 + option_dopamine = 9 + option_dopamine_overflow = 10 + default = 2 + + +class RandomizeUpgradeLogic(Choice): + """If upgrade requirements are randomized, this sets how those random shapes are generated + and how logic works for upgrades. + + - **Vanilla-like:** Tier II requires up to two random buildings, III requires up to three random buildings, + and IV and onwards require all processing buildings. + - **Linear:** Tier II requires nothing, III-VI require another random building each, + and VII and onwards require all buildings. + - **Category:** Belt and miner upgrades require no building up to tier V, but onwards all buildings, processors + upgrades require the cutter (all tiers), rotator (tier III and onwards), and stacker (tier V and onwards), and + painting upgrades require the cutter, rotator, stacker, painter (all tiers) and color mixer (tiers V and onwards). + Tier VII and onwards will always require all buildings. + - **Category random:** Each upgrades category (up to tier VI) requires a random amount of buildings (in order), + with one category always requiring no buildings. Tier VII and onwards will always require all buildings. + - **Hardcore:** All tiers (except each tier II) have completely random shape requirements and thus require all + buildings. Expect early BKs.""" + display_name = "Randomize upgrade logic" + rich_text_doc = True + option_vanilla_like = 0 + option_linear = 1 + option_category = 2 + option_category_random = 3 + option_hardcore = 4 + default = 1 + + +class ThroughputLevelsRatio(NamedRange): + """If level requirements are randomized, this sets the ratio of how many levels (approximately) will require either + a total amount or per second amount (throughput) of shapes delivered. + + 0 means only total, 100 means only throughput, and vanilla (-1) means only levels 14, 27 and beyond have throughput. + """ + display_name = "Throughput levels ratio" + rich_text_doc = True + range_start = 0 + range_end = 100 + default = 0 + special_range_names = { + "vanilla": -1, + "only_total": 0, + "half_half": 50, + "only_throughput": 100, + } + + +class ComplexityGrowthGradient(FloatRangeText): + """If level requirements are randomized, this determines how fast complexity will grow each level. In other words: + The higher you set this value, the more difficult lategame shapes will be. + + Allowed values are floating numbers ranging from 0.0 to 10.0.""" + display_name = "Complexity growth gradient" + rich_text_doc = True + range_start = 0.0 + range_end = 10.0 + default = "0.5" + + +class SameLateUpgradeRequirements(Toggle): + """If upgrade requirements are randomized, should the last 3 shapes for each category be the same, + as in vanilla?""" + display_name = "Same late upgrade requirements" + rich_text_doc = True + default = True + + +class EarlyBalancerTunnelAndTrash(Choice): + """Makes the balancer, tunnel, and trash appear in earlier spheres. + + - **None:** Complete randomization. + - **5 buildings:** Should be accessible before getting all 5 main buildings. + - **3 buildings:** Should be accessible before getting the first 3 main buildings for levels and upgrades. + - **Sphere 1:** Always accessible from start. **Beware of generation failures.**""" + display_name = "Early balancer, tunnel, and trash" + rich_text_doc = True + option_none = 0 + option_5_buildings = 1 + option_3_buildings = 2 + option_sphere_1 = 3 + default = 2 + + +class LockBeltAndExtractor(Toggle): + """Locks Belts and Extractors and adds them to the item pool. + + **If you set this to true, achievements must also be included.**""" + display_name = "Lock Belt and Extractor" + rich_text_doc = True + default = False + + +class IncludeAchievements(Toggle): + """Include up to 45 achievements (depending on other options) as additional locations.""" + display_name = "Include Achievements" + rich_text_doc = True + default = True + + +class ExcludeSoftlockAchievements(Toggle): + """Exclude 6 achievements, that can become unreachable in a save file, if not achieved until a certain level.""" + display_name = "Exclude softlock achievements" + rich_text_doc = True + default = True + + +class ExcludeLongPlaytimeAchievements(Toggle): + """Exclude 2 achievements, that require actively playing for a really long time.""" + display_name = "Exclude long playtime achievements" + rich_text_doc = True + default = True + + +class ExcludeProgressionUnreasonable(Toggle): + """Exclude progression and useful items from being placed into softlock and long playtime achievements.""" + display_name = "Exclude progression items in softlock and long playtime achievements" + rich_text_doc = True + default = True + + +class ShapesanityAmount(Range): + """Amount of single-layer shapes that will be included as locations.""" + display_name = "Shapesanity amount" + rich_text_doc = True + range_start = 4 + range_end = max_shapesanity + default = 50 + + +class TrapsProbability(NamedRange): + """The probability of any filler item (in percent) being replaced by a trap.""" + display_name = "Traps Percentage" + rich_text_doc = True + range_start = 0 + range_end = 100 + default = 0 + special_range_names = { + "none": 0, + "rare": 4, + "occasionally": 10, + "maximum_suffering": 100, + } + + +class IncludeWhackyUpgrades(Toggle): + """Includes some very unusual upgrade items in generation (and logic), that greatly increase or decrease building + speeds. If the goal is set to Efficiency III or throughput levels ratio is not 0, decreasing upgrades (aka traps) + will always be disabled.""" + display_name = "Include Whacky Upgrades" + rich_text_doc = True + default = False + + +class SplitInventoryDrainingTrap(Toggle): + """If set to true, the inventory draining trap will be split into level, upgrade, and blueprint draining traps + instead of executing as one of those 3 randomly.""" + display_name = "Split Inventory Draining Trap" + rich_text_doc = True + default = False + + +class ToolbarShuffling(Toggle): + """If set to true, the toolbars (main and wires layer) will be shuffled (including bottom and top row). + However, keybindings will still select the same building to place.""" + display_name = "Toolbar Shuffling" + rich_text_doc = True + default = True + + +@dataclass +class ShapezOptions(PerGameCommonOptions): + goal: Goal + goal_amount: GoalAmount + required_shapes_multiplier: RequiredShapesMultiplier + allow_floating_layers: AllowFloatingLayers + randomize_level_requirements: RandomizeLevelRequirements + randomize_upgrade_requirements: RandomizeUpgradeRequirements + randomize_level_logic: RandomizeLevelLogic + randomize_upgrade_logic: RandomizeUpgradeLogic + throughput_levels_ratio: ThroughputLevelsRatio + complexity_growth_gradient: ComplexityGrowthGradient + same_late_upgrade_requirements: SameLateUpgradeRequirements + early_balancer_tunnel_and_trash: EarlyBalancerTunnelAndTrash + lock_belt_and_extractor: LockBeltAndExtractor + include_achievements: IncludeAchievements + exclude_softlock_achievements: ExcludeSoftlockAchievements + exclude_long_playtime_achievements: ExcludeLongPlaytimeAchievements + exclude_progression_unreasonable: ExcludeProgressionUnreasonable + shapesanity_amount: ShapesanityAmount + traps_percentage: TrapsProbability + include_whacky_upgrades: IncludeWhackyUpgrades + split_inventory_draining_trap: SplitInventoryDrainingTrap + toolbar_shuffling: ToolbarShuffling diff --git a/worlds/shapez/presets.py b/worlds/shapez/presets.py new file mode 100644 index 0000000000..e01192d594 --- /dev/null +++ b/worlds/shapez/presets.py @@ -0,0 +1,49 @@ +from .options import max_levels_and_upgrades, max_shapesanity + +options_presets = { + "Most vanilla": { + "goal": "vanilla", + "randomize_level_requirements": False, + "randomize_upgrade_requirements": False, + "early_balancer_tunnel_and_trash": "3_buildings", + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "shapesanity_amount": 4, + "toolbar_shuffling": False, + }, + "Minimum checks": { + "goal": "vanilla", + "include_achievements": False, + "shapesanity_amount": 4 + }, + "Maximum checks": { + "goal": "even_fasterer", + "goal_amount": max_levels_and_upgrades, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "shapesanity_amount": max_shapesanity + }, + "Restrictive start": { + "goal": "vanilla", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": "hardcore", + "randomize_upgrade_logic": "hardcore", + "early_balancer_tunnel_and_trash": "sphere_1", + "include_achievements": False, + "shapesanity_amount": 4 + }, + "Quick game": { + "goal": "efficiency_iii", + "required_shapes_multiplier": 1, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": "hardcore", + "randomize_upgrade_logic": "hardcore", + "include_achievements": False, + "shapesanity_amount": 4, + "include_whacky_upgrades": True, + } +} diff --git a/worlds/shapez/regions.py b/worlds/shapez/regions.py new file mode 100644 index 0000000000..c4ca1d0c81 --- /dev/null +++ b/worlds/shapez/regions.py @@ -0,0 +1,277 @@ +from typing import Dict, Tuple, List + +from BaseClasses import Region, MultiWorld, LocationProgressType, ItemClassification, CollectionState +from .items import ShapezItem +from .locations import ShapezLocation +from .data.strings import ITEMS, REGIONS, GOALS, LOCATIONS, OPTIONS +from worlds.generic.Rules import add_rule + +shapesanity_processing = [REGIONS.full, REGIONS.half, REGIONS.piece, REGIONS.stitched, REGIONS.east_wind, + REGIONS.half_half, REGIONS.col_east_wind, REGIONS.col_half_half, REGIONS.col_full, + REGIONS.col_half] +shapesanity_coloring = [REGIONS.uncol, REGIONS.painted, REGIONS.mixed] + +all_regions = [ + REGIONS.menu, REGIONS.belt, REGIONS.extract, REGIONS.main, + REGIONS.levels_1, REGIONS.levels_2, REGIONS.levels_3, REGIONS.levels_4, REGIONS.levels_5, + REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, REGIONS.upgrades_4, REGIONS.upgrades_5, + REGIONS.paint_not_quad, REGIONS.cut_not_quad, REGIONS.rotate_cw, REGIONS.stack_shape, REGIONS.store_shape, + REGIONS.trash_shape, REGIONS.blueprint, REGIONS.wiring, REGIONS.mam, REGIONS.any_building, + REGIONS.all_buildings, REGIONS.all_buildings_x1_6_belt, + *[REGIONS.sanity(processing, coloring) + for processing in shapesanity_processing + for coloring in shapesanity_coloring], +] + + +def can_cut_half(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.cutter, player) + + +def can_rotate_90(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.rotator, ITEMS.rotator_ccw), player) + + +def can_rotate_180(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.rotator, ITEMS.rotator_ccw, ITEMS.rotator_180), player) + + +def can_stack(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.stacker, player) + + +def can_paint(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.painter, ITEMS.painter_double), player) or can_use_quad_painter(state, player) + + +def can_mix_colors(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.color_mixer, player) + + +def has_tunnel(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.tunnel, ITEMS.tunnel_tier_ii), player) + + +def has_balancer(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.balancer, player) or state.has_all((ITEMS.comp_merger, ITEMS.comp_splitter), player) + + +def can_use_quad_painter(state: CollectionState, player: int) -> bool: + return (state.has_all((ITEMS.painter_quad, ITEMS.wires), player) and + state.has_any((ITEMS.switch, ITEMS.const_signal), player)) + + +def can_make_stitched_shape(state: CollectionState, player: int, floating: bool) -> bool: + return (can_stack(state, player) and + ((state.has(ITEMS.cutter_quad, player) and not floating) or + (can_cut_half(state, player) and can_rotate_90(state, player)))) + + +def can_build_mam(state: CollectionState, player: int, floating: bool) -> bool: + return (can_make_stitched_shape(state, player, floating) and can_paint(state, player) and + can_mix_colors(state, player) and has_balancer(state, player) and has_tunnel(state, player) and + state.has_all((ITEMS.belt_reader, ITEMS.storage, ITEMS.item_filter, + ITEMS.wires, ITEMS.logic_gates, ITEMS.virtual_proc), player)) + + +def can_make_east_windmill(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return (can_stack(state, player) and + (state.has(ITEMS.cutter_quad, player) or (can_cut_half(state, player) and can_rotate_180(state, player)))) + + +def can_make_half_half_shape(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return can_stack(state, player) and state.has_any((ITEMS.cutter, ITEMS.cutter_quad), player) + + +def can_make_half_shape(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return can_cut_half(state, player) or state.has_all((ITEMS.cutter_quad, ITEMS.stacker), player) + + +def has_x_belt_multiplier(state: CollectionState, player: int, needed: float) -> bool: + # Assumes there are no upgrade traps + multiplier = 1.0 + # Rising upgrades do the least improvement if received before other upgrades + for _ in range(state.count(ITEMS.upgrade_rising_belt, player)): + multiplier *= 2 + multiplier += state.count(ITEMS.upgrade_gigantic_belt, player)*10 + multiplier += state.count(ITEMS.upgrade_big_belt, player) + multiplier += state.count(ITEMS.upgrade_small_belt, player)*0.1 + return multiplier >= needed + + +def has_logic_list_building(state: CollectionState, player: int, buildings: List[str], index: int, + includeuseful: bool) -> bool: + + # Includes balancer, tunnel, and trash in logic in order to make them appear in earlier spheres + if includeuseful and not (state.has(ITEMS.trash, player) and has_balancer(state, player) and + has_tunnel(state, player)): + return False + + if buildings[index] == ITEMS.cutter: + if buildings.index(ITEMS.stacker) < index: + return state.has_any((ITEMS.cutter, ITEMS.cutter_quad), player) + else: + return can_cut_half(state, player) + elif buildings[index] == ITEMS.rotator: + return can_rotate_90(state, player) + elif buildings[index] == ITEMS.stacker: + return can_stack(state, player) + elif buildings[index] == ITEMS.painter: + return can_paint(state, player) + elif buildings[index] == ITEMS.color_mixer: + return can_mix_colors(state, player) + + +def create_shapez_regions(player: int, multiworld: MultiWorld, floating: bool, + included_locations: Dict[str, Tuple[str, LocationProgressType]], + location_name_to_id: Dict[str, int], level_logic_buildings: List[str], + upgrade_logic_buildings: List[str], early_useful: str, goal: str) -> List[Region]: + """Creates and returns a list of all regions with entrances and all locations placed correctly.""" + regions: Dict[str, Region] = {name: Region(name, player, multiworld) for name in all_regions} + + # Creates ShapezLocations for every included location and puts them into the correct region + for name, data in included_locations.items(): + regions[data[0]].locations.append(ShapezLocation(player, name, location_name_to_id[name], + regions[data[0]], data[1])) + + # Create goal event + if goal in [GOALS.vanilla, GOALS.mam]: + goal_region = regions[REGIONS.levels_5] + elif goal == GOALS.even_fasterer: + goal_region = regions[REGIONS.upgrades_5] + else: + goal_region = regions[REGIONS.all_buildings] + goal_location = ShapezLocation(player, LOCATIONS.goal, None, goal_region, LocationProgressType.DEFAULT) + goal_location.place_locked_item(ShapezItem(ITEMS.goal, ItemClassification.progression_skip_balancing, None, player)) + if goal == GOALS.efficiency_iii: + add_rule(goal_location, lambda state: has_x_belt_multiplier(state, player, 8)) + goal_region.locations.append(goal_location) + multiworld.completion_condition[player] = lambda state: state.has(ITEMS.goal, player) + + # Connect Menu to rest of regions + regions[REGIONS.menu].connect(regions[REGIONS.belt], "Placing belts", lambda state: state.has(ITEMS.belt, player)) + regions[REGIONS.menu].connect(regions[REGIONS.extract], "Extracting shapes from patches", + lambda state: state.has_any((ITEMS.extractor, ITEMS.extractor_chain), player)) + regions[REGIONS.extract].connect( + regions[REGIONS.main], "Transporting shapes over the canvas", + lambda state: state.has_any((ITEMS.belt, ITEMS.comp_merger, ITEMS.comp_splitter), player) + ) + + # Connect achievement regions + regions[REGIONS.main].connect(regions[REGIONS.paint_not_quad], "Painting with (double) painter", + lambda state: state.has_any((ITEMS.painter, ITEMS.painter_double), player)) + regions[REGIONS.extract].connect(regions[REGIONS.cut_not_quad], "Cutting with half cutter", + lambda state: can_cut_half(state, player)) + regions[REGIONS.extract].connect(regions[REGIONS.rotate_cw], "Rotating clockwise", + lambda state: state.has(ITEMS.rotator, player)) + regions[REGIONS.extract].connect(regions[REGIONS.stack_shape], "Stacking shapes", + lambda state: can_stack(state, player)) + regions[REGIONS.extract].connect(regions[REGIONS.store_shape], "Storing shapes", + lambda state: state.has(ITEMS.storage, player)) + regions[REGIONS.extract].connect(regions[REGIONS.trash_shape], "Trashing shapes", + lambda state: state.has(ITEMS.trash, player)) + regions[REGIONS.main].connect(regions[REGIONS.blueprint], "Copying and placing blueprints", + lambda state: state.has(ITEMS.blueprints, player) and + can_make_stitched_shape(state, player, floating) and + can_paint(state, player) and can_mix_colors(state, player)) + regions[REGIONS.menu].connect(regions[REGIONS.wiring], "Using the wires layer", + lambda state: state.has(ITEMS.wires, player)) + regions[REGIONS.main].connect(regions[REGIONS.mam], "Building a MAM", + lambda state: can_build_mam(state, player, floating)) + regions[REGIONS.menu].connect(regions[REGIONS.any_building], "Placing any building", lambda state: state.has_any(( + ITEMS.belt, ITEMS.balancer, ITEMS.comp_merger, ITEMS.comp_splitter, ITEMS.tunnel, ITEMS.tunnel_tier_ii, + ITEMS.extractor, ITEMS.extractor_chain, ITEMS.cutter, ITEMS.cutter_quad, ITEMS.rotator, ITEMS.rotator_ccw, + ITEMS.rotator_180, ITEMS.stacker, ITEMS.painter, ITEMS.painter_double, ITEMS.painter_quad, ITEMS.color_mixer, + ITEMS.trash, ITEMS.belt_reader, ITEMS.storage, ITEMS.switch, ITEMS.item_filter, ITEMS.display, ITEMS.wires + ), player)) + regions[REGIONS.main].connect(regions[REGIONS.all_buildings], "Using all main buildings", + lambda state: can_make_stitched_shape(state, player, floating) and + can_paint(state, player) and can_mix_colors(state, player)) + regions[REGIONS.all_buildings].connect(regions[REGIONS.all_buildings_x1_6_belt], + "Delivering per second with 1.6x belt speed", + lambda state: has_x_belt_multiplier(state, player, 1.6)) + + # Progressively connect level and upgrade regions + regions[REGIONS.main].connect( + regions[REGIONS.levels_1], "Using first level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 0, False)) + regions[REGIONS.levels_1].connect( + regions[REGIONS.levels_2], "Using second level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 1, False)) + regions[REGIONS.levels_2].connect( + regions[REGIONS.levels_3], "Using third level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 2, + early_useful == OPTIONS.buildings_3)) + regions[REGIONS.levels_3].connect( + regions[REGIONS.levels_4], "Using fourth level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 3, False)) + regions[REGIONS.levels_4].connect( + regions[REGIONS.levels_5], "Using fifth level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 4, + early_useful == OPTIONS.buildings_5)) + regions[REGIONS.main].connect( + regions[REGIONS.upgrades_1], "Using first upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 0, False)) + regions[REGIONS.upgrades_1].connect( + regions[REGIONS.upgrades_2], "Using second upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 1, False)) + regions[REGIONS.upgrades_2].connect( + regions[REGIONS.upgrades_3], "Using third upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 2, + early_useful == OPTIONS.buildings_3)) + regions[REGIONS.upgrades_3].connect( + regions[REGIONS.upgrades_4], "Using fourth upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 3, False)) + regions[REGIONS.upgrades_4].connect( + regions[REGIONS.upgrades_5], "Using fifth upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 4, + early_useful == OPTIONS.buildings_5)) + + # Connect Uncolored shapesanity regions to Main + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.full, REGIONS.uncol)], "Delivering unprocessed", lambda state: True) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.half, REGIONS.uncol)], "Cutting in single half", + lambda state: can_make_half_shape(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.piece, REGIONS.uncol)], "Cutting in single piece", + lambda state: (can_cut_half(state, player) and can_rotate_90(state, player)) or + state.has(ITEMS.cutter_quad, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.half_half, REGIONS.uncol)], "Cutting and stacking into two halves", + lambda state: can_make_half_half_shape(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.stitched, REGIONS.uncol)], "Stitching complex shapes", + lambda state: can_make_stitched_shape(state, player, floating)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.east_wind, REGIONS.uncol)], "Rotating and stitching a single windmill half", + lambda state: can_make_east_windmill(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_full, REGIONS.uncol)], "Painting with a quad painter or stitching", + lambda state: can_make_stitched_shape(state, player, floating) or can_use_quad_painter(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_east_wind, REGIONS.uncol)], "Why windmill, why?", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_east_windmill(state, player))) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_half_half, REGIONS.uncol)], "Quad painting a half-half shape", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_half_half_shape(state, player))) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_half, REGIONS.uncol)], "Quad painting a half shape", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_half_shape(state, player))) + + # Progressively connect colored shapesanity regions + for processing in shapesanity_processing: + regions[REGIONS.sanity(processing, REGIONS.uncol)].connect( + regions[REGIONS.sanity(processing, REGIONS.painted)], f"Painting a {processing.lower()} shape", + lambda state: can_paint(state, player)) + regions[REGIONS.sanity(processing, REGIONS.painted)].connect( + regions[REGIONS.sanity(processing, REGIONS.mixed)], f"Mixing colors for a {processing.lower()} shape", + lambda state: can_mix_colors(state, player)) + + return [region for region in regions.values() if len(region.locations) or len(region.exits)] diff --git a/worlds/shapez/test/__init__.py b/worlds/shapez/test/__init__.py new file mode 100644 index 0000000000..3ab626e639 --- /dev/null +++ b/worlds/shapez/test/__init__.py @@ -0,0 +1,213 @@ +from unittest import TestCase + +from test.bases import WorldTestBase +from .. import options_presets, ShapezWorld +from ..data.strings import GOALS, OTHER, ITEMS, LOCATIONS, CATEGORY, OPTIONS, SHAPESANITY +from ..options import max_levels_and_upgrades, max_shapesanity + + +class ShapezTestBase(WorldTestBase): + game = OTHER.game_name + world: ShapezWorld + + def test_location_count(self): + self.assertTrue(self.world.location_count > 0, + f"location_count is {self.world.location_count} for some reason.") + + def test_logic_lists(self): + logic_buildings = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + for building in logic_buildings: + count = self.world.level_logic.count(building) + self.assertTrue(count == 1, f"{building} was found {count} times in level_logic.") + count = self.world.upgrade_logic.count(building) + self.assertTrue(count == 1, f"{building} was found {count} times in upgrade_logic.") + self.assertTrue(len(self.world.level_logic) == 5, + f"level_logic contains {len(self.world.level_logic)} entries instead of the expected 5.") + self.assertTrue(len(self.world.upgrade_logic) == 5, + f"upgrade_logic contains {len(self.world.upgrade_logic)} entries instead of the expected 5.") + + def test_random_logic_phase_length(self): + self.assertTrue(len(self.world.random_logic_phase_length) == 5, + f"random_logic_phase_length contains {len(self.world.random_logic_phase_length)} entries " + + f"instead of the expected 5.") + self.assertTrue(sum(self.world.random_logic_phase_length) < self.world.maxlevel, + f"The sum of all random phase lengths is greater than allowed: " + + str(sum(self.world.random_logic_phase_length))) + for length in self.world.random_logic_phase_length: + self.assertTrue(length in range(self.world.maxlevel), + f"Found an illegal value in random_logic_phase_length: {length}") + + def test_category_random_logic_amounts(self): + self.assertTrue(len(self.world.category_random_logic_amounts) == 4, + f"Found {len(self.world.category_random_logic_amounts)} instead of 4 keys in " + f"category_random_logic_amounts.") + self.assertTrue(min(self.world.category_random_logic_amounts.values()) == 0, + "Found a value less than or no 0 in category_random_logic_amounts.") + self.assertTrue(max(self.world.category_random_logic_amounts.values()) <= 5, + "Found a value greater than 5 in category_random_logic_amounts.") + + def test_maxlevel_and_finaltier(self): + self.assertTrue(self.world.maxlevel in range(25, max_levels_and_upgrades), + f"Found an illegal value for maxlevel: {self.world.maxlevel}") + self.assertTrue(self.world.finaltier in range(8, max_levels_and_upgrades+1), + f"Found an illegal value for finaltier: {self.world.finaltier}") + + def test_included_locations(self): + self.assertTrue(len(self.world.included_locations) > 0, "Found no locations cached in included_locations.") + self.assertTrue(LOCATIONS.level(1) in self.world.included_locations.keys(), + "Could not find Level 1 (guraranteed location) cached in included_locations.") + self.assertTrue(LOCATIONS.upgrade(CATEGORY.belt, "II") in self.world.included_locations.keys(), + "Could not find Belt Upgrade Tier II (guraranteed location) cached in included_locations.") + self.assertTrue(LOCATIONS.shapesanity(1) in self.world.included_locations.keys(), + "Could not find Shapesanity 1 (guraranteed location) cached in included_locations.") + + def test_shapesanity_names(self): + names_length = len(self.world.shapesanity_names) + locations_length = len([0 for loc in self.multiworld.get_locations(self.player) if "Shapesanity" in loc.name]) + self.assertEqual(names_length, locations_length, + f"The amount of shapesanity names ({names_length}) does not match the amount of included " + + f"shapesanity locations ({locations_length}).") + self.assertTrue(SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.circle) in self.world.shapesanity_names, + "Uncolored Circle is guaranteed but was not found in shapesanity_names.") + + def test_efficiency_iii_no_softlock(self): + if self.world.options.goal == GOALS.efficiency_iii: + for item in self.multiworld.itempool: + self.assertFalse(item.name.endswith("Upgrade Trap"), + "Item pool contains an upgrade trap, which could make the efficiency_iii goal " + "unreachable if collected.") + + +class TestGlobalOptionsImport(TestCase): + + def test_global_options_import(self): + self.assertTrue(isinstance(max_levels_and_upgrades, int), f"The global option max_levels_and_upgrades is not " + + f"an integer, but instead a " + + f"{type(max_levels_and_upgrades)}.") + self.assertTrue(max_levels_and_upgrades >= 27, f"max_levels_and_upgrades must be at least 27, but is " + + f"{max_levels_and_upgrades} instead.") + self.assertTrue(isinstance(max_shapesanity, int), f"The global option max_shapesanity is not an integer, but " + + f"instead a {type(max_levels_and_upgrades)}.") + self.assertTrue(max_shapesanity >= 4, f"max_shapesanity must be at least 4, but is " + + f"{max_levels_and_upgrades} instead.") + + +class TestMinimum(ShapezTestBase): + options = options_presets["Minimum checks"] + + +class TestMaximum(ShapezTestBase): + options = options_presets["Maximum checks"] + + +class TestRestrictive(ShapezTestBase): + options = options_presets["Restrictive start"] + + +class TestAllRelevantOptions1(ShapezTestBase): + options = { + "goal": GOALS.vanilla, + "randomize_level_requirements": False, + "randomize_upgrade_requirements": False, + "complexity_growth_gradient": "0.1234", + "early_balancer_tunnel_and_trash": "none", + "lock_belt_and_extractor": True, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "exclude_progression_unreasonable": True, + "shapesanity_amount": max_shapesanity, + "traps_percentage": "random" + } + + +class TestAllRelevantOptions2(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": max_levels_and_upgrades, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": OPTIONS.logic_random_steps, + "randomize_upgrade_logic": OPTIONS.logic_vanilla_like, + "complexity_growth_gradient": "2", + "early_balancer_tunnel_and_trash": OPTIONS.buildings_5, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "exclude_progression_unreasonable": False, + "shapesanity_amount": 4, + "traps_percentage": 0 + } + + +class TestAllRelevantOptions3(ShapezTestBase): + options = { + "goal": GOALS.even_fasterer, + "goal_amount": max_levels_and_upgrades, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_vanilla}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_linear, + "complexity_growth_gradient": "1e-003", + "early_balancer_tunnel_and_trash": OPTIONS.buildings_3, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": 100, + "include_whacky_upgrades": True, + "split_inventory_draining_trap": True + } + + +class TestAllRelevantOptions4(ShapezTestBase): + options = { + "goal": GOALS.efficiency_iii, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_stretched}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_category, + "early_balancer_tunnel_and_trash": OPTIONS.sphere_1, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": "random", + "include_whacky_upgrades": True, + } + + +class TestAllRelevantOptions5(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": "random-range-27-500", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_quick}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_category_random, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": 100, + "split_inventory_draining_trap": False + } + + +class TestAllRelevantOptions6(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": "random-range-27-500", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": OPTIONS.logic_hardcore, + "randomize_upgrade_logic": OPTIONS.logic_hardcore, + "lock_belt_and_extractor": False, + "include_achievements": False, + "shapesanity_amount": "random", + "traps_percentage": "random" + } From 955a86803fe42006a3fd4d2e3915183a849a5df2 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Wed, 21 May 2025 11:02:30 -0400 Subject: [PATCH 153/199] Super Mario Land 2: Implement New Game (#2730) Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: alchav --- README.md | 1 + docs/CODEOWNERS | 3 + worlds/marioland2/LICENSE | 21 + worlds/marioland2/__init__.py | 449 ++++++++ worlds/marioland2/basepatch.bsdiff4 | Bin 0 -> 1241 bytes worlds/marioland2/client.py | 250 ++++ .../marioland2/docs/en_Super Mario Land 2.md | 64 ++ worlds/marioland2/docs/setup_en.md | 75 ++ worlds/marioland2/items.py | 79 ++ worlds/marioland2/locations.py | 498 ++++++++ worlds/marioland2/logic.py | 608 ++++++++++ worlds/marioland2/options.py | 198 ++++ worlds/marioland2/rom.py | 146 +++ worlds/marioland2/rom_addresses.py | 39 + worlds/marioland2/sprite_randomizer.py | 131 +++ worlds/marioland2/sprites.py | 1016 +++++++++++++++++ 16 files changed, 3578 insertions(+) create mode 100644 worlds/marioland2/LICENSE create mode 100644 worlds/marioland2/__init__.py create mode 100644 worlds/marioland2/basepatch.bsdiff4 create mode 100644 worlds/marioland2/client.py create mode 100644 worlds/marioland2/docs/en_Super Mario Land 2.md create mode 100644 worlds/marioland2/docs/setup_en.md create mode 100644 worlds/marioland2/items.py create mode 100644 worlds/marioland2/locations.py create mode 100644 worlds/marioland2/logic.py create mode 100644 worlds/marioland2/options.py create mode 100644 worlds/marioland2/rom.py create mode 100644 worlds/marioland2/rom_addresses.py create mode 100644 worlds/marioland2/sprite_randomizer.py create mode 100644 worlds/marioland2/sprites.py diff --git a/README.md b/README.md index 861a6eed1d..84e62b1528 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Currently, the following games are supported: * Civilization VI * The Legend of Zelda: The Wind Waker * Jak and Daxter: The Precursor Legacy +* Super Mario Land 2: 6 Golden Coins For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index ca19d27da9..2289daad07 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -178,6 +178,9 @@ # Super Mario 64 /worlds/sm64ex/ @N00byKing +# Super Mario Land 2: 6 Golden Coins +/worlds/marioland2/ @Alchav + # Super Mario World /worlds/smw/ @PoryGone diff --git a/worlds/marioland2/LICENSE b/worlds/marioland2/LICENSE new file mode 100644 index 0000000000..7ac515f432 --- /dev/null +++ b/worlds/marioland2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022-2023 Alex "Alchav" Avery + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/marioland2/__init__.py b/worlds/marioland2/__init__.py new file mode 100644 index 0000000000..ea1354db6e --- /dev/null +++ b/worlds/marioland2/__init__.py @@ -0,0 +1,449 @@ +import base64 +import Utils +import settings +from copy import deepcopy + +from worlds.AutoWorld import World, WebWorld +from BaseClasses import Region, Location, Item, ItemClassification, Tutorial + +from . import client +from .rom import generate_output, SuperMarioLand2ProcedurePatch +from .options import SML2Options +from .locations import (locations, location_name_to_id, level_name_to_id, level_id_to_name, START_IDS, coins_coords, + auto_scroll_max) +from .items import items +from .sprites import level_sprites +from .sprite_randomizer import randomize_enemies, randomize_platforms +from .logic import has_pipe_up, has_pipe_down, has_pipe_left, has_pipe_right, has_level_progression, is_auto_scroll +from . import logic + + +class MarioLand2Settings(settings.Group): + class SML2RomFile(settings.UserFilePath): + """File name of the Super Mario Land 2 1.0 ROM""" + description = "Super Mario Land 2 - 6 Golden Coins (USA, Europe) 1.0 ROM File" + copy_to = "Super Mario Land 2 - 6 Golden Coins (USA, Europe).gb" + md5s = [SuperMarioLand2ProcedurePatch.hash] + + rom_file: SML2RomFile = SML2RomFile(SML2RomFile.copy_to) + + +class MarioLand2WebWorld(WebWorld): + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing Super Mario Land 2 with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["Alchav"] + ) + + tutorials = [setup_en] + + +class MarioLand2World(World): + """Super Mario Land 2 is a classic platformer that follows Mario on a quest to reclaim his castle from the + villainous Wario. This iconic game features 32 levels, unique power-ups, and introduces Wario as Mario's + arch-rival.""" # -ChatGPT + + game = "Super Mario Land 2" + + settings_key = "sml2_options" + settings: MarioLand2Settings + + location_name_to_id = location_name_to_id + item_name_to_id = {item_name: ID for ID, item_name in enumerate(items, START_IDS)} + + web = MarioLand2WebWorld() + + item_name_groups = { + "Level Progression": { + item_name for item_name in items if item_name.endswith(("Progression", "Secret", "Secret 1", "Secret 2")) + and "Auto Scroll" not in item_name + }, + "Bells": {item_name for item_name in items if "Bell" in item_name}, + "Golden Coins": {"Mario Coin", "Macro Coin", "Space Coin", "Tree Coin", "Turtle Coin", "Pumpkin Coin"}, + "Coins": {"1 Coin", *{f"{i} Coins" for i in range(2, 169)}}, + "Powerups": {"Mushroom", "Fire Flower", "Carrot"}, + "Difficulties": {"Easy Mode", "Normal Mode"}, + "Auto Scroll Traps": {item_name for item_name in items + if "Auto Scroll" in item_name and "Cancel" not in item_name}, + "Cancel Auto Scrolls": {item_name for item_name in items if "Cancel Auto Scroll" in item_name}, + } + + location_name_groups = { + "Bosses": { + "Tree Zone 5 - Boss", "Space Zone 2 - Boss", "Macro Zone 4 - Boss", + "Pumpkin Zone 4 - Boss", "Mario Zone 4 - Boss", "Turtle Zone 3 - Boss" + }, + "Normal Exits": {location for location in locations if locations[location]["type"] == "level"}, + "Secret Exits": {location for location in locations if locations[location]["type"] == "secret"}, + "Bells": {location for location in locations if locations[location]["type"] == "bell"}, + "Coins": {location for location in location_name_to_id if "Coin" in location} + } + + options_dataclass = SML2Options + options: SML2Options + + generate_output = generate_output + + def __init__(self, world, player: int): + super().__init__(world, player) + self.auto_scroll_levels = [] + self.num_coin_locations = [] + self.max_coin_locations = {} + self.sprite_data = {} + self.coin_fragments_required = 0 + + def generate_early(self): + self.sprite_data = deepcopy(level_sprites) + if self.options.randomize_enemies: + randomize_enemies(self.sprite_data, self.random) + if self.options.randomize_platforms: + randomize_platforms(self.sprite_data, self.random) + + if self.options.marios_castle_midway_bell: + self.sprite_data["Mario's Castle"][35]["sprite"] = "Midway Bell" + + if self.options.auto_scroll_chances == "vanilla": + self.auto_scroll_levels = [int(i in [19, 25, 30]) for i in range(32)] + else: + self.auto_scroll_levels = [int(self.random.randint(1, 100) <= self.options.auto_scroll_chances) + for _ in range(32)] + + self.auto_scroll_levels[level_name_to_id["Mario's Castle"]] = 0 + unbeatable_scroll_levels = ["Tree Zone 3", "Macro Zone 2", "Space Zone 1", "Turtle Zone 2", "Pumpkin Zone 2"] + if not self.options.shuffle_midway_bells: + unbeatable_scroll_levels.append("Pumpkin Zone 1") + for level, i in enumerate(self.auto_scroll_levels): + if i == 1: + if self.options.auto_scroll_mode in ("global_cancel_item", "level_cancel_items"): + self.auto_scroll_levels[level] = 2 + elif self.options.auto_scroll_mode == "chaos": + if (self.options.accessibility == "full" + and level_id_to_name[level] in unbeatable_scroll_levels): + self.auto_scroll_levels[level] = 2 + else: + self.auto_scroll_levels[level] = self.random.randint(1, 3) + elif (self.options.accessibility == "full" + and level_id_to_name[level] in unbeatable_scroll_levels): + self.auto_scroll_levels[level] = 0 + if self.auto_scroll_levels[level] == 1 and "trap" in self.options.auto_scroll_mode.current_key: + self.auto_scroll_levels[level] = 3 + + def create_regions(self): + menu_region = Region("Menu", self.player, self.multiworld) + self.multiworld.regions.append(menu_region) + created_regions = [] + for location_name, data in locations.items(): + region_name = location_name.split(" -")[0] + if region_name in created_regions: + region = self.multiworld.get_region(region_name, self.player) + else: + region = Region(region_name, self.player, self.multiworld) + if region_name == "Tree Zone Secret Course": + region_to_connect = self.multiworld.get_region("Tree Zone 2", self.player) + elif region_name == "Space Zone Secret Course": + region_to_connect = self.multiworld.get_region("Space Zone 1", self.player) + elif region_name == "Macro Zone Secret Course": + region_to_connect = self.multiworld.get_region("Macro Zone 1", self.player) + elif region_name == "Pumpkin Zone Secret Course 1": + region_to_connect = self.multiworld.get_region("Pumpkin Zone 2", self.player) + elif region_name == "Pumpkin Zone Secret Course 2": + region_to_connect = self.multiworld.get_region("Pumpkin Zone 3", self.player) + elif region_name == "Turtle Zone Secret Course": + region_to_connect = self.multiworld.get_region("Turtle Zone 2", self.player) + elif region_name.split(" ")[-1].isdigit() and int(region_name.split(" ")[-1]) > 1: + region_to_connect = self.multiworld.get_region(" ".join(region_name.split(" ")[:2]) + + f" {int(region_name.split(' ')[2]) - 1}", + self.player) + else: + region_to_connect = menu_region + region_to_connect.connect(region) + self.multiworld.regions.append(region) + created_regions.append(region_name) + + if location_name == "Mario's Castle - Midway Bell" and not self.options.marios_castle_midway_bell: + continue + region.locations.append(MarioLand2Location(self.player, location_name, + self.location_name_to_id[location_name], region)) + self.multiworld.get_region("Macro Zone Secret Course", self.player).connect( + self.multiworld.get_region("Macro Zone 4", self.player)) + self.multiworld.get_region("Macro Zone 4", self.player).connect( + self.multiworld.get_region("Macro Zone Secret Course", self.player)) + + castle = self.multiworld.get_region("Mario's Castle", self.player) + wario = MarioLand2Location(self.player, "Mario's Castle - Wario", parent=castle) + castle.locations.append(wario) + wario.place_locked_item(MarioLand2Item("Wario Defeated", ItemClassification.progression, None, self.player)) + + if self.options.coinsanity: + coinsanity_checks = self.options.coinsanity_checks.value + self.num_coin_locations = [[region, 1] for region in created_regions if region != "Mario's Castle"] + self.max_coin_locations = {region: len(coins_coords[region]) for region in created_regions + if region != "Mario's Castle"} + if self.options.accessibility == "full" or self.options.auto_scroll_mode == "always": + for level in self.max_coin_locations: + if level in auto_scroll_max and self.auto_scroll_levels[level_name_to_id[level]] in (1, 3): + if isinstance(auto_scroll_max[level], tuple): + self.max_coin_locations[level] = min( + auto_scroll_max[level][int(self.options.shuffle_midway_bells.value)], + self.max_coin_locations[level]) + else: + self.max_coin_locations[level] = min(auto_scroll_max[level], self.max_coin_locations[level]) + coinsanity_checks = min(sum(self.max_coin_locations.values()), coinsanity_checks) + for i in range(coinsanity_checks - 31): + self.num_coin_locations.sort(key=lambda region: self.max_coin_locations[region[0]] / region[1]) + self.num_coin_locations[-1][1] += 1 + coin_locations = [] + for level, coins in self.num_coin_locations: + if self.max_coin_locations[level]: + coin_thresholds = self.random.sample(range(1, self.max_coin_locations[level] + 1), coins) + coin_locations += [f"{level} - {i} Coin{'s' if i > 1 else ''}" for i in coin_thresholds] + for location_name in coin_locations: + region = self.multiworld.get_region(location_name.split(" -")[0], self.player) + region.locations.append(MarioLand2Location(self.player, location_name, + self.location_name_to_id[location_name], parent=region)) + + def set_rules(self): + entrance_rules = { + "Menu -> Space Zone 1": lambda state: state.has("Hippo Bubble", self.player) + or (state.has("Carrot", self.player) + and not is_auto_scroll(state, self.player, "Hippo Zone")), + "Space Zone 1 -> Space Zone Secret Course": lambda state: state.has("Space Zone Secret", self.player), + "Space Zone 1 -> Space Zone 2": lambda state: has_level_progression(state, "Space Zone Progression", self.player), + "Tree Zone 1 -> Tree Zone 2": lambda state: has_level_progression(state, "Tree Zone Progression", self.player), + "Tree Zone 2 -> Tree Zone Secret Course": lambda state: state.has("Tree Zone Secret", self.player), + "Tree Zone 2 -> Tree Zone 3": lambda state: has_level_progression(state, "Tree Zone Progression", self.player, 2), + "Tree Zone 4 -> Tree Zone 5": lambda state: has_level_progression(state, "Tree Zone Progression", self.player, 3), + "Macro Zone 1 -> Macro Zone Secret Course": lambda state: state.has("Macro Zone Secret 1", self.player), + "Macro Zone Secret Course -> Macro Zone 4": lambda state: state.has("Macro Zone Secret 2", self.player), + "Macro Zone 1 -> Macro Zone 2": lambda state: has_level_progression(state, "Macro Zone Progression", self.player), + "Macro Zone 2 -> Macro Zone 3": lambda state: has_level_progression(state, "Macro Zone Progression", self.player, 2), + "Macro Zone 3 -> Macro Zone 4": lambda state: has_level_progression(state, "Macro Zone Progression", self.player, 3), + "Macro Zone 4 -> Macro Zone Secret Course": lambda state: state.has("Macro Zone Secret 2", self.player), + "Pumpkin Zone 1 -> Pumpkin Zone 2": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player), + "Pumpkin Zone 2 -> Pumpkin Zone Secret Course 1": lambda state: state.has("Pumpkin Zone Secret 1", self.player), + "Pumpkin Zone 2 -> Pumpkin Zone 3": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player, 2), + "Pumpkin Zone 3 -> Pumpkin Zone Secret Course 2": lambda state: state.has("Pumpkin Zone Secret 2", self.player), + "Pumpkin Zone 3 -> Pumpkin Zone 4": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player, 3), + "Mario Zone 1 -> Mario Zone 2": lambda state: has_level_progression(state, "Mario Zone Progression", self.player), + "Mario Zone 2 -> Mario Zone 3": lambda state: has_level_progression(state, "Mario Zone Progression", self.player, 2), + "Mario Zone 3 -> Mario Zone 4": lambda state: has_level_progression(state, "Mario Zone Progression", self.player, 3), + "Turtle Zone 1 -> Turtle Zone 2": lambda state: has_level_progression(state, "Turtle Zone Progression", self.player), + "Turtle Zone 2 -> Turtle Zone Secret Course": lambda state: state.has("Turtle Zone Secret", self.player), + "Turtle Zone 2 -> Turtle Zone 3": lambda state: has_level_progression(state, "Turtle Zone Progression", self.player, 2), + } + + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + # Require the other coins just to ensure they are being added to start inventory properly, + # and so they show up in Playthrough as required + entrance_rules["Menu -> Mario's Castle"] = lambda state: (state.has_all( + ["Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Turtle Coin"], self.player) + and state.has("Mario Coin Fragment", self.player, self.coin_fragments_required)) + else: + entrance_rules["Menu -> Mario's Castle"] = lambda state: state.has_from_list_unique([ + "Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Mario Coin", "Turtle Coin" + ], self.player, self.options.required_golden_coins) + + + for entrance, rule in entrance_rules.items(): + self.multiworld.get_entrance(entrance, self.player).access_rule = rule + + for location in self.multiworld.get_locations(self.player): + if location.name.endswith(("Coins", "Coin")): + rule = getattr(logic, location.parent_region.name.lower().replace(" ", "_") + "_coins", None) + if rule: + coins = int(location.name.split(" ")[-2]) + location.access_rule = lambda state, coin_rule=rule, num_coins=coins: \ + coin_rule(state, self.player, num_coins) + else: + rule = getattr(logic, location.name.lower().replace( + " - ", "_").replace(" ", "_").replace("'", ""), None) + if rule: + location.access_rule = lambda state, loc_rule=rule: loc_rule(state, self.player) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Wario Defeated", self.player) + + def create_items(self): + item_counts = { + "Space Zone Progression": 1, + "Space Zone Secret": 1, + "Tree Zone Progression": 3, + "Tree Zone Secret": 1, + "Macro Zone Progression": 3, + "Macro Zone Secret 1": 1, + "Macro Zone Secret 2": 1, + "Pumpkin Zone Progression": 3, + "Pumpkin Zone Secret 1": 1, + "Pumpkin Zone Secret 2": 1, + "Mario Zone Progression": 3, + "Turtle Zone Progression": 2, + "Turtle Zone Secret": 1, + "Mushroom": 1, + "Fire Flower": 1, + "Carrot": 1, + "Space Physics": 1, + "Hippo Bubble": 1, + "Water Physics": 1, + "Super Star Duration Increase": 2, + "Mario Coin Fragment": 0, + } + + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + # There are 5 Zone Progression items that can be condensed. + item_counts["Mario Coin Fragment"] = 1 + ((5 * self.options.mario_coin_fragment_percentage) // 100) + + if self.options.coinsanity: + coin_count = sum([level[1] for level in self.num_coin_locations]) + max_coins = sum(self.max_coin_locations.values()) + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + removed_coins = (coin_count * self.options.mario_coin_fragment_percentage) // 100 + coin_count -= removed_coins + item_counts["Mario Coin Fragment"] += removed_coins + # Randomly remove some coin items for variety + coin_count -= (coin_count // self.random.randint(100, max(100, coin_count))) + + if coin_count: + coin_bundle_sizes = [max_coins // coin_count] * coin_count + remainder = max_coins - sum(coin_bundle_sizes) + for i in range(remainder): + coin_bundle_sizes[i] += 1 + for a, b in zip(range(1, len(coin_bundle_sizes), 2), range(2, len(coin_bundle_sizes), 2)): + split = self.random.randint(1, coin_bundle_sizes[a] + coin_bundle_sizes[b] - 1) + coin_bundle_sizes[a], coin_bundle_sizes[b] = split, coin_bundle_sizes[a] + coin_bundle_sizes[b] - split + for coin_bundle_size in coin_bundle_sizes: + item_name = f"{coin_bundle_size} Coin{'s' if coin_bundle_size > 1 else ''}" + if item_name in item_counts: + item_counts[item_name] += 1 + else: + item_counts[item_name] = 1 + + if self.options.shuffle_golden_coins == "shuffle": + for item in self.item_name_groups["Golden Coins"]: + item_counts[item] = 1 + elif self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + for item in ("Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Turtle Coin"): + self.multiworld.push_precollected(self.create_item(item)) + else: + for item, location_name in ( + ("Mario Coin", "Mario Zone 4 - Boss"), + ("Tree Coin", "Tree Zone 5 - Boss"), + ("Space Coin", "Space Zone 2 - Boss"), + ("Macro Coin", "Macro Zone 4 - Boss"), + ("Pumpkin Coin", "Pumpkin Zone 4 - Boss"), + ("Turtle Coin", "Turtle Zone 3 - Boss") + ): + location = self.multiworld.get_location(location_name, self.player) + location.place_locked_item(self.create_item(item)) + location.address = None + location.item.code = None + + if self.options.shuffle_midway_bells: + for item in [item for item in items if "Midway Bell" in item]: + if item != "Mario's Castle Midway Bell" or self.options.marios_castle_midway_bell: + item_counts[item] = 1 + + if self.options.difficulty_mode == "easy_to_normal": + item_counts["Normal Mode"] = 1 + elif self.options.difficulty_mode == "normal_to_easy": + item_counts["Easy Mode"] = 1 + + if self.options.shuffle_pipe_traversal == "single": + item_counts["Pipe Traversal"] = 1 + elif self.options.shuffle_pipe_traversal == "split": + item_counts["Pipe Traversal - Right"] = 1 + item_counts["Pipe Traversal - Left"] = 1 + item_counts["Pipe Traversal - Up"] = 1 + item_counts["Pipe Traversal - Down"] = 1 + else: + self.multiworld.push_precollected(self.create_item("Pipe Traversal")) + + if any(self.auto_scroll_levels): + if self.options.auto_scroll_mode == "global_trap_item": + item_counts["Auto Scroll"] = 1 + elif self.options.auto_scroll_mode == "global_cancel_item": + item_counts["Cancel Auto Scroll"] = 1 + else: + for level, i in enumerate(self.auto_scroll_levels): + if i == 3: + item_counts[f"Auto Scroll - {level_id_to_name[level]}"] = 1 + elif i == 2: + item_counts[f"Cancel Auto Scroll - {level_id_to_name[level]}"] = 1 + + for item in self.multiworld.precollected_items[self.player]: + if item.name in item_counts and item_counts[item.name] > 0: + item_counts[item.name] -= 1 + + location_count = len(self.multiworld.get_unfilled_locations(self.player)) + items_to_add = location_count - sum(item_counts.values()) + if items_to_add > 0: + mario_coin_frags = 0 + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + mario_coin_frags = (items_to_add * self.options.mario_coin_fragment_percentage) // 100 + item_counts["Mario Coin Fragment"] += mario_coin_frags + item_counts["Super Star Duration Increase"] += items_to_add - mario_coin_frags + elif items_to_add < 0: + if self.options.coinsanity: + for i in range(1, 168): + coin_name = f"{i} Coin{'s' if i > 1 else ''}" + if coin_name in item_counts: + amount_to_remove = min(-items_to_add, item_counts[coin_name]) + item_counts[coin_name] -= amount_to_remove + items_to_add += amount_to_remove + if items_to_add >= 0: + break + + double_progression_items = ["Tree Zone Progression", "Macro Zone Progression", "Pumpkin Zone Progression", + "Mario Zone Progression", "Turtle Zone Progression"] + self.random.shuffle(double_progression_items) + while sum(item_counts.values()) > location_count: + if double_progression_items: + double_progression_item = double_progression_items.pop() + item_counts[double_progression_item] -= 2 + item_counts[double_progression_item + " x2"] = 1 + continue + if self.options.auto_scroll_mode in ("level_trap_items", "level_cancel_items", + "chaos"): + auto_scroll_item = self.random.choice([item for item in item_counts if "Auto Scroll" in item]) + level = auto_scroll_item.split("- ")[1] + self.auto_scroll_levels[level_name_to_id[level]] = 0 + del item_counts[auto_scroll_item] + continue + raise Exception(f"Too many items in the item pool for Super Mario Land 2 player {self.player_name}") + # item = self.random.choice(list(item_counts)) + # item_counts[item] -= 1 + # if item_counts[item] == 0: + # del item_counts[item] + # self.multiworld.push_precollected(self.create_item(item)) + + self.coin_fragments_required = max((item_counts["Mario Coin Fragment"] + * self.options.mario_coin_fragments_required_percentage) // 100, 1) + + for item_name, count in item_counts.items(): + self.multiworld.itempool += [self.create_item(item_name) for _ in range(count)] + + def fill_slot_data(self): + return { + "energy_link": self.options.energy_link.value + } + + def create_item(self, name: str) -> Item: + return MarioLand2Item(name, items[name], self.item_name_to_id[name], self.player) + + def get_filler_item_name(self): + return "1 Coin" + + def modify_multidata(self, multidata: dict): + rom_name = bytearray(f'AP{Utils.__version__.replace(".", "")[0:3]}_{self.player}_{self.multiworld.seed:11}\0', + 'utf8')[:21] + rom_name.extend([0] * (21 - len(rom_name))) + new_name = base64.b64encode(bytes(rom_name)).decode() + multidata["connect_names"][new_name] = multidata["connect_names"][self.player_name] + + +class MarioLand2Location(Location): + game = "Super Mario Land 2" + + +class MarioLand2Item(Item): + game = "Super Mario Land 2" diff --git a/worlds/marioland2/basepatch.bsdiff4 b/worlds/marioland2/basepatch.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..a8818419a6b8896c9621fe26d74f82f9cc173853 GIT binary patch literal 1241 zcmV;~1Sb1JQ$$HdMl>*h000000002;0ssI200000KnMT;0000&T4*^jL0KkKS#~;f zH2?ri-+TYPfItwC00;sA0sue|7yyI_2m$~=0ssL3pa4`wJg2Fqh9G2Vp|l2+*q|9b zMu0K`A_X-_ndNQ|xy<#0GXMw=V&WbO0F;~vXAOI&Z4iip`XKa#LRcZH=$@MVraG@aVbm(eAT4*^jL0KkKStk;|jsO5GfB*mgeR|_@_g4L)1?k2JXhQsW^)ulW z!LfZ*OhoVAeg41#R|J_&q6HMmrXxTAWCo1@0iZMu0ie*((?9?XJw`zFG01XW^&;S4c27mwn01W}482|vgpaG--qwh9;N-GBm_7Fal)20Wu93 z00J^$GGGaWV39>JO&X0f@`tIDLnB6-00u)(Pyl2A00E#f0BPy~(9j2yQX3xJ2~$2@ zJ21$J6O9XSlL(A791}By!FMS-oFx`6rBp!vM>V^ayeN(};1e_6@ZGDG(`r~iZ!;Q^ zMHZ5>ve8om-Vj}fi%PJ;}gjg%dr*=CqmQWYu zgTgtC547Q`uYzC)WxP*Qcz{sPTly|=0;Q&s=%NiAK;-3@@(`fNtce(jHI4-XW&aKu zq|H;wNz2Nj&_%)Zbdd2V3|ie?LD+K6BSL+&i3uc<+RILq>1R)dG)_#E42S^+gkiIU z>b0$Fs?2=^5Ln39#T(}EAcat8Plw~#|D;I7CS)Srw{i-1p8;7pc*#A4RdgD?Id@Pe z0N<=ioatGZ4ezWZ5+|f65E_RL8|#*V(*_P(h^s^%2?#KRi%0SmC+S2N$cGo}RGoki zUoK-7xV_OUJKUZmaagaINa!6XATHP~r+y2y`+!yM9f^HniTRU-#uOwK`7URXh{WR( zanFs_L*1<(7VU+4#tfGNfC6A(0fbyMa4Zpg&BpE%Zw-)oKNw0BvXY60&y$&;6hqxIWa+5CR15%ul&LQ z0F!_J`JjNrbG6`we$?W{;qZam_CN#xR6y7O3~T^EVh}_bumJg{h*SV*05k@G0002c z0017Eo~NV{H5m{90iXZ?0ilop000^RB&McBdYLpd&@=!5Gyni-8V#iNJws|{rO^pm zct}as+zv=dvdTC&i5@2fZTE?a?^J>sH4{SvGYl6Sxz^>Ot@2fCHB-zcW_&+{Oe2~p zF3qD?UvhJ@04vvn@PH>Z$RR;)$jdU}J%PxtDGX3U!oXr4Ab~y#5k5_j_=q9$za4!c zEM!&}fXMM?Z(nbHD5yXqcJ(@HEOTy?pXs#&NY@$6_Vk42ez{qOWD?!#5g(nIKRzx* zWfOwyi9L{oGLlOmr~1&zbxG>AL;?VY)3H1%;sBTk2&?*#iRFSZAL8yvrwS4c)&H14 DQEB>< literal 0 HcmV?d00001 diff --git a/worlds/marioland2/client.py b/worlds/marioland2/client.py new file mode 100644 index 0000000000..41e6468f93 --- /dev/null +++ b/worlds/marioland2/client.py @@ -0,0 +1,250 @@ +import base64 +import logging + +from NetUtils import ClientStatus +from worlds._bizhawk.client import BizHawkClient +from worlds._bizhawk import read, write, guarded_write + +from .rom_addresses import rom_addresses + +logger = logging.getLogger("Client") + +BANK_EXCHANGE_RATE = 20000000000 + +overworld_music = (0x05, 0x06, 0x0D, 0x0E, 0x10, 0x12, 0x1B, 0x1C, 0x1E) + +class MarioLand2Client(BizHawkClient): + system = ("GB", "SGB") + patch_suffix = ".apsml2" + game = "Super Mario Land 2" + + def __init__(self): + super().__init__() + self.locations_array = [] + self.previous_level = None + + async def validate_rom(self, ctx): + game_name = await read(ctx.bizhawk_ctx, [(0x134, 10, "ROM")]) + game_name = game_name[0].decode("ascii") + if game_name == "MARIOLAND2": + ctx.game = self.game + ctx.items_handling = 0b111 + return True + return False + + async def set_auth(self, ctx): + auth_name = await read(ctx.bizhawk_ctx, [(0x77777, 21, "ROM")]) + auth_name = base64.b64encode(auth_name[0]).decode() + ctx.auth = auth_name + + async def game_watcher(self, ctx): + from . import START_IDS + from .items import items + from .locations import locations, level_id_to_name, coins_coords, location_name_to_id + + (game_loaded_check, level_data, music, auto_scroll_levels, current_level, + midway_point, bcd_lives, num_items_received, coins, options) = \ + await read(ctx.bizhawk_ctx, [(0x0046, 10, "CartRAM"), (0x0848, 42, "CartRAM"), (0x0469, 1, "CartRAM"), + (rom_addresses["Auto_Scroll_Levels_B"], 32, "ROM"), + (0x0269, 1, "CartRAM"), (0x02A0, 1, "CartRAM"), (0x022C, 1, "CartRAM"), + (0x00F0, 2, "CartRAM"), (0x0262, 2, "CartRAM"), + (rom_addresses["Coins_Required"], 8, "ROM")]) + + coins_required = int.from_bytes(options[:2], "big") + difficulty_mode = options[2] + star_count = int.from_bytes(options[3:5], "big") + midway_bells = options[5] + energy_link = options[6] + coin_mode = options[7] + + current_level = int.from_bytes(current_level, "big") + auto_scroll_levels = list(auto_scroll_levels) + midway_point = int.from_bytes(midway_point, "big") + music = int.from_bytes(music, "big") + level_data = list(level_data) + lives = bcd_lives.hex() + num_items_received = int.from_bytes(num_items_received, "big") + if num_items_received == 0xFFFF: + num_items_received = 0 + + items_received = [list(items.keys())[item.item - START_IDS] for item in ctx.items_received] + write_num_items_received = len(items_received).to_bytes(2, "big") + + level_progression = { + "Space Zone Progression", + "Tree Zone Progression", + "Macro Zone Progression", + "Pumpkin Zone Progression", + "Mario Zone Progression", + "Turtle Zone Progression", + } + for level_item in level_progression: + for _ in range(items_received.count(level_item + " x2")): + items_received += ([level_item] * 2) + + if "Pipe Traversal" in items_received: + items_received += ["Pipe Traversal - Left", "Pipe Traversal - Right", + "Pipe Traversal - Up", "Pipe Traversal - Down"] + + if coin_mode == 2 and items_received.count("Mario Coin Fragment") >= coins_required: + items_received.append("Mario Coin") + + if current_level == 255 and self.previous_level != 255: + if coin_mode < 2: + logger.info(f"Golden Coins required: {coins_required}") + else: + logger.info(f"Mario Coin Fragments required: {coins_required}. " + f"You have {items_received.count('Mario Coin Fragment')}") + self.previous_level = current_level + + # There is no music in the title screen demos, this is how we guard against anything in the demos registering. + # There is also no music at the door to Mario's Castle, which is why the above is before this check. + if game_loaded_check != b'\x124Vx\xff\xff\xff\xff\xff\xff' or music == 0: + return + + locations_checked = [] + if current_level in level_id_to_name: + level_name = level_id_to_name[current_level] + coin_tile_data = await read(ctx.bizhawk_ctx, [(0xB000 + ((coords[1] * 256) + coords[0]), 1, "System Bus") + for coords in coins_coords[level_name]]) + num_coins = len([tile[0] for tile in coin_tile_data if tile[0] in (0x7f, 0x60, 0x07)]) + locations_checked = [location_name_to_id[f"{level_name} - {i} Coin{'s' if i > 1 else ''}"] + for i in range(1, num_coins + 1)] + + new_lives = int(lives) + energy_link_add = None + if energy_link: + if new_lives == 0: + if (f"EnergyLink{ctx.team}" in ctx.stored_data + and ctx.stored_data[f"EnergyLink{ctx.team}"] + and ctx.stored_data[f"EnergyLink{ctx.team}"] >= BANK_EXCHANGE_RATE): + new_lives = 1 + energy_link_add = -BANK_EXCHANGE_RATE + elif new_lives > 1: + energy_link_add = BANK_EXCHANGE_RATE * (new_lives - 1) + new_lives = 1 + # Convert back to binary-coded-decimal + new_lives = int(str(new_lives), 16) + + new_coins = coins.hex() + new_coins = int(new_coins[2:] + new_coins[:2]) + for item in items_received[num_items_received:]: + if item.endswith("Coins") or item == "1 Coin": + new_coins += int(item.split(" ")[0]) + # Limit to 999 and convert back to binary-coded-decimal + new_coins = int(str(min(new_coins, 999)), 16).to_bytes(2, "little") + + modified_level_data = level_data.copy() + for ID, (location, data) in enumerate(locations.items(), START_IDS): + if "clear_condition" in data: + if items_received.count(data["clear_condition"][0]) >= data["clear_condition"][1]: + modified_level_data[data["ram_index"]] |= (0x08 if data["type"] == "bell" + else 0x01 if data["type"] == "secret" else 0x80) + + if data["type"] == "level" and level_data[data["ram_index"]] & 0x40: + locations_checked.append(ID) + if data["type"] == "secret" and level_data[data["ram_index"]] & 0x02: + locations_checked.append(ID) + elif data["type"] == "bell" and data["id"] == current_level and midway_point == 0xFF: + locations_checked.append(ID) + + invincibility_length = int((832.0 / (star_count + 1)) + * (items_received.count("Super Star Duration Increase") + 1)) + + if "Easy Mode" in items_received: + difficulty_mode = 1 + elif "Normal Mode" in items_received: + difficulty_mode = 0 + + data_writes = [ + (rom_addresses["Space_Physics"], [0x7e] if "Space Physics" in items_received else [0xaf], "ROM"), + (rom_addresses["Get_Hurt_To_Big_Mario"], [1] if "Mushroom" in items_received else [0], "ROM"), + (rom_addresses["Get_Mushroom_A"], [0xea, 0x16, 0xa2] if "Mushroom" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Mushroom_B"], [0xea, 0x16, 0xa2] if "Mushroom" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Mushroom_C"], [00] if "Mushroom" in items_received else [0xd8], "ROM"), + (rom_addresses["Get_Carrot_A"], [0xea, 0x16, 0xa2] if "Carrot" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Carrot_B"], [0xea, 0x16, 0xa2] if "Carrot" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Carrot_C"], [00] if "Carrot" in items_received else [0xc8], "ROM"), + (rom_addresses["Get_Fire_Flower_A"], [0xea, 0x16, 0xa2] if "Fire Flower" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Fire_Flower_B"], [0xea, 0x16, 0xa2] if "Fire Flower" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Fire_Flower_C"], [00] if "Fire Flower" in items_received else [0xc8], "ROM"), + (rom_addresses["Invincibility_Star_A"], [(invincibility_length >> 8) + 1], "ROM"), + (rom_addresses["Invincibility_Star_B"], [invincibility_length & 0xFF], "ROM"), + (rom_addresses["Enable_Bubble"], [0xcb, 0xd7] if "Hippo Bubble" in items_received else [0, 0], "ROM"), + (rom_addresses["Enable_Swim"], [0xcb, 0xcf] if "Water Physics" in items_received else [0, 0], "ROM"), + (rom_addresses["Pipe_Traversal_A"], [16] if "Pipe Traversal - Down" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_B"], [32] if "Pipe Traversal - Up" in items_received else [10], "ROM"), + (rom_addresses["Pipe_Traversal_C"], [48] if "Pipe Traversal - Right" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_D"], [64] if "Pipe Traversal - Left" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_A"], [5] if "Pipe Traversal - Down" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_B"], [5] if "Pipe Traversal - Up" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_C"], [5] if "Pipe Traversal - Right" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_D"], [5] if "Pipe Traversal - Left" in items_received else [0], "ROM"), + (0x022c, [new_lives], "CartRAM"), + (0x02E4, [difficulty_mode], "CartRAM"), + (0x0848, modified_level_data, "CartRAM"), + (0x0262, new_coins, "CartRAM"), + ] + + if items_received: + data_writes.append((0x00F0, write_num_items_received, "CartRAM")) + + if midway_point == 0xFF and (midway_bells or music in overworld_music): + # after registering the check for the midway bell, clear the value just for safety. + data_writes.append((0x02A0, [0], "CartRAM")) + + for i in range(32): + if auto_scroll_levels[i] == 3: + if "Auto Scroll" in items_received or f"Auto Scroll - {level_id_to_name[i]}" in items_received: + auto_scroll_levels[i] = 1 + if i == current_level: + data_writes.append((0x02C8, [0x01], "CartRAM")) + else: + auto_scroll_levels[i] = 0 + elif auto_scroll_levels[i] == 2: + if ("Cancel Auto Scroll" in items_received + or f"Cancel Auto Scroll - {level_id_to_name[i]}" in items_received): + auto_scroll_levels[i] = 0 + if i == current_level: + data_writes.append((0x02C8, [0x00], "CartRAM")) + else: + auto_scroll_levels[i] = 1 + data_writes.append((rom_addresses["Auto_Scroll_Levels"], auto_scroll_levels, "ROM")) + + success = await guarded_write(ctx.bizhawk_ctx, data_writes, [(0x0848, level_data, "CartRAM"), + (0x022C, [int.from_bytes(bcd_lives, "big")], + "CartRAM"), + [0x0262, coins, "CartRAM"]]) + + if success and energy_link_add is not None: + await ctx.send_msgs([{ + "cmd": "Set", "key": f"EnergyLink{ctx.team}", "operations": + [{"operation": "add", "value": energy_link_add}, + {"operation": "max", "value": 0}], + }]) + + if not ctx.server or not ctx.server.socket.open or ctx.server.socket.closed: + return + + if locations_checked and locations_checked != self.locations_array: + self.locations_array = locations_checked + await ctx.send_msgs([{"cmd": "LocationChecks", "locations": locations_checked}]) + + if music == 0x18: + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + + def on_package(self, ctx, cmd: str, args: dict): + super().on_package(ctx, cmd, args) + if cmd == 'Connected': + if ctx.slot_data["energy_link"]: + ctx.set_notify(f"EnergyLink{ctx.team}") + if ctx.ui: + ctx.ui.enable_energy_link() + ctx.ui.energy_link_label.text = "Lives: Standby" + elif cmd == "SetReply" and args["key"].startswith("EnergyLink"): + if ctx.ui: + ctx.ui.energy_link_label.text = f"Lives: {int(args['value'] / BANK_EXCHANGE_RATE)}" + elif cmd == "Retrieved": + if f"EnergyLink{ctx.team}" in args["keys"] and args['keys'][f'EnergyLink{ctx.team}'] and ctx.ui: + ctx.ui.energy_link_label.text = f"Lives: {int(args['keys'][f'EnergyLink{ctx.team}'] / BANK_EXCHANGE_RATE)}" diff --git a/worlds/marioland2/docs/en_Super Mario Land 2.md b/worlds/marioland2/docs/en_Super Mario Land 2.md new file mode 100644 index 0000000000..7be02a2a28 --- /dev/null +++ b/worlds/marioland2/docs/en_Super Mario Land 2.md @@ -0,0 +1,64 @@ +# Super Mario Land 2: 6 Golden Coins + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure and export a +config file. + +## What items and locations get shuffled? + +Completing a level's exits results in a location check instead of automatically bringing you to the next level. +Where there are secret exits, the secret exit will be a separate location check. There is one exception, Hippo Zone, +that does not have a separate check for its secret exit. The Hippo Zone secret exit will still bring you to the Space +Zone. + +Ringing the Midway Bells in each level that has one will register a location check. If the "Shuffle Midway Bells" option +is turned on, then ringing the bell will not grant the checkpoint, and instead you must obtain the Midway Bell item from +the item pool to gain the checkpoint for that level. Holding SELECT while loading into a level where you have unlocked +the Midway Bell checkpoint will start you at the beginning of the level. + +Unlocking paths to new levels requires finding or receiving Zone Progression items. For example, receiving the first +"Turtle Zone Progression" will unlock the path from Turtle Zone 1 to Turtle Zone 2. Paths to secret levels are separate +items, so Turtle Zone Secret will open the path from Turtle Zone 2 to the Turtle Zone Secret Course. + +Depending on settings, there may be some "Zone Progression x2" items that open two paths at once. + +The path from Tree Zone 2 to the branch to Tree Zone 3 and 4 is one unlock, so both levels will open at this point. + +Besides the zone progression unlocks, the following items are always shuffled: +- Mushroom: required to become Big Mario. If you are Fire or Bunny Mario and take damage, and have not obtained the +Mushroom, you will drop straight down to Small Mario. +- Fire Flower: required to become Fire Mario. +- Carrot: required to become Bunny Mario. +- Hippo Bubble: required to use the bubbles in Hippo Zone to fly. +- Water Physics: Mario will fall through water as though it is air until this is obtained. +- Space Physics: the Space Zone levels will have normal gravity until this is obtained. +- Super Star Duration Increase: you begin with a drastically lowered invincibility star duration, and these items will +increase it. + +Additionally, the following items can be shuffled depending on your YAML options: +- The 6 Golden Coins: note that the game will still show you the coin being sent to the castle when defeating a boss +regardless of whether the coin is actually obtained in that location. +- Mario Coin Fragments: As an alternative to shuffling the 6 Golden Coins, you can shuffle Mario Coin Fragments, +a chosen percentage of which are needed to assemble the Mario Coin. You will start with the other 5 coins. +- Normal Mode/Easy Mode: you can start the game in Normal Mode with an Easy Mode "upgrade" in the item pool, or start in +Easy Mode with a Normal Mode "trap" item, swapping the difficulty. +- Auto Scroll: auto-scrolling levels can be set to not auto scroll until this trap item is received. +- Pipe Traversal: required to enter pipes. Can also be split into 4 items, each enabling pipe entry from a different +direction. +- Coins: if Coinsanity is enabled, coins will be shuffled into the item pool. A number of checks will be added to each +level for obtaining a specific number of coins within a single playthrough of the level. + + +## When the player receives an item, what happens? + +There is no in-game indication that an item has been received. You will need to watch the client or web tracker to be +sure you're aware of the items you've received. + +## Special Thanks to: + +- [froggestspirit](https://github.com/froggestspirit) for his Super Mario Land 2 disassembly. While very incomplete, it +had enough memory values mapped out to make my work significantly easier. +- [slashinfty](https://github.com/slashinfty), the author of the +[Super Mario Land 2 Randomizer](https://sml2r.download/) for permitting me to port features such as Randomize Enemies +and Randomize Platforms directly from it. \ No newline at end of file diff --git a/worlds/marioland2/docs/setup_en.md b/worlds/marioland2/docs/setup_en.md new file mode 100644 index 0000000000..581d36e786 --- /dev/null +++ b/worlds/marioland2/docs/setup_en.md @@ -0,0 +1,75 @@ +# Setup Guide for Super Mario Land 2: 6 Golden Coins + +## Important + +As we are using BizHawk, this guide is only applicable to Windows and Linux systems. + +## Required Software + +- BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) + - Version 2.9.1 is recommended. + - Detailed installation instructions for BizHawk can be found at the above link. + - Windows users must run the prereq installer first, which can also be found at the above link. +- The built-in Archipelago client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) +- A Super Mario Land 2: 6 Golden Coins version 1.0 ROM file. The Archipelago community cannot provide this. + +## Configuring BizHawk + +Once BizHawk has been installed, open EmuHawk and change the following settings: + +- Under Config > Customize > Advanced, make sure the box for AutoSaveRAM is checked, and click the 5s button. + This reduces the possibility of losing save data in emulator crashes. +- Under Config > Customize, check the "Run in background" box. This will prevent disconnecting from the client while +EmuHawk is running in the background. + +It is strongly recommended to associate Game Boy ROM extensions (\*.gb) to the EmuHawk we've just installed. +To do so, we simply have to search any Game Boy ROM we happened to own, right click and select "Open with...", unfold +the list that appears and select the bottom option "Look for another application", then browse to the BizHawk folder +and select EmuHawk.exe. + +## Configuring your YAML file + +### What is a YAML file and why do I need one? + +Your YAML file contains a set of configuration options which provide the generator with information about how it should +generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy +an experience customized for their taste, and different players in the same multiworld can all have different options. + +### Where do I get a YAML file? + +You can generate a yaml or download a template by visiting the [Super Mario Land 2 Player Options Page](/games/Super%20Mario%20Land%202/player-options) + +## Joining a MultiWorld Game + +### Generating and Patching a Game + +1. Create your options file (YAML). +2. Follow the general Archipelago instructions for [generating a game](../../Archipelago/setup/en#generating-a-game). +This will generate an output file for you. Your patch file will have a `.apsml2` file extension. +3. Open `ArchipelagoLauncher.exe` +4. Select "Open Patch" on the left side and select your patch file. +5. If this is your first time patching, you will be prompted to locate your vanilla ROM. +6. A patched `.gb` file will be created in the same place as the patch file. +7. On your first time opening a patch with BizHawk Client, you will also be asked to locate `EmuHawk.exe` in your +BizHawk install. + +You must connect Super Mario Land 2 to a server, even for a single player game, or progress cannot be made. + +### Connect to the Multiserver + +By default, opening a patch file will do steps 1-5 below for you automatically. Even so, keep them in your memory just +in case you have to close and reopen a window mid-game for some reason. + +1. Super Mario Land 2 uses Archipelago's BizHawk Client. If the client isn't still open from when you patched your +game, you can re-open it from the launcher. +2. Ensure EmuHawk is running the patched ROM. +3. In EmuHawk, go to `Tools > Lua Console`. This window must stay open while playing. +4. In the Lua Console window, go to `Script > Open Script…`. +5. Navigate to your Archipelago install folder and open `data/lua/connector_bizhawk_generic.lua`. +6. The emulator may freeze every few seconds until it manages to connect to the client. This is expected. The BizHawk +Client window should indicate that it connected and recognized Super Mario Land 2. +7. To connect the client to the server, enter your room's address and port (e.g. `archipelago.gg:38281`) into the +top text field of the client and click Connect. + +To connect the client to the multiserver simply put `

:` on the textfield on top and press enter (if the +server uses password, type in the bottom textfield `/connect
: [password]`) \ No newline at end of file diff --git a/worlds/marioland2/items.py b/worlds/marioland2/items.py new file mode 100644 index 0000000000..041ffe99f9 --- /dev/null +++ b/worlds/marioland2/items.py @@ -0,0 +1,79 @@ +from BaseClasses import ItemClassification +from .locations import level_name_to_id +from .options import CoinsanityChecks + +items = { + "Space Zone Progression": ItemClassification.progression, + "Space Zone Secret": ItemClassification.progression, + "Tree Zone Progression": ItemClassification.progression, + "Tree Zone Progression x2": ItemClassification.progression, + "Tree Zone Secret": ItemClassification.progression, + "Macro Zone Progression": ItemClassification.progression, + "Macro Zone Progression x2": ItemClassification.progression, + "Macro Zone Secret 1": ItemClassification.progression, + "Macro Zone Secret 2": ItemClassification.progression_skip_balancing, + "Pumpkin Zone Progression": ItemClassification.progression, + "Pumpkin Zone Progression x2": ItemClassification.progression, + "Pumpkin Zone Secret 1": ItemClassification.progression, + "Pumpkin Zone Secret 2": ItemClassification.progression, + "Mario Zone Progression": ItemClassification.progression, + "Mario Zone Progression x2": ItemClassification.progression, + "Turtle Zone Progression": ItemClassification.progression, + "Turtle Zone Progression x2": ItemClassification.progression, + "Turtle Zone Secret": ItemClassification.progression, + "Tree Coin": ItemClassification.progression_skip_balancing, + "Space Coin": ItemClassification.progression_skip_balancing, + "Macro Coin": ItemClassification.progression_skip_balancing, + "Pumpkin Coin": ItemClassification.progression_skip_balancing, + "Mario Coin": ItemClassification.progression_skip_balancing, + "Turtle Coin": ItemClassification.progression_skip_balancing, + "Mario Coin Fragment": ItemClassification.progression_skip_balancing, + "Mushroom": ItemClassification.progression, + "Fire Flower": ItemClassification.progression, + "Carrot": ItemClassification.progression, + "Space Physics": ItemClassification.progression_skip_balancing, + "Hippo Bubble": ItemClassification.progression_skip_balancing, + "Water Physics": ItemClassification.progression, + "Pipe Traversal": ItemClassification.progression, + "Pipe Traversal - Down": ItemClassification.progression, + "Pipe Traversal - Up": ItemClassification.progression, + "Pipe Traversal - Right": ItemClassification.progression, + "Pipe Traversal - Left": ItemClassification.progression_skip_balancing, + "Super Star Duration Increase": ItemClassification.filler, + "Easy Mode": ItemClassification.useful, + "Normal Mode": ItemClassification.trap, + "Auto Scroll": ItemClassification.trap, + **{f"Auto Scroll - {level}": ItemClassification.trap for level in level_name_to_id if level != "Wario's Castle"}, + "Cancel Auto Scroll": ItemClassification.progression, + **{f"Cancel Auto Scroll - {level}": ItemClassification.progression for level in level_name_to_id + if level != "Wario's Castle"}, + "Mushroom Zone Midway Bell": ItemClassification.filler, + "Tree Zone 1 Midway Bell": ItemClassification.filler, + "Tree Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Tree Zone 4 Midway Bell": ItemClassification.progression_skip_balancing, + "Tree Zone 5 Midway Bell": ItemClassification.filler, + "Space Zone 1 Midway Bell": ItemClassification.filler, + "Space Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 3 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 4 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Pumpkin Zone 2 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 3 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 4 Midway Bell": ItemClassification.filler, + "Mario Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Mario Zone 2 Midway Bell": ItemClassification.filler, + "Mario Zone 3 Midway Bell": ItemClassification.filler, + "Mario Zone 4 Midway Bell": ItemClassification.filler, + "Turtle Zone 1 Midway Bell": ItemClassification.filler, + "Turtle Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Turtle Zone 3 Midway Bell": ItemClassification.filler, + "Mario's Castle Midway Bell": ItemClassification.progression_skip_balancing, + "1 Coin": ItemClassification.filler, + **{f"{i} Coins": ItemClassification.filler for i in range(2, CoinsanityChecks.range_end + 1)} +} + +for level in {"Turtle Zone Secret Course", "Macro Zone Secret Course", "Turtle Zone 3", "Scenic Course", + "Mario Zone 2"}: + items[f"Cancel Auto Scroll - {level}"] = ItemClassification.useful diff --git a/worlds/marioland2/locations.py b/worlds/marioland2/locations.py new file mode 100644 index 0000000000..02ae1cca9d --- /dev/null +++ b/worlds/marioland2/locations.py @@ -0,0 +1,498 @@ +START_IDS = 1 + +locations = { + "Mushroom Zone - Normal Exit": {"id": 0x00, "ram_index": 0, "type": "level"}, + "Mushroom Zone - Midway Bell": {"id": 0x00, "ram_index": 0, "clear_condition": ("Mushroom Zone Midway Bell", 1), "type": "bell"}, + "Scenic Course - Normal Exit": {"id": 0x19, "ram_index": 40, "type": "level"}, + "Tree Zone 1 - Normal Exit": {"id": 0x01, "ram_index": 1, "clear_condition": ("Tree Zone Progression", 1), "type": "level"}, + "Tree Zone 1 - Midway Bell": {"id": 0x01, "ram_index": 1, "clear_condition": ("Tree Zone 1 Midway Bell", 1), "type": "bell"}, + "Tree Zone 2 - Normal Exit": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone Progression", 2), "type": "level"}, + "Tree Zone 2 - Secret Exit": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone Secret", 1), "type": "secret"}, + "Tree Zone 2 - Midway Bell": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone 2 Midway Bell", 1), "type": "bell"}, + "Tree Zone 3 - Normal Exit": {"id": 0x04, "ram_index": 4, "clear_condition": ("Tree Zone Progression", 3), "type": "level"}, + "Tree Zone 4 - Normal Exit": {"id": 0x03, "ram_index": 3, "clear_condition": ("Tree Zone Progression", 3), "type": "level"}, + "Tree Zone 4 - Midway Bell": {"id": 0x03, "ram_index": 3, "clear_condition": ("Tree Zone 4 Midway Bell", 1), "type": "bell"}, + "Tree Zone 5 - Boss": {"id": 0x05, "ram_index": 5, "clear_condition": ("Tree Coin", 1), "type": "level"}, + "Tree Zone 5 - Midway Bell": {"id": 0x05, "ram_index": 5, "clear_condition": ("Tree Zone 5 Midway Bell", 1), "type": "bell"}, + "Tree Zone Secret Course - Normal Exit": {"id": 0x1D, "ram_index": 36, "type": "level"}, + "Hippo Zone - Normal or Secret Exit": {"id": 0x11, "ram_index": 31, "type": "level"}, + "Space Zone 1 - Normal Exit": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone Progression", 1), "type": "level"}, + "Space Zone 1 - Secret Exit": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone Secret", 1), "type": "secret"}, + "Space Zone 1 - Midway Bell": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone 1 Midway Bell", 1), "type": "bell"}, + "Space Zone Secret Course - Normal Exit": {"id": 0x1C, "ram_index": 41, "type": "level"}, + "Space Zone 2 - Boss": {"id": 0x13, "ram_index": 17, "clear_condition": ("Space Coin", 1), "type": "level"}, + "Space Zone 2 - Midway Bell": {"id": 0x13, "ram_index": 17, "clear_condition": ("Space Zone 2 Midway Bell", 1), "type": "bell"}, + "Macro Zone 1 - Normal Exit": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone Progression", 1), "type": "level"}, + "Macro Zone 1 - Secret Exit": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone Secret 1", 1), "type": "secret"}, + "Macro Zone 1 - Midway Bell": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone 1 Midway Bell", 1), "type": "bell"}, + "Macro Zone 2 - Normal Exit": {"id": 0x15, "ram_index": 12, "clear_condition": ("Macro Zone Progression", 2), "type": "level"}, + "Macro Zone 2 - Midway Bell": {"id": 0x15, "ram_index": 12, "clear_condition": ("Macro Zone 2 Midway Bell", 1), "type": "bell"}, + "Macro Zone 3 - Normal Exit": {"id": 0x16, "ram_index": 13, "clear_condition": ("Macro Zone Progression", 3), "type": "level"}, + "Macro Zone 3 - Midway Bell": {"id": 0x16, "ram_index": 13, "clear_condition": ("Macro Zone 3 Midway Bell", 1), "type": "bell"}, + "Macro Zone 4 - Boss": {"id": 0x17, "ram_index": 14, "clear_condition": ("Macro Coin", 1), "type": "level"}, + "Macro Zone 4 - Midway Bell": {"id": 0x17, "ram_index": 14, "clear_condition": ("Macro Zone 4 Midway Bell", 1), "type": "bell"}, + "Macro Zone Secret Course - Normal Exit": {"id": 0x1E, "ram_index": 35, "clear_condition": ("Macro Zone Secret 2", 1), "type": "level"}, + "Pumpkin Zone 1 - Normal Exit": {"id": 0x06, "ram_index": 6, "clear_condition": ("Pumpkin Zone Progression", 1), "type": "level"}, + "Pumpkin Zone 1 - Midway Bell": {"id": 0x06, "ram_index": 6, "clear_condition": ("Pumpkin Zone 1 Midway Bell", 1), "type": "bell"}, + "Pumpkin Zone 2 - Normal Exit": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone Progression", 2), "type": "level"}, + "Pumpkin Zone 2 - Secret Exit": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone Secret 1", 1), "type": "secret"}, + "Pumpkin Zone 2 - Midway Bell": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone 2 Midway Bell", 2), "type": "bell"}, + "Pumpkin Zone 3 - Normal Exit": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone Progression", 3), "type": "level"}, + "Pumpkin Zone 3 - Secret Exit": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone Secret 2", 1), "type": "secret"}, + "Pumpkin Zone 3 - Midway Bell": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone 3 Midway Bell", 3), "type": "bell"}, + "Pumpkin Zone 4 - Boss": {"id": 0x09, "ram_index": 9, "clear_condition": ("Pumpkin Coin", 1), "type": "level"}, + "Pumpkin Zone 4 - Midway Bell": {"id": 0x09, "ram_index": 9, "clear_condition": ("Pumpkin Zone 4 Midway Bell", 1), "type": "bell"}, + "Pumpkin Zone Secret Course 1 - Normal Exit": {"id": 0x1B, "ram_index": 38, "type": "level"}, + "Pumpkin Zone Secret Course 2 - Normal Exit": {"id": 0x1F, "ram_index": 39, "type": "level"}, + "Mario Zone 1 - Normal Exit": {"id": 0x0A, "ram_index": 26, "clear_condition": ("Mario Zone Progression", 1), "type": "level"}, + "Mario Zone 1 - Midway Bell": {"id": 0x0A, "ram_index": 26, "clear_condition": ("Mario Zone 1 Midway Bell", 1), "type": "bell"}, + "Mario Zone 2 - Normal Exit": {"id": 0x0B, "ram_index": 27, "clear_condition": ("Mario Zone Progression", 2), "type": "level"}, + "Mario Zone 2 - Midway Bell": {"id": 0x0B, "ram_index": 27, "clear_condition": ("Mario Zone 2 Midway Bell", 1), "type": "bell"}, + "Mario Zone 3 - Normal Exit": {"id": 0x0C, "ram_index": 28, "clear_condition": ("Mario Zone Progression", 3), "type": "level"}, + "Mario Zone 3 - Midway Bell": {"id": 0x0C, "ram_index": 28, "clear_condition": ("Mario Zone 3 Midway Bell", 1), "type": "bell"}, + "Mario Zone 4 - Boss": {"id": 0x0D, "ram_index": 29, "clear_condition": ("Mario Coin", 1), "type": "level"}, + "Mario Zone 4 - Midway Bell": {"id": 0x0D, "ram_index": 29, "clear_condition": ("Mario Zone 4 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 1 - Normal Exit": {"id": 0x0E, "ram_index": 21, "clear_condition": ("Turtle Zone Progression", 1), "type": "level"}, + "Turtle Zone 1 - Midway Bell": {"id": 0x0E, "ram_index": 21, "clear_condition": ("Turtle Zone 1 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 2 - Normal Exit": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone Progression", 2), "type": "level"}, + "Turtle Zone 2 - Secret Exit": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone Secret", 1), "type": "secret"}, + "Turtle Zone 2 - Midway Bell": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone 2 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 3 - Boss": {"id": 0x10, "ram_index": 23, "clear_condition": ("Turtle Coin", 1), "type": "level"}, + "Turtle Zone 3 - Midway Bell": {"id": 0x10, "ram_index": 23, "clear_condition": ("Turtle Zone 3 Midway Bell", 1), "type": "bell"}, + "Turtle Zone Secret Course - Normal Exit": {"id": 0x1A, "ram_index": 37, "type": "level"}, + "Mario's Castle - Midway Bell": {"id": 24, "ram_index": 24, "clear_condition": ("Mario's Castle Midway Bell", 1), "type": "bell"}, +} + + +coins_coords = { + "Mushroom Zone": + [(22, 28), (24, 28), (42, 28), (43, 28), (74, 36), (74, 37), (74, 38), (76, 36), (76, 37), + (76, 38), (78, 36), (78, 37), (78, 38), (80, 36), (80, 37), (80, 38), (82, 36), (82, 37), + (82, 38), (83, 25), (84, 25), (84, 36), (84, 37), (84, 38), (85, 25), (86, 25), (86, 36), + (86, 37), (86, 38), (87, 25), (88, 36), (88, 37), (88, 38), (116, 24), (117, 24), (118, 24), + (151, 28), (152, 28), (180, 28), (181, 24), (181, 28), (182, 24), (182, 28), (183, 24), (183, 28), + (184, 24), (184, 28), (185, 24), (185, 28), (186, 24), (186, 28), (187, 24), (187, 28), (188, 24), + (188, 28), (189, 28), (211, 25), (212, 25), (212, 36), (212, 37), (212, 38), (212, 39), (213, 25), + (213, 36), (213, 37), (213, 38), (213, 39), (214, 25), (214, 36), (214, 37), (214, 38), (214, 39), + (215, 25), (216, 25), (217, 25), (217, 36), (217, 37), (217, 38), (217, 39), (218, 25), (218, 36), + (218, 37), (218, 38), (218, 39), (219, 25), (219, 36), (219, 37), (219, 38), (219, 39), (220, 25), + (231, 24), (232, 24)], + "Tree Zone 1": + [(27, 30), (28, 30), (29, 30), (33, 27), (34, 27), (35, 27), (40, 30), (41, 30), (42, 30), (47, 27), + (48, 27), (49, 27), (56, 30), (57, 30), (58, 30), (64, 30), (65, 30), (66, 30), (88, 30), (89, 30), + (90, 30), (94, 30), (95, 30), (96, 30), (100, 30), (101, 30), (102, 30), (106, 27), (107, 27), + (108, 27), (112, 30), (113, 30), (114, 30), (119, 28), (138, 30), (139, 30), (140, 30), (150, 28), + (151, 20), (151, 28), (152, 20), (152, 26), (152, 28), (153, 26), (153, 28), (154, 26), (154, 28), + (155, 26), (155, 28), (156, 26), (156, 28), (157, 20), (157, 26), (157, 28), (158, 20), (158, 26), + (158, 28), (159, 26), (159, 28), (160, 28), (161, 28), (176, 13), (177, 13), (177, 29), (178, 13), + (178, 29), (179, 13), (179, 29), (180, 13), (181, 13), (182, 13), (183, 13), (184, 13), (185, 13), + (186, 13), (187, 13), (187, 29), (188, 13), (188, 29), (189, 13), (189, 29), (190, 13), (191, 13), + (192, 13), (193, 13), (194, 13), (195, 13), (196, 13), (197, 13), (197, 29), (198, 13), (198, 29), + (199, 13), (199, 29), (200, 13), (201, 13), (202, 13), (203, 13), (204, 13), (205, 13), (206, 13), + (207, 27), (208, 13), (208, 27), (209, 14), (209, 27), (210, 10), (210, 11), (210, 12), (210, 13), + (210, 14), (210, 15), (211, 14), (212, 13), (219, 30), (220, 30), (221, 30), (229, 27), (230, 27), + (231, 27)], + "Tree Zone 2": + [(27, 11), (28, 11), (42, 10), (43, 10), (44, 10), (51, 28), (61, 9), (65, 26), (66, 26), (67, 26), + (70, 24), (71, 24), (72, 10), (72, 24), (73, 10), (73, 24), (75, 10), (76, 10), (76, 26), (77, 26), + (78, 10), (78, 26), (79, 10), (80, 24), (81, 10), (81, 24), (82, 10), (82, 24), (83, 24), (127, 7), + (128, 7), (129, 7), (130, 7), (136, 43), (138, 9), (138, 10), (138, 11), (139, 41), (140, 41), + (141, 41), (142, 9), (142, 10), (142, 11), (144, 41), (145, 41), (146, 9), (146, 10), (146, 11), + (146, 41), (149, 41), (150, 41), (151, 41), (154, 41), (155, 41), (156, 41), (159, 41), (160, 41), + (161, 41), (164, 41), (165, 41), (166, 41), (169, 41), (170, 41), (171, 41), (174, 41), (175, 41), + (176, 41), (182, 3), (188, 42), (188, 43), (188, 44), (189, 42), (189, 43), (189, 44), (190, 42), + (190, 43), (190, 44), (191, 42), (191, 43), (191, 44), (192, 42), (192, 43), (192, 44), (193, 42), + (193, 43), (193, 44), (213, 8), (213, 9), (213, 10), (213, 11), (213, 12), (213, 13), (213, 14), + (213, 15), (213, 16), (213, 17), (213, 18), (213, 19), (213, 20), (213, 21), (213, 22), (213, 23), + (213, 24), (213, 25)], + "Tree Zone Secret Course": + [(10, 24), (11, 24), (12, 24), (17, 23), (39, 24), (40, 24), (41, 24), (42, 24), (45, 24), + (46, 24), (47, 24), (48, 24), (51, 25), (52, 25), (53, 25), (54, 25), (58, 26), (59, 26), + (60, 26), (61, 24), (61, 25), (62, 24), (62, 25), (63, 24), (63, 25), (64, 24), (64, 25), + (67, 25), (68, 26), (69, 27), (70, 27), (73, 26), (74, 27), (75, 27), (76, 27), (80, 23), + (80, 24), (81, 23), (81, 24), (82, 23), (82, 24), (83, 23), (83, 24), (87, 25), (88, 24), + (89, 24), (90, 25), (91, 26), (100, 23), (114, 27), (114, 28), (115, 27), (115, 28), (116, 27), + (116, 28), (117, 27), (117, 28), (118, 27), (118, 28), (119, 27), (119, 28), (120, 27), + (120, 28), (121, 27), (121, 28), (128, 27), (128, 28), (131, 27), (131, 28), (134, 27), + (134, 28), (137, 27), (137, 28), (138, 27), (138, 28), (143, 27), (143, 28), (159, 23)], + "Tree Zone 4": + [(22, 10), (24, 12), (26, 10), (28, 27), (29, 11), (30, 11), (31, 11), (32, 11), (33, 11), (34, 11), + (35, 11), (37, 10), (38, 12), (41, 11), (43, 12), (61, 11), (70, 11), (79, 11), (89, 11), (103, 22), + (103, 25), (103, 28), (105, 22), (105, 25), (105, 28), (107, 22), (107, 25), (107, 28), (109, 22), + (109, 25), (109, 28), (111, 22), (111, 25), (111, 28), (113, 22), (113, 25), (113, 28), (115, 22), + (115, 25), (115, 28), (117, 22), (117, 25), (117, 28), (122, 22), (122, 25), (122, 28), (124, 22), + (124, 25), (124, 28), (126, 22), (126, 25), (126, 28), (128, 22), (128, 25), (128, 28), (130, 22), + (130, 25), (130, 28), (132, 22), (132, 25), (132, 28), (134, 22), (134, 25), (134, 28), (136, 22), + (136, 25), (136, 28), (171, 10), (196, 26), (196, 29), (197, 26), (197, 29), (198, 26), (198, 29), + (199, 26), (199, 29), (200, 26), (200, 29)], + "Tree Zone 3": + [(18, 11), (18, 12), (19, 11), (19, 12), (20, 11), (20, 12), (21, 11), (21, 12), (22, 11), (22, 12), + (26, 40), (27, 11), (27, 12), (28, 11), (28, 12), (29, 11), (29, 12), (30, 11), (30, 12), (31, 11), + (31, 12), (48, 41), (49, 41), (50, 41), (51, 41), (61, 25), (77, 24)], + "Tree Zone 5": + [(23, 41), (84, 39), (85, 39), (116, 42), (123, 39), (132, 39), (134, 36), (134, 39), (134, 43), + (134, 44), (135, 43), (135, 44), (136, 36), (136, 39), (136, 43), (136, 44), (137, 43), (137, 44), + (138, 36), (138, 39), (138, 43), (138, 44), (139, 43), (139, 44), (140, 36), (140, 39), (140, 43), + (140, 44), (141, 43), (141, 44), (142, 36), (142, 39), (142, 43), (142, 44), (144, 36), (144, 39), + (146, 36), (146, 39)], + "Scenic Course": + [(24, 28), (39, 28), (54, 28), (72, 28), (87, 28), (103, 28), (117, 28)], + "Hippo Zone": + [(2, 20), (3, 3), (15, 26), (16, 26), (17, 26), (28, 4), (28, 7), (28, 10), (28, 13), (29, 4), + (29, 7), (29, 10), (29, 13), (29, 21), (30, 4), (30, 7), (30, 10), (30, 13), (32, 15), (33, 15), + (34, 15), (35, 15), (36, 15), (37, 15), (41, 12), (41, 13), (42, 11), (43, 10), (44, 10), (45, 10), + (46, 11), (47, 12), (47, 13), (48, 14), (49, 15), (50, 15), (51, 15), (52, 14), (53, 12), (53, 13), + (54, 11), (55, 10), (56, 10), (57, 10), (58, 11), (59, 12), (59, 13), (60, 14), (61, 15), (62, 15), + (63, 15), (64, 14), (65, 12), (65, 13), (66, 11), (67, 10), (68, 10), (69, 10), (70, 11), (71, 12), + (71, 13), (72, 14), (73, 15), (74, 15), (75, 15), (76, 14), (77, 12), (77, 13), (84, 11), (85, 11), + (85, 22), (86, 22), (91, 6), (92, 6), (92, 11), (93, 6), (93, 11), (94, 11), (95, 16), (96, 12), + (96, 16), (97, 8), (97, 12), (97, 16), (98, 8), (98, 12), (99, 8), (112, 6), (112, 7), (112, 12), + (112, 13), (113, 2), (113, 5), (113, 8), (113, 11), (113, 14), (113, 17), (114, 2), (114, 5), + (114, 8), (114, 11), (114, 14), (114, 17), (115, 3), (115, 4), (115, 9), (115, 10), (115, 15), + (115, 16), (124, 3), (124, 4), (124, 9), (124, 10), (124, 15), (124, 16), (125, 2), (125, 5), + (125, 8), (125, 11), (125, 14), (125, 17), (126, 2), (126, 5), (126, 8), (126, 11), (126, 14), + (126, 17), (127, 6), (127, 7), (127, 12), (127, 13), (129, 13), (130, 13), (131, 13), (132, 13), + (132, 22), (133, 13), (134, 13), (135, 13), (136, 13), (136, 21), (137, 13), (138, 13), (139, 13), + (139, 22), (140, 13), (141, 13), (142, 13), (154, 7), (155, 7), (156, 7), (157, 10), (158, 10), + (159, 10), (162, 15), (162, 16), (162, 17), (164, 15), (164, 16), (164, 17), (166, 15), (166, 16), + (166, 17), (168, 15), (168, 16), (168, 17), (170, 15), (170, 16), (170, 17), (172, 15), (172, 16), + (172, 17), (174, 15), (174, 16), (174, 17), (176, 15), (176, 16), (176, 17)], + "Space Zone 1": + [(38, 26), (45, 25), (46, 25), (47, 25), (57, 24), (58, 24), (59, 24), (60, 19), (60, 23), (61, 23), + (62, 23), (63, 23), (75, 24), (89, 16), (89, 17), (89, 18), (89, 19), (90, 16), (90, 17), (90, 18), + (90, 19), (91, 16), (91, 17), (91, 18), (91, 19), (92, 16), (92, 17), (92, 18), (92, 19), (93, 16), + (93, 17), (93, 18), (93, 19), (104, 22), (105, 22), (114, 22), (115, 22), (125, 10), (126, 9), + (127, 8), (128, 8), (129, 8), (130, 8), (131, 8), (132, 9), (133, 10), (136, 10), (137, 9), + (138, 8), (139, 8), (140, 8), (141, 8), (142, 8), (143, 9), (144, 10), (147, 10), (148, 9), + (149, 8), (150, 8), (151, 8), (152, 8), (153, 8), (154, 9), (155, 10), (155, 18), (155, 19), + (155, 20), (156, 17), (156, 18), (156, 19), (156, 20), (156, 21), (157, 16), (157, 17), (157, 18), + (157, 19), (157, 20), (157, 21), (157, 22), (158, 10), (158, 16), (158, 17), (158, 18), (158, 19), + (158, 20), (158, 21), (158, 22), (159, 9), (159, 16), (159, 17), (159, 18), (159, 19), (159, 20), + (159, 21), (159, 22), (160, 8), (160, 16), (160, 17), (160, 18), (160, 19), (160, 20), (160, 21), + (160, 22), (161, 8), (161, 16), (161, 17), (161, 18), (161, 19), (161, 20), (161, 21), (161, 22), + (162, 8), (162, 17), (162, 18), (162, 19), (162, 20), (162, 21), (163, 8), (163, 18), (163, 19), + (163, 20), (164, 8), (165, 9), (166, 10), (168, 10), (169, 9), (170, 8), (171, 8), (172, 8), + (173, 8), (174, 8), (175, 9), (176, 10)], + "Space Zone Secret Course": + [(16, 22), (16, 23), (16, 24), (18, 21), (18, 22), (18, 23), (20, 21), (20, 22), (20, 23), + (22, 20), (22, 21), (22, 22), (24, 19), (24, 20), (24, 21), (26, 18), (26, 19), (26, 20), + (28, 18), (28, 19), (28, 20), (30, 17), (30, 18), (30, 19), (36, 15), (36, 16), (36, 17), + (38, 14), (38, 15), (38, 16), (40, 13), (40, 14), (40, 15), (40, 24), (41, 24), (42, 13), + (42, 14), (42, 15), (44, 12), (44, 13), (44, 14), (46, 12), (46, 13), (46, 14), (48, 12), + (48, 13), (48, 14), (50, 11), (50, 12), (50, 13), (50, 27), (51, 27), (52, 10), (52, 11), + (52, 12), (52, 27), (53, 27), (54, 27), (58, 11), (58, 12), (58, 13), (60, 12), (60, 13), + (60, 14), (62, 12), (62, 13), (62, 14), (64, 12), (64, 13), (64, 14), (66, 13), (66, 14), + (66, 15), (68, 13), (68, 14), (68, 15), (70, 14), (70, 15), (70, 16), (72, 15), (72, 16), + (72, 17), (74, 16), (74, 17), (74, 18), (80, 18), (80, 19), (80, 20), (82, 19), (82, 20), + (82, 21), (84, 19), (84, 20), (84, 21), (86, 20), (86, 21), (86, 22), (88, 21), (88, 22), + (88, 23)], + "Space Zone 2": + [(11, 13), (12, 13), (13, 13), (20, 8), (21, 8), (22, 8), (25, 5), (26, 5), (27, 5), (33, 6), + (34, 6), (35, 6), (36, 10), (37, 10), (38, 10), (45, 7), (46, 7), (47, 7), (59, 5), (60, 5), + (61, 5), (64, 3), (93, 8), (94, 8), (95, 8), (96, 11), (97, 11), (98, 11), (100, 6), (101, 6), + (102, 6), (102, 8), (120, 5), (124, 12), (124, 13), (125, 12), (125, 13), (126, 12), (126, 13), + (127, 3), (127, 12), (127, 13), (128, 3), (128, 7), (129, 3), (129, 7), (130, 7), (148, 6), + (148, 7), (148, 8), (149, 5), (149, 6), (149, 7), (149, 8), (149, 9), (150, 5), (150, 6), (150, 7), + (150, 8), (150, 9), (151, 5), (151, 6), (151, 7), (151, 8), (151, 9), (152, 5), (152, 6), (152, 7), + (152, 8), (152, 9), (153, 6), (153, 7), (153, 8), (165, 7), (165, 8), (166, 7), (166, 8), (167, 7), + (167, 8), (168, 7), (168, 8), (169, 7), (169, 8), (170, 7), (170, 8), (171, 7), (171, 8), (181, 9), + (185, 4), (200, 3), (200, 6), (200, 9), (201, 3), (201, 6), (201, 9), (202, 3), (202, 6), (202, 9), + (203, 3), (203, 6), (203, 9), (204, 3), (204, 6), (204, 9), (205, 3), (205, 6), (205, 9), (206, 3), + (206, 6), (206, 9), (207, 3), (207, 6), (207, 9), (208, 3), (208, 6), (208, 9), (209, 3), (209, 6), + (209, 9), (210, 3), (210, 6), (210, 9), (230, 12), (231, 12), (232, 12), (236, 2), (236, 3), + (236, 4), (236, 5), (237, 2), (237, 3), (237, 4), (237, 5), (238, 2), (238, 3), (238, 4), (238, 5), + (248, 10)], + "Turtle Zone 1": + [(22, 34), (27, 37), (28, 37), (29, 37), (30, 37), (31, 37), (32, 37), (33, 37), (34, 37), + (35, 37), (36, 37), (46, 32), (46, 33), (47, 32), (47, 33), (50, 32), (50, 33), (51, 32), + (51, 33), (54, 32), (54, 33), (55, 32), (55, 33), (56, 33), (57, 33), (58, 32), (58, 33), + (59, 32), (59, 33), (62, 32), (62, 33), (63, 32), (63, 33), (66, 32), (66, 33), (67, 32), + (67, 33), (73, 43), (74, 43), (75, 43), (77, 41), (78, 41), (79, 41), (81, 40), (82, 40), + (83, 40), (85, 41), (86, 41), (87, 41), (122, 36), (123, 36), (124, 36), (125, 36), (126, 36), + (127, 36), (130, 36), (131, 36), (132, 36), (133, 36), (134, 36), (135, 36), (136, 36), (137, 36), + (138, 36), (139, 36), (140, 36), (141, 36), (143, 34), (163, 36), (164, 36), (166, 36), (167, 36), + (169, 36), (170, 36), (180, 37), (181, 37), (182, 37), (183, 37), (184, 37), (185, 37), (188, 44), + (189, 44)], + "Turtle Zone 2": + [(6, 34), (11, 34), (15, 43), (48, 36), (51, 28), (56, 35), (57, 35), (59, 42), (61, 20), (62, 20), + (62, 35), (63, 20), (63, 35), (64, 20), (65, 20), (67, 35), (68, 35), (72, 39), (79, 34), + (82, 35), (87, 42), (96, 43), (105, 43), (107, 43), (109, 43), (118, 28), (121, 28), (139, 39), + (142, 39)], + "Turtle Zone Secret Course": + [(19, 27), (39, 27), (39, 28), (40, 26), (40, 27), (41, 25), (41, 27), (42, 25), (42, 27), + (43, 26), (43, 27), (44, 27), (44, 28), (48, 25), (48, 26), (48, 27), (48, 28), (49, 25), + (49, 27), (50, 25), (50, 27), (51, 25), (51, 27), (52, 26), (52, 28), (53, 27), (61, 25), + (61, 28), (62, 25), (62, 26), (62, 27), (62, 28), (63, 25), (63, 28), (64, 26), (73, 26), + (73, 27), (74, 25), (74, 28), (75, 25), (75, 28), (76, 25), (76, 28), (77, 26), (77, 27), + (82, 25), (82, 26), (82, 27), (82, 28), (83, 28), (84, 28), (85, 28), (87, 27), (89, 27), + (89, 28), (90, 26), (90, 27), (91, 25), (91, 27), (92, 25), (92, 27), (93, 26), (93, 27), + (94, 27), (94, 28), (98, 24), (98, 25), (98, 26), (98, 27), (99, 25), (100, 26), (101, 27), + (102, 24), (102, 25), (102, 26), (102, 27), (108, 24), (108, 25), (108, 26), (108, 27), + (109, 24), (109, 27), (110, 24), (110, 27), (111, 24), (111, 27), (112, 25), (112, 26), + (116, 24), (116, 27), (117, 23), (117, 26), (117, 27), (118, 23), (118, 25), (118, 27), + (119, 23), (119, 25), (119, 27), (120, 24), (120, 27), (121, 28), (122, 28), (123, 28)], + "Turtle Zone 3": + [(16, 25), (17, 25), (18, 25), (19, 25), (20, 25), (21, 25), (22, 25), (23, 25), (24, 25), + (35, 24), (36, 24), (37, 24), (38, 24), (39, 24), (40, 24), (41, 24), (42, 24), (43, 24), + (75, 28), (75, 29), (76, 28), (76, 29), (81, 28), (81, 29), (82, 28), (82, 29), (92, 26), + (93, 26), (94, 26), (98, 26), (99, 26), (100, 26), (123, 26), (124, 26), (126, 26), (127, 26), + (129, 26), (130, 26), (146, 22), (146, 29), (147, 22), (147, 29), (148, 22), (150, 22), (151, 22), + (152, 23), (152, 29), (153, 29), (154, 22), (155, 22), (156, 22), (158, 29), (159, 29), (161, 22), + (162, 22), (163, 22), (165, 22), (166, 22), (167, 22), (169, 22), (170, 22), (171, 22)], + "Mario Zone 1": + [(18, 44), (47, 36), (47, 37), (47, 38), (47, 39), (49, 36), (49, 37), (49, 38), (50, 36), (50, 37), + (50, 38), (52, 36), (52, 37), (52, 38), (53, 36), (53, 37), (53, 38), (60, 35), (60, 36), (60, 37), + (61, 35), (61, 36), (61, 37), (64, 35), (64, 36), (64, 37), (65, 35), (65, 36), (65, 37), (71, 36), + (78, 36), (78, 37), (78, 38), (98, 38), (145, 42), (146, 22), (146, 23), (146, 25), (146, 26), + (146, 42), (147, 22), (147, 23), (147, 25), (147, 26), (147, 30), (147, 31), (147, 32), (147, 42), + (148, 22), (148, 23), (148, 25), (148, 30), (148, 31), (148, 32), (148, 42), (149, 21), (149, 22), + (149, 23), (149, 24), (149, 30), (149, 31), (149, 42), (150, 21), (150, 22), (150, 23), (150, 24), + (150, 26), (150, 27), (150, 28), (150, 30), (150, 31), (150, 42), (151, 27), (151, 28), (151, 30), + (151, 31), (151, 42), (152, 27), (152, 29), (152, 30), (152, 31), (152, 42), (153, 27), (153, 29), + (153, 30), (153, 42), (154, 27), (154, 29), (154, 30), (164, 20), (167, 21), (167, 26), (167, 34), + (168, 21), (168, 25), (168, 27), (168, 33), (168, 35), (169, 20), (169, 24), (169, 28), (169, 33), + (169, 35), (170, 20), (170, 23), (170, 29), (170, 32), (170, 35), (171, 20), (171, 23), (171, 29), + (171, 32), (171, 36), (171, 37), (172, 21), (172, 22), (172, 30), (172, 31)], + "Mario Zone 2": + [(25, 24), (25, 27), (26, 24), (26, 27), (27, 24), (27, 27), (81, 27), (112, 24), (113, 24), + (114, 24), (115, 24), (116, 24), (117, 24), (118, 24), (121, 24), (122, 24), (123, 24), (124, 24), + (125, 24), (126, 24), (127, 24), (138, 26), (139, 26), (140, 24), (140, 28), (141, 24), (141, 28), + (144, 26), (145, 26), (146, 24), (146, 28), (147, 28), (151, 26), (152, 24), (152, 28), (153, 24), + (153, 28), (156, 26), (157, 26), (158, 24), (158, 28), (159, 24), (159, 28), (162, 26), (163, 26), + (164, 28), (165, 28)], + "Mario Zone 3": + [(8, 28), (11, 28), (14, 28), (17, 28), (20, 28), (23, 28), (54, 25), (100, 27), (109, 18), + (109, 19), (110, 18), (110, 19), (111, 17), (111, 18), (111, 19), (112, 17), (112, 18), (112, 19), + (127, 17), (127, 18), (127, 19), (128, 17), (128, 18), (128, 19), (129, 18), (129, 19), (130, 18), + (130, 19), (130, 20), (131, 18), (131, 19), (131, 20), (132, 18), (132, 19), (132, 20), (133, 18), + (133, 19), (133, 20), (133, 27), (134, 18), (134, 19), (134, 20), (157, 28), (158, 28), (159, 28), + (160, 28), (161, 28), (168, 28), (169, 28), (170, 28), (171, 28), (172, 28), (189, 44), (199, 28), + (200, 28), (201, 28), (202, 28), (203, 28), (214, 27), (217, 27), (220, 27), (223, 27)], + "Mario Zone 4": + [(20, 25), (114, 24), (114, 25), (114, 26), (115, 24), (115, 25), (115, 26), (115, 27), (115, 28), + (115, 29), (116, 24), (116, 25), (116, 26), (116, 27), (116, 29), (117, 24), (117, 25), (117, 26), + (117, 27), (117, 28), (117, 29), (118, 24), (118, 25), (118, 26), (118, 27), (118, 28), (118, 29), + (119, 24), (119, 25), (119, 27), (119, 28), (119, 29), (120, 24), (120, 25), (120, 26), (120, 27), + (120, 28), (120, 29), (121, 24), (121, 25), (121, 26), (121, 27), (121, 28), (121, 29), (122, 12), + (122, 24), (122, 25), (122, 26), (122, 27), (122, 29), (123, 12), (123, 24), (123, 25), (123, 26), + (123, 27), (123, 28), (123, 29), (124, 12), (124, 24), (124, 25), (124, 26), (124, 27), (124, 28), + (124, 29), (125, 12), (179, 12)], + "Pumpkin Zone 1": + [(23, 12), (55, 24), (55, 26), (56, 27), (57, 24), (57, 26), (63, 24), (63, 26), (64, 27), + (65, 24), (65, 26), (71, 24), (71, 26), (72, 27), (73, 24), (73, 26), (79, 24), (79, 26), + (80, 27), (81, 24), (81, 26), (86, 25), (86, 27), (92, 4), (93, 27), (95, 25), (95, 27), (98, 4), + (102, 26), (102, 28), (104, 4), (104, 26), (104, 28), (165, 14), (166, 15), (171, 20), (172, 21), + (173, 22), (175, 24), (176, 25), (177, 26), (179, 28), (180, 29), (189, 6)], + "Pumpkin Zone 2": + [(34, 26), (40, 21), (41, 21), (42, 21), (43, 21), (48, 20), (49, 20), (50, 20), (50, 41), + (51, 20), (51, 41), (52, 41), (53, 41), (54, 41), (56, 21), (57, 21), (58, 21), (59, 21), + (61, 41), (62, 41), (64, 20), (65, 20), (66, 20), (67, 20), (114, 36), (115, 35), (115, 36), + (116, 34), (116, 35), (116, 36), (132, 20), (132, 21), (132, 22), (132, 23), (132, 24), + (144, 23), (169, 27)], + "Pumpkin Zone 3": + [(18, 26), (20, 26), (22, 26), (24, 26), (26, 26), (31, 18), (32, 18), (33, 18), (34, 18), + (35, 18), (36, 18), (37, 18), (38, 18), (39, 18), (40, 18), (41, 18), (42, 18), (48, 24), + (52, 20), (52, 24), (56, 24), (87, 27), (88, 27), (89, 27), (90, 27), (94, 27), (95, 27), + (96, 27), (97, 27), (101, 27), (102, 27), (103, 27), (104, 27), (104, 42), (108, 27), (109, 27), + (110, 27), (111, 27), (115, 27), (116, 27), (117, 27), (118, 27), (134, 35), (134, 41), + (135, 35), (135, 41), (136, 35), (136, 41), (137, 35), (137, 41), (138, 35), (138, 41), + (139, 35), (139, 41), (140, 41), (225, 38), (226, 37), (227, 36), (227, 37), (227, 38), + (227, 39), (227, 40), (227, 41), (228, 37), (229, 38)], + "Pumpkin Zone Secret Course 1": + [(14, 15), (16, 9), (16, 10), (16, 11), (16, 12), (16, 13), (16, 14), (16, 15), (16, 16), + (17, 9), (17, 10), (17, 11), (17, 12), (17, 13), (17, 14), (17, 15), (17, 16), (18, 9), + (18, 10), (18, 11), (18, 12), (18, 13), (18, 14), (18, 15), (18, 16), (19, 9), (19, 10), + (19, 11), (19, 12), (19, 13), (19, 14), (19, 15), (19, 16), (20, 9), (20, 10), (20, 11), + (20, 12), (20, 13), (20, 14), (20, 15), (20, 16), (21, 9), (21, 10), (21, 11), (21, 12), + (21, 13), (21, 14), (21, 15), (21, 16), (22, 9), (22, 10), (22, 11), (22, 12), (22, 13), + (22, 14), (22, 15), (22, 16), (23, 9), (23, 10), (23, 11), (23, 12), (23, 13), (23, 14), + (23, 15), (23, 16), (24, 9), (24, 10), (24, 11), (24, 12), (24, 13), (24, 14), (24, 15), + (24, 16), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15), (25, 16), + (26, 9), (26, 10), (26, 11), (26, 12), (26, 13), (26, 14), (26, 15), (27, 16), (28, 9), + (28, 10), (28, 11), (28, 12), (28, 13), (28, 14), (28, 15), (28, 16), (29, 9), (29, 10), + (29, 11), (29, 12), (29, 13), (29, 14), (29, 15), (29, 16), (30, 9), (30, 10), (30, 11), + (30, 12), (30, 13), (30, 14), (30, 15), (30, 16), (31, 9), (31, 10), (31, 11), (31, 12), + (31, 13), (31, 14), (31, 15), (31, 16), (32, 9), (32, 10), (32, 11), (32, 12), (32, 13), + (32, 14), (32, 15), (32, 16), (33, 9), (33, 10), (33, 11), (33, 12), (33, 13), (33, 14), + (33, 15), (33, 16), (34, 9), (34, 10), (34, 11), (34, 12), (34, 13), (34, 14), (34, 15), + (34, 16), (35, 9), (35, 10), (35, 11), (35, 12), (35, 13), (35, 14), (35, 15), (35, 16), + (36, 9), (36, 10), (36, 11), (36, 12), (36, 13), (36, 14), (36, 15), (36, 16), (37, 9), + (37, 10), (37, 11), (37, 12), (37, 13), (37, 14), (37, 15), (37, 16), (39, 16), (40, 9), + (40, 10), (40, 11), (40, 12), (40, 13), (40, 14), (40, 15), (40, 16), (41, 9), (41, 10), + (41, 11), (41, 12), (41, 13), (41, 14), (41, 15), (41, 16), (42, 9), (42, 10), (42, 11), + (42, 12), (42, 13), (42, 14), (42, 15), (42, 16), (43, 9), (43, 10), (43, 11), (43, 12), + (43, 13), (43, 14), (43, 15), (43, 16), (44, 9), (44, 10), (44, 11), (44, 12), (44, 13), + (44, 14), (44, 15), (44, 16), (45, 9), (45, 10), (45, 11), (45, 12), (45, 13), (45, 14), + (45, 15), (45, 16), (46, 9), (46, 10), (46, 11), (46, 12), (46, 13), (46, 14), (46, 15), + (46, 16), (47, 9), (47, 10), (47, 11), (47, 12), (47, 13), (47, 14), (47, 15), (47, 16), + (48, 9), (48, 10), (48, 11), (48, 12), (48, 13), (48, 14), (48, 15), (48, 16), (49, 9), + (49, 10), (49, 11), (49, 12), (49, 13), (49, 14), (49, 15), (49, 16), (52, 9), (52, 10), + (52, 11), (52, 12), (52, 13), (52, 14), (52, 15), (52, 16), (53, 9), (53, 10), (53, 11), + (53, 12), (53, 13), (53, 14), (53, 15), (53, 16), (54, 9), (54, 10), (54, 11), (54, 12), + (54, 13), (54, 14), (54, 15), (54, 16), (55, 9), (55, 10), (55, 11), (55, 12), (55, 13), + (55, 14), (55, 15), (55, 16), (56, 9), (56, 10), (56, 11), (56, 12), (56, 13), (56, 14), + (56, 15), (56, 16), (57, 9), (57, 10), (57, 11), (57, 12), (57, 13), (57, 14), (57, 15), + (57, 16), (58, 9), (58, 10), (58, 11), (58, 12), (58, 13), (58, 14), (58, 15), (58, 16), + (59, 9), (59, 10), (59, 11), (59, 12), (59, 13), (59, 14), (59, 15), (59, 16), (60, 9), + (60, 10), (60, 11), (60, 12), (60, 13), (60, 14), (60, 15), (60, 16), (61, 9), (61, 10), + (61, 11), (61, 12), (61, 13), (61, 14), (61, 15), (61, 16), (64, 9), (64, 10), (64, 11), + (64, 12), (64, 13), (64, 14), (64, 15), (64, 16), (65, 9), (65, 10), (65, 11), (65, 12), + (65, 13), (65, 14), (65, 15), (65, 16), (66, 9), (66, 10), (66, 11), (66, 12), (66, 13), + (66, 14), (66, 15), (66, 16), (67, 9), (67, 10), (67, 11), (67, 12), (67, 13), (67, 14), + (67, 15), (67, 16), (68, 9), (68, 10), (68, 11), (68, 12), (68, 13), (68, 14), (68, 15), + (68, 16), (69, 9), (69, 10), (69, 11), (69, 12), (69, 13), (69, 14), (69, 15), (69, 16), + (70, 9), (70, 10), (70, 11), (70, 12), (70, 13), (70, 14), (70, 15), (70, 16), (71, 9), + (71, 10), (71, 11), (71, 12), (71, 13), (71, 14), (71, 15), (71, 16), (72, 9), (72, 10), + (72, 11), (72, 12), (72, 13), (72, 14), (72, 15), (72, 16), (73, 9), (73, 10), (73, 11), + (73, 12), (73, 13), (73, 14), (73, 15), (73, 16)], + "Pumpkin Zone Secret Course 2": + [(12, 6), (72, 7), (73, 7), (80, 7), (81, 7), (85, 8), (90, 10), (91, 10), (94, 10), + (95, 10), (98, 9), (99, 9), (102, 9), (103, 9)], + "Pumpkin Zone 4": + [(18, 28), (19, 28), (20, 28), (21, 28), (83, 37), (83, 38), (84, 37), (84, 38), (85, 37), + (85, 38), (85, 39), (86, 37), (87, 37), (87, 40), (88, 37), (88, 38), (88, 39), (88, 40), + (89, 37), (89, 38), (89, 39), (89, 40), (90, 37), (90, 38), (91, 37), (91, 38), (92, 37), + (92, 38), (92, 39), (92, 40), (93, 23), (93, 37), (93, 40), (94, 23), (94, 37), (94, 40), + (103, 23), (104, 23), (113, 23), (114, 23), (169, 30), (170, 28), (170, 30), (171, 26), + (171, 28), (171, 30), (172, 24), (172, 26), (172, 28), (172, 30), (173, 24), (173, 26), + (173, 28), (173, 30), (174, 26), (174, 28), (174, 30), (175, 28), (175, 30), (176, 30), + (198, 37), (198, 38), (199, 37), (199, 38), (204, 37), (204, 38), (205, 37), (205, 38), + (210, 37), (210, 38), (211, 37), (211, 38), (216, 37), (216, 38), (217, 37), (217, 38)], + "Macro Zone 1": + [(22, 32), (22, 33), (22, 34), (23, 20), (23, 21), (23, 22), (23, 38), (23, 39), (23, 40), (24, 26), + (24, 27), (24, 28), (39, 42), (40, 41), (41, 40), (42, 39), (49, 43), (62, 42), (62, 43), (62, 44), + (68, 42), (68, 43), (68, 44), (75, 42), (75, 43), (75, 44), (84, 40), (84, 41), (84, 42), (87, 39), + (89, 42), (89, 43), (89, 44), (107, 42), (108, 42), (109, 42), (118, 42), (119, 42), (120, 42), + (121, 42), (122, 42), (128, 42), (128, 43), (130, 42), (130, 43), (134, 42), (134, 43), (140, 42), + (141, 42), (142, 42), (143, 42), (144, 42), (154, 42), (155, 42), (156, 42), (163, 22), (163, 23), + (164, 21), (164, 22), (164, 23), (165, 22), (165, 23), (166, 21), (166, 22), (166, 23), (167, 22), + (167, 23), (168, 21), (168, 22), (168, 23), (169, 22), (169, 23), (170, 21), (170, 22), (170, 23), + (171, 22), (171, 23), (177, 40), (182, 40), (189, 41), (189, 42), (189, 43), (189, 44), (189, 45), + (205, 46), (206, 46), (208, 37), (209, 37), (212, 41), (213, 41), (214, 41), (215, 41), (216, 41), + (220, 37), (221, 37), (224, 46), (225, 46), (234, 43), (246, 38), (246, 39), (246, 40), (246, 41), + (246, 42), (246, 43)], + "Macro Zone 2": + [(18, 28), (19, 27), (22, 28), (23, 27), (25, 26), (27, 27), (28, 27), (31, 27), (32, 27), (41, 29), + (42, 29), (43, 29), (55, 29), (57, 29), (60, 29), (62, 29), (69, 27), (70, 27), (71, 27), (74, 27), + (75, 27), (76, 27), (79, 27), (80, 27), (81, 27), (84, 27), (85, 27), (86, 27), (99, 40), + (137, 37), (180, 40), (181, 8), (182, 8), (183, 8), (184, 8), (185, 8), (186, 8), (187, 8), + (188, 8), (189, 8), (190, 8), (191, 8), (192, 8), (193, 8), (194, 8), (195, 8), (196, 8), (197, 8), + (198, 8), (199, 8), (200, 8), (201, 8), (202, 8), (204, 8), (205, 8), (206, 8), (207, 8), (208, 8), + (209, 8), (210, 8), (211, 8), (212, 8), (213, 8), (215, 8), (216, 8), (217, 8), (217, 11), + (218, 8), (218, 9), (218, 10), (218, 11), (218, 12), (219, 11)], + "Macro Zone 3": + [(24, 23), (37, 28), (38, 28), (39, 28), (40, 28), (57, 30), (58, 30), (59, 30), (65, 17), (65, 18), + (65, 19), (66, 17), (66, 18), (66, 19), (67, 17), (67, 18), (67, 19), (68, 17), (68, 18), (68, 19), + (69, 17), (69, 18), (69, 19), (70, 17), (70, 18), (70, 19), (73, 17), (73, 18), (73, 19), (74, 17), + (74, 18), (74, 19), (75, 17), (75, 18), (75, 19), (76, 17), (76, 18), (76, 19), (77, 17), (77, 18), + (77, 19), (78, 17), (78, 18), (78, 19), (85, 43), (95, 17), (95, 18), (95, 19), (95, 20), (96, 17), + (96, 18), (96, 19), (96, 20), (97, 17), (97, 18), (97, 19), (97, 20), (98, 17), (98, 18), (98, 19), + (98, 20), (100, 17), (100, 18), (100, 19), (100, 20), (101, 17), (101, 18), (101, 19), (101, 20), + (103, 42), (104, 42), (105, 42), (106, 42), (107, 42), (116, 42), (117, 42), (118, 42), (119, 42), + (120, 42), (121, 42), (122, 42), (129, 19), (131, 42), (132, 42), (133, 42), (134, 42), (135, 42), + (136, 42), (165, 21), (165, 22), (166, 21), (166, 22), (171, 21), (171, 22), (172, 21), (172, 22), + (176, 20), (176, 21), (176, 22), (179, 20), (179, 21), (179, 22), (183, 21), (183, 22), (184, 21), + (184, 22), (194, 27), (194, 28), (197, 27), (197, 28), (200, 27), (200, 28), (203, 25), (203, 27), + (203, 28), (205, 18), (205, 19), (206, 18), (206, 19)], + "Macro Zone 4": + [(16, 28), (34, 28), (39, 28), (39, 29), (39, 30), (40, 28), (40, 29), (40, 30), (41, 28), (41, 29), + (41, 30), (62, 29), (63, 29), (64, 29), (65, 29), (66, 29), (67, 29), (68, 29), (69, 29), (81, 17), + (81, 18), (82, 17), (82, 18), (83, 17), (83, 18), (84, 17), (84, 18), (85, 17), (85, 18), (86, 17), + (86, 18), (87, 17), (87, 18), (87, 28), (88, 17), (88, 18), (114, 28), (144, 22), (146, 27), + (146, 28), (147, 27), (147, 28), (148, 27), (148, 28), (149, 27), (149, 28), (150, 27), (150, 28), + (151, 27), (151, 28), (152, 27), (152, 28), (153, 27), (153, 28), (154, 27), (154, 28), (155, 27), + (155, 28), (156, 27), (156, 28), (157, 27), (157, 28), (158, 27), (158, 28)], + "Macro Zone Secret Course": + [(21, 24), (70, 27), (70, 28), (71, 27), (71, 28), (72, 27), (72, 28), (73, 27), (73, 28), + (74, 27), (74, 28), (75, 27), (75, 28), (76, 24), (76, 25), (76, 26), (76, 27), (76, 28), + (77, 24), (77, 25), (77, 26), (77, 27), (77, 28), (78, 24), (78, 25), (78, 26), (78, 27), + (78, 28), (79, 24), (79, 25), (79, 26), (79, 27), (80, 25), (80, 26), (81, 25), (81, 26), + (88, 25), (108, 30)], + "Mario's Castle": + [(7, 25), (160, 44), (167, 28), (247, 26)], +} +powerup_coords = { + "Mushroom Zone": [(42, 28), (151, 28), (152, 28), (188, 28)], + "Scenic Course": [(39, 28), (72, 28), (117, 28)], + "Tree Zone 1": [(119, 28), (152, 28)], + "Tree Zone 2": [(43, 10), (61, 9), (51, 28), (130, 7), (182, 3), (136, 43)], + "Tree Zone Secret Course": [(17, 23), (100, 23), (159, 23)], + "Tree Zone 3": [(26, 40), (77, 24)], + "Tree Zone 4": [(28, 27), (105, 25), (136, 22), (171, 10)], + "Tree Zone 5": [(123, 39), (138, 39), (146, 36)], + "Pumpkin Zone 1": [(23, 12), (72, 27), (98, 4), (189, 6)], + "Pumpkin Zone 2": [(144, 23)], + "Pumpkin Zone Secret Course 1": [(14, 15)], + "Pumpkin Zone 3": [(52, 20), (104, 42), (139, 35), (140, 41)], + "Pumpkin Zone Secret Course 2": [(12, 6), (85, 8)], + "Pumpkin Zone 4": [(83, 38), (94, 40), (104, 23)], + "Mario Zone 1": [(18, 44), (98, 38), (145, 42), (164, 20)], + "Mario Zone 2": [(81, 27)], + "Mario Zone 3": [(54, 25), (100, 27), (134, 18), (189, 44), (214, 27)], + "Mario Zone 4": [(20, 25), (124, 12), (179, 12)], + "Turtle Zone 1": [(22, 34), (56, 33), (57, 33), (143, 34), (189, 44)], + "Turtle Zone 2": [(82, 35), (139, 39), ], + "Turtle Zone Secret Course": [(19, 27), (53, 27), (64, 26), (87, 27), (121, 28), (122, 28), (123, 28)], + "Turtle Zone 3": [(39, 24), (94, 26), (152, 23)], + "Hippo Zone": [(3, 3), (2, 20), (15, 26), (16, 26), (29, 21), (86, 22), (137, 13)], + "Space Zone 1": [(75, 24), (114, 22)], + # "Space Zone Secret Course": [], + "Space Zone 2": [(64, 3), (102, 8), (120, 5), (207, 6), (210, 9), (248, 10)], + "Macro Zone 1": [(49, 43), (87, 39), (177, 40), (164, 21), (166, 21), (170, 21), (234, 43)], + "Macro Zone 2": [(25, 26), (99, 40), (137, 37), (180, 40)], + "Macro Zone 3": [(24, 23), (85, 43), (129, 19), (203, 25)], + "Macro Zone 4": [(16, 28), (87, 28), (144, 22)], + "Macro Zone Secret Course": [(21, 24), (88, 25), (108, 30)], + "Mario's Castle": [(7, 25), (160, 44), (167, 28), (247, 26)] +} +for zone, coords_list in powerup_coords.items(): + for coords in coords_list: + coins_coords[zone].remove(coords) + +location_name_to_id = {location_name: ID for ID, location_name in enumerate(locations, START_IDS)} +loc_id = START_IDS + len(locations) +for level, coin_coords in coins_coords.items(): + for i in range(1, len(coin_coords) + 1): + location_name_to_id[f"{level} - {i} Coin{'s' if i > 1 else ''}"] = loc_id + loc_id += 1 + +# eligible_levels = [0, 1, 2, 3, 5, 8, 9, 11, 13, 14, 16, 19, 20, 22, 23, 25, 30, 31] + +level_id_to_name = { + 0: "Mushroom Zone", 25: "Scenic Course", 1: "Tree Zone 1", 2: "Tree Zone 2", 4: "Tree Zone 3", 3: "Tree Zone 4", + 5: "Tree Zone 5", 29: "Tree Zone Secret Course", 17: "Hippo Zone", 18: "Space Zone 1", + 28: "Space Zone Secret Course", 19: "Space Zone 2", 20: "Macro Zone 1", 21: "Macro Zone 2", 22: "Macro Zone 3", + 23: "Macro Zone 4", 30: "Macro Zone Secret Course", 6: "Pumpkin Zone 1", 7: "Pumpkin Zone 2", + 8: "Pumpkin Zone 3", 9: "Pumpkin Zone 4", 27: "Pumpkin Zone Secret Course 1", 31: "Pumpkin Zone Secret Course 2", + 10: "Mario Zone 1", 11: "Mario Zone 2", 12: "Mario Zone 3", 13: "Mario Zone 4", 14: "Turtle Zone 1", + 15: "Turtle Zone 2", 16: "Turtle Zone 3", 26: "Turtle Zone Secret Course", 24: "Mario's Castle" +} + +level_name_to_id = {name: level_id for level_id, name in level_id_to_name.items()} + +auto_scroll_max = { + "Mushroom Zone": 84, + "Hippo Zone": 160, + "Tree Zone 1": 87, + "Tree Zone 2": 68, + "Tree Zone 3": 4, + "Tree Zone 4": 28, + "Tree Zone 5": 22, + "Space Zone 1": 72, + "Space Zone 2": 113, + "Space Zone Secret Course": 96, + "Macro Zone 1": 74, + "Macro Zone 2": 27, + "Macro Zone 3": 63, + "Macro Zone 4": 59, + "Pumpkin Zone 1": (0, 12), + "Pumpkin Zone 2": 23, + "Pumpkin Zone 3": 50, + "Pumpkin Zone 4": 45, + "Pumpkin Zone Secret Course 1": 172, + "Mario Zone 1": 68, + "Mario Zone 3": 29, + "Mario Zone 4": 60, + "Turtle Zone 1": 66, + "Turtle Zone 2": 8, +} diff --git a/worlds/marioland2/logic.py b/worlds/marioland2/logic.py new file mode 100644 index 0000000000..9934535572 --- /dev/null +++ b/worlds/marioland2/logic.py @@ -0,0 +1,608 @@ +from .locations import level_name_to_id + + +def is_auto_scroll(state, player, level): + level_id = level_name_to_id[level] + if state.has_any(["Cancel Auto Scroll", f"Cancel Auto Scroll - {level}"], player): + return False + return state.multiworld.worlds[player].auto_scroll_levels[level_id] > 0 + + +def has_pipe_right(state, player): + return state.has_any(["Pipe Traversal - Right", "Pipe Traversal"], player) + + +def has_pipe_left(state, player): + return state.has_any(["Pipe Traversal - Left", "Pipe Traversal"], player) + + +def has_pipe_down(state, player): + return state.has_any(["Pipe Traversal - Down", "Pipe Traversal"], player) + + +def has_pipe_up(state, player): + return state.has_any(["Pipe Traversal - Up", "Pipe Traversal"], player) + + +def has_level_progression(state, item, player, count=1): + return state.count(item, player) + (state.count(item + " x2", player) * 2) >= count + + +def mushroom_zone_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mushroom Zone") + reachable_coins = 38 + if state.has_any(["Mushroom", "Fire Flower"], player) or not auto_scroll: + # Was able to get all but 1, being lenient. + reachable_coins += 2 + if has_pipe_down(state, player): + # There's 24 in each of the underground sections. + # The first one requires missing some question mark blocks if auto scrolling (the last +4). + # If you go in the second without pipe up, you can get everything except the last 5 plus the ones in the first + # underground section. + reachable_coins += 19 + if has_pipe_up(state, player) or not auto_scroll: + reachable_coins += 5 + if has_pipe_up(state, player): + reachable_coins += 20 + if not auto_scroll: + reachable_coins += 4 + return coins <= reachable_coins + + +def tree_zone_1_coins(state, player, coins): + return coins <= 87 or not is_auto_scroll(state, player, "Tree Zone 1") + + +def tree_zone_2_normal_exit(state, player): + return has_pipe_right(state, player) or state.has("Tree Zone 2 Midway Bell", player) + + +def tree_zone_2_secret_exit(state, player): + return has_pipe_right(state, player) and state.has("Carrot", player) + + +def tree_zone_2_midway_bell(state, player): + return has_pipe_right(state, player) or state.has("Tree Zone 2 Midway Bell", player) + + +def tree_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 2") + reachable_coins = 18 + if has_pipe_right(state, player): + reachable_coins += 38 + if state.has("Carrot", player): + reachable_coins += 12 + if not auto_scroll: + reachable_coins += 30 + elif state.has("Tree Zone 2 Midway Bell", player): + reachable_coins = 30 + if not auto_scroll: + reachable_coins += 8 + return coins <= reachable_coins + + +def tree_zone_3_normal_exit(state, player): + return not is_auto_scroll(state, player, "Tree Zone 3") + + +def tree_zone_3_coins(state, player, coins): + if is_auto_scroll(state, player, "Tree Zone 3"): + return coins <= 4 + if coins <= 19: + return True + elif state.has_any(["Mushroom", "Fire Flower"], player) and coins <= 21: + return True + return state.has("Carrot", player) + + +def tree_zone_4_normal_exit(state, player): + return has_pipe_down(state, player) and tree_zone_4_midway_bell(state, player) + + +def tree_zone_4_midway_bell(state, player): + return ((has_pipe_right(state, player) and has_pipe_up(state, player)) + or state.has("Tree Zone 4 Midway Bell", player)) + + +def tree_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 4") + reachable_coins = 0 + if has_pipe_up(state, player): + reachable_coins += 14 + if has_pipe_right(state, player): + reachable_coins += 4 + if has_pipe_down(state, player): + reachable_coins += 10 + if not auto_scroll: + reachable_coins += 46 + elif state.has("Tree Zone 4 Midway Bell", player): + if not auto_scroll: + if has_pipe_left(state, player): + reachable_coins += 18 + if has_pipe_down(state, player): + reachable_coins += 10 + if has_pipe_up(state, player): + reachable_coins += 46 + elif has_pipe_down(state, player): + reachable_coins += 10 + return coins <= reachable_coins + + +def tree_zone_5_boss(state, player): + return has_pipe_right(state, player) and (has_pipe_up(state, player) or state.has("Carrot", player)) + + +def tree_zone_5_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 5") + reachable_coins = 0 + # Not actually sure if these platforms can be randomized / can make the coin blocks unreachable from below + if ((not state.multiworld.worlds[player].options.randomize_platforms) + or state.has_any(["Mushroom", "Fire Flower"], player)): + reachable_coins += 2 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 2 + if state.has("Carrot", player): + reachable_coins += 18 + if has_pipe_up(state, player) and not auto_scroll: + reachable_coins += 13 + elif has_pipe_up(state, player): + reachable_coins += 13 + return coins <= reachable_coins + + +def pumpkin_zone_1_normal_exit(state, player): + return pumpkin_zone_1_midway_bell(state, player) + + +def pumpkin_zone_1_midway_bell(state, player): + return ((has_pipe_down(state, player) and not is_auto_scroll(state, player, "Pumpkin Zone 1")) + or state.has("Pumpkin Zone 1 Midway Bell", player)) + + +def pumpkin_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 1") + if auto_scroll: + return coins <= 12 and state.has("Pumpkin Zone 1 Midway Bell", player) + reachable_coins = 0 + if state.has("Pumpkin Zone 1 Midway Bell", player) or has_pipe_down(state, player): + reachable_coins += 38 + if has_pipe_up(state, player): + reachable_coins += 2 + return coins <= reachable_coins + + +def pumpkin_zone_2_normal_exit(state, player): + return has_pipe_down(state, player) and has_pipe_up(state, player) and has_pipe_right(state, player) and state.has( + "Water Physics", player) and not is_auto_scroll(state, player, "Pumpkin Zone 2") + + +def pumpkin_zone_2_secret_exit(state, player): + return pumpkin_zone_2_normal_exit(state, player) and state.has_any(["Mushroom", "Fire Flower"], player) + + +def pumpkin_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 2") + reachable_coins = 17 + if has_pipe_down(state, player): + if not auto_scroll: + reachable_coins += 7 + if (has_pipe_up(state, player) or auto_scroll) and state.has("Water Physics", player): + reachable_coins += 6 + if has_pipe_right(state, player) and not auto_scroll: + reachable_coins += 1 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + return coins <= reachable_coins + + +def pumpkin_zone_secret_course_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone Secret Course 1") + # We'll be a bit forgiving. I was able to reach 43 while small. + if coins <= 40: + return True + if state.has("Carrot", player): + if auto_scroll: + return coins <= 172 + return True + return False + + +def pumpkin_zone_3_secret_exit(state, player): + return state.has("Carrot", player) + + +def pumpkin_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 3") + reachable_coins = 38 + if has_pipe_up(state, player) and ((not auto_scroll) or has_pipe_down(state, player)): + reachable_coins += 12 + if has_pipe_down(state, player) and not auto_scroll: + reachable_coins += 11 + return coins <= reachable_coins + + +def pumpkin_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def pumpkin_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 4") + reachable_coins = 29 + if has_pipe_down(state, player): + if auto_scroll: + if has_pipe_up(state, player): + reachable_coins += 16 + else: + reachable_coins += 4 + else: + reachable_coins += 28 + # both sets of coins are down, but you need pipe up to return to go down to the next set in one playthrough + if has_pipe_up(state, player): + reachable_coins += 16 + return coins <= reachable_coins + + +def mario_zone_1_normal_exit(state, player): + if has_pipe_right(state, player): + if state.has_any(["Mushroom", "Fire Flower", "Carrot", "Mario Zone 1 Midway Bell"], player): + return True + if is_auto_scroll(state, player, "Mario Zone 1"): + return True + return False + + +def mario_zone_1_midway_bell(state, player): + # It is possible to get as small mario, but it is a very precise jump and you will die afterward. + return ((state.has_any(["Mushroom", "Fire Flower", "Carrot"], player) and has_pipe_right(state, player)) + or state.has("Mario Zone 1 Midway Bell", player)) + + +def mario_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mario Zone 1") + reachable_coins = 0 + if has_pipe_right(state, player) or (has_pipe_left(state, player) + and state.has("Mario Zone 1 Midway Bell", player) and not auto_scroll): + reachable_coins += 32 + if has_pipe_right(state, player) and (state.has_any(["Mushroom", "Fire Flower", "Carrot"], player) + or not auto_scroll): + reachable_coins += 8 + # coins from end section. I was able to get 13 as small mario, giving some leniency + if state.has("Carrot", player): + reachable_coins += 28 + else: + reachable_coins += 12 + if state.has("Fire Flower", player) and not auto_scroll: + reachable_coins += 46 + return coins <= reachable_coins + + +def mario_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mario Zone 3") + reachable_coins = 10 + if state.has("Carrot", player): + reachable_spike_coins = 15 + else: + sprites = state.multiworld.worlds[player].sprite_data["Mario Zone 3"] + reachable_spike_coins = min(3, len({sprites[i]["sprite"] == "Claw Grabber" for i in (17, 18, 25)}) + + state.has("Mushroom", player) + state.has("Fire Flower", player)) * 5 + reachable_coins += reachable_spike_coins + if not auto_scroll: + reachable_coins += 10 + if state.has("Fire Flower", player): + reachable_coins += 22 + if auto_scroll: + reachable_coins -= 3 + reachable_spike_coins + return coins <= reachable_coins + + +def mario_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def mario_zone_4_coins(state, player, coins): + return coins <= 60 or not is_auto_scroll(state, player, "Mario Zone 4") + + +def not_blocked_by_sharks(state, player): + sharks = [state.multiworld.worlds[player].sprite_data["Turtle Zone 1"][i]["sprite"] + for i in (27, 28)].count("Shark") + if state.has("Carrot", player) or not sharks: + return True + if sharks == 2: + return state.has_all(["Mushroom", "Fire Flower"], player) + if sharks == 1: + return state.has_any(["Mushroom", "Fire Flower"], player) + return False + + +def turtle_zone_1_normal_exit(state, player): + return not_blocked_by_sharks(state, player) + + +def turtle_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Turtle Zone 1") + reachable_coins = 30 + if not_blocked_by_sharks(state, player): + reachable_coins += 13 + if auto_scroll: + reachable_coins -= 1 + if state.has("Water Physics", player) or state.has("Carrot", player): + reachable_coins += 10 + if state.has("Carrot", player): + reachable_coins += 24 + if auto_scroll: + reachable_coins -= 10 + return coins <= reachable_coins + + +def turtle_zone_2_normal_exit(state, player): + return (has_pipe_up(state, player) and has_pipe_down(state, player) and has_pipe_right(state, player) and + has_pipe_left(state, player) and state.has("Water Physics", player) + and not is_auto_scroll(state, player, "Turtle Zone 2")) + + +def turtle_zone_2_secret_exit(state, player): + return (has_pipe_up(state, player) and state.has("Water Physics", player) + and not is_auto_scroll(state, player, "Turtle Zone 2")) + + +def turtle_zone_2_midway_bell(state, player): + return ((state.has("Water Physics", player) and not is_auto_scroll(state, player, "Turtle Zone 2")) + or state.has("Turtle Zone 2 Midway Bell", player)) + + +def turtle_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Turtle Zone 2") + reachable_coins = 2 + if auto_scroll: + if state.has("Water Physics", player): + reachable_coins += 6 + else: + reachable_coins += 2 + if state.has("Water Physics", player): + reachable_coins += 20 + elif state.has("Turtle Zone 2 Midway Bell", player): + reachable_coins += 4 + if (has_pipe_right(state, player) and has_pipe_down(state, player) + and state.has_any(["Water Physics", "Turtle Zone 2 Midway Bell"], player)): + reachable_coins += 1 + if has_pipe_left(state, player) and has_pipe_up(state, player): + reachable_coins += 1 + if state.has("Water Physics", player): + reachable_coins += 1 + return coins <= reachable_coins + + +def turtle_zone_secret_course_normal_exit(state, player): + return state.has_any(["Fire Flower", "Carrot"], player) + + +def turtle_zone_secret_course_coins(state, player, coins): + reachable_coins = 53 + if state.has("Carrot", player): + reachable_coins += 44 + elif state.has("Fire Flower", player): + reachable_coins += 36 # was able to get 38, some leniency + return coins <= reachable_coins + + +def turtle_zone_3_boss(state, player): + return has_pipe_right(state, player) + + +def turtle_zone_3_coins(state, player, coins): + return state.has_any(["Water Physics", "Mushroom", "Fire Flower", "Carrot"], player) or coins <= 51 + + +def hippo_zone_normal_or_secret_exit(state, player): + return (state.has_any(["Hippo Bubble", "Water Physics"], player) + or (state.has("Carrot", player) + and not is_auto_scroll(state, player, "Hippo Zone"))) + + +def hippo_zone_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Hippo Zone") + # This is all somewhat forgiving. + reachable_coins = 4 + if auto_scroll: + if state.has("Hippo Bubble", player): + reachable_coins = 160 + elif state.has("Carrot", player): + reachable_coins = 90 + elif state.has("Water Physics", player): + reachable_coins = 28 + else: + if state.has_any(["Water Physics", "Hippo Bubble", "Carrot"], player): + reachable_coins += 108 + if state.has_any(["Mushroom", "Fire Flower", "Hippo Bubble"], player): + reachable_coins += 6 + if state.has_all(["Fire Flower", "Water Physics"], player): + reachable_coins += 1 + if state.has("Hippo Bubble", player): + reachable_coins += 52 + return coins <= reachable_coins + + +def space_zone_1_normal_exit(state, player): + # It is possible, however tricky, to beat the Moon Stage without Carrot or Space Physics. + # However, it requires somewhat precisely jumping off enemies. Enemy shuffle may make this impossible. + # Instead, I will just always make one or the other required, since it is difficult without them anyway. + return state.has_any(["Space Physics", "Carrot"], player) + + +def space_zone_1_secret_exit(state, player): + # One or the other is actually necessary for the secret exit. + return state.has_any(["Space Physics", "Carrot"], player) and not is_auto_scroll(state, player, "Space Zone 1") + + +def space_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Space Zone 1") + if auto_scroll: + reachable_coins = 12 + if state.has_any(["Carrot", "Space Physics"], player): + reachable_coins += 20 + # If you have Space Physics, you can't make it up to the upper section. We have to assume you might have it, + # so the coins up there must be out of logic if there is auto scrolling. + if state.has("Space Physics", player): + reachable_coins += 40 + return coins <= reachable_coins + return (coins <= 21 or (coins <= 50 and state.has_any(["Mushroom", "Fire Flower"], player)) + or state.has_any(["Carrot", "Space Physics"], player)) + + +def space_zone_2_midway_bell(state, player): + return state.has_any(["Space Physics", "Space Zone 2 Midway Bell", "Mushroom", "Fire Flower", "Carrot"], player) + + +def space_zone_2_boss(state, player): + if has_pipe_right(state, player): + if state.has("Space Physics", player): + return True + if (state.has("Space Zone 2 Midway Bell", player) + or not state.multiworld.worlds[player].options.shuffle_midway_bells): + # Reaching the midway bell without space physics requires taking damage once. Reaching the end pipe from the + # midway bell also requires taking damage once. + if state.has_any(["Mushroom", "Fire Flower", "Carrot"], player): + return True + else: + # With no midway bell, you'll have to be able to take damage twice. + if state.has("Mushroom", player) and state.has_any(["Fire Flower", "Carrot"], player): + return True + return False + + +def space_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Space Zone 2") + reachable_coins = 12 + if state.has_any(["Mushroom", "Fire Flower", "Carrot", "Space Physics"], player): + reachable_coins += 15 + if state.has("Space Physics", player) or not auto_scroll: + reachable_coins += 4 # last few bottom row question mark blocks that are hard to get when auto scrolling. + if (state.has("Space Physics", player) or ( + state.has("Mushroom", player) and state.has_any(["Fire Flower", "Carrot"], player))): + reachable_coins += 3 + if state.has("Space Physics", player): + reachable_coins += 79 + if not auto_scroll: + reachable_coins += 21 + return coins <= reachable_coins + + +def space_zone_secret_course_coins(state, player, coins): + return coins <= 96 or not is_auto_scroll(state, player, "Space Zone Secret Course") + + +def macro_zone_1_normal_exit(state, player): + return has_pipe_down(state, player) or state.has("Macro Zone 1 Midway Bell", player) + + +def macro_zone_1_secret_exit(state, player): + return state.has("Fire Flower", player) and has_pipe_up(state, player) and macro_zone_1_midway_bell(state, player) + + +def macro_zone_1_midway_bell(state, player): + return has_pipe_down(state, player) or state.has("Macro Zone 1 Midway Bell", player) + + +def macro_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 1") + reachable_coins = 0 + if has_pipe_down(state, player): + reachable_coins += 69 + if auto_scroll: + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + else: + reachable_coins += 9 + if state.has("Fire Flower", player): + reachable_coins += 19 + elif state.has("Macro Zone 1 Midway Bell", player): + if auto_scroll: + reachable_coins += 16 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + else: + reachable_coins += 67 + return coins <= reachable_coins + + +def macro_zone_secret_course_coins(state, player, coins): + return state.has_any(["Mushroom", "Fire Flower"], player) + + +def macro_zone_2_normal_exit(state, player): + return (has_pipe_down(state, player) or state.has("Macro Zone 2 Midway Bell", player)) and state.has( + "Water Physics", player) and has_pipe_up(state, player) and not is_auto_scroll(state, player, "Macro Zone 2") + + +def macro_zone_2_midway_bell(state, player): + return ((has_pipe_down(state, player) and state.has("Water Physics", player)) + or state.has("Macro Zone 2 Midway Bell", player)) + + +def macro_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 2") + if coins <= 27: + return True + if has_pipe_up(state, player) and state.has("Water Physics", player) and not auto_scroll: + if has_pipe_down(state, player): + return True + if state.has("Macro Zone 2 Midway Bell", player): + # Cannot return to the first section from the bell + return coins <= 42 + return False + + +def macro_zone_3_normal_exit(state, player): + return ((has_pipe_down(state, player) and has_pipe_up(state, player)) + or state.has("Macro Zone 3 Midway Bell", player)) + + +def macro_zone_3_midway_bell(state, player): + return macro_zone_3_normal_exit(state, player) + + +def macro_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 3") + reachable_coins = 7 + if not auto_scroll: + reachable_coins += 17 + if has_pipe_up(state, player) and has_pipe_down(state, player): + if auto_scroll: + reachable_coins += 56 + else: + return True + elif has_pipe_up(state, player): + if auto_scroll: + reachable_coins += 12 + else: + reachable_coins += 36 + elif has_pipe_down(state, player): + reachable_coins += 18 + if state.has("Macro Zone 3 - Midway Bell", player): + reachable_coins = max(reachable_coins, 30) + return coins <= reachable_coins + + +def macro_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def macro_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 4") + reachable_coins = 61 + if auto_scroll: + reachable_coins -= 8 + if state.has("Carrot", player): + reachable_coins += 6 + return coins <= reachable_coins + + +def marios_castle_wario(state, player): + return ((has_pipe_right(state, player) and has_pipe_left(state, player)) + or state.has("Mario's Castle Midway Bell", player)) + + +def marios_castle_midway_bell(state, player): + return ((has_pipe_right(state, player) and has_pipe_left(state, player)) + or state.has("Mario's Castle Midway Bell", player)) diff --git a/worlds/marioland2/options.py b/worlds/marioland2/options.py new file mode 100644 index 0000000000..ace8444b3f --- /dev/null +++ b/worlds/marioland2/options.py @@ -0,0 +1,198 @@ +from Options import Toggle, Choice, NamedRange, Range, PerGameCommonOptions, ItemsAccessibility +from dataclasses import dataclass + + +class ShuffleGoldenCoins(Choice): + """ + Vanilla: Golden Coins are received when defeating bosses. + Shuffle: Shuffle the Golden Coins into the item pool and make bosses location checks. + Mario Coin Fragment Hunt: You start with all Golden Coins except the Mario Coin, which has been fragmented into many pieces. + You will see a Golden Coin being received when defeating bosses regardless of whether you are actually getting a coin. + """ + display_name = "Shuffle Golden Coins" + default = 0 + option_vanilla = 0 + option_shuffle = 1 + option_mario_coin_fragment_hunt = 2 + + +class GoldenCoinsRequired(Range): + """ + Number of Golden Coins required to enter Mario's Castle. Ignored on Mario Coin Fragment Hunt. + """ + display_name = "Golden Coins Required" + range_start = 0 + range_end = 6 + default = 6 + + +class MarioCoinFragmentPercentage(Range): + """ + Percentage of filler items to be replaced with Mario Coin Fragments. Note that the Coinsanity and Coinsanity + Checks options will greatly impact the number of replaceable filler items. + """ + display_name = "Mario Coin Fragment Percentage" + range_start = 1 + range_end = 50 + default = 20 + + +class MarioCoinFragmentsRequiredPercentage(Range): + """ + Percentage of the Mario Coins in the item pool that are required to put the Mario Coin together. + """ + display_name = "Mario Coin Fragments Required Percentage" + range_start = 1 + range_end = 100 + default = 75 + + +class ShuffleMidwayBells(Toggle): + """ + Shuffle Midway Bells into the item pool. You can always start at the beginning of a level after obtaining the + Midway Bell by holding SELECT while entering the level (until you load into the level). + The Midway Bells in levels will trigger location checks whether this option is on or not, but they will only + set the checkpoint if this is off, otherwise you must obtain the Midway Bell item from the item pool. + """ + display_name = "Shuffle Midway Bells" + + +class MariosCastleMidwayBell(Toggle): + """ + Adds a Midway Bell to the final stage, just before the Wario fight. + """ + display_name = "Mario's Castle Midway Bell" + + +class Coinsanity(Toggle): + """ + Shuffles the singular coins found freestanding and in question mark blocks into the item pool, and adds location + checks made by obtaining a sufficient number of coins in particular levels within a single playthrough. + """ + display_name = "Coinsanity" + + +class CoinsanityChecks(Range): + """ + Number of Coinsanity checks. + A higher number means more checks, and smaller coin amounts per coin item in the item pool. + If Accessibility is set to Full, auto-scroll levels may have a lower maximum count, which may lead to this + value being limited. + """ + display_name = "Coinsanity Checks" + range_start = 31 + range_end = 2599 + default = 150 + + +class DifficultyMode(Choice): + """ + Play in normal or easy mode. You can also start in Normal Mode with an "upgrade" to Easy Mode in the item pool, + or start in Easy Mode with a Normal Mode "trap" in the item pool. + """ + display_name = "Difficulty Mode" + option_normal = 0 + option_easy = 1 + option_normal_to_easy = 2 + option_easy_to_normal = 3 + default = 0 + + +class ShufflePipeTraversal(Choice): + """ + Single: Shuffle a Pipe Traversal item into the item pool, which is required to enter any pipes. + Split: Shuffle 4 Pipe Traversal items, one required for entering pipes from each direction. + Note that being unable to enter pipes is very limiting and affects nearly half of all levels. + """ + display_name = "Shuffle Pipe Traversal" + option_off = 0 + option_single = 1 + option_split = 2 + default = 0 + + +class RandomizeEnemies(Toggle): + """ + Randomize enemies throughout levels. + """ + display_name = "Randomize Enemies" + + +class RandomizePlatforms(Toggle): + """ + Randomize platforms throughout levels. + """ + display_name = "Randomize Platforms" + + +class AutoScrollChances(NamedRange): + """ + Chance per eligible level to be made into an auto scroll level. Can also set to Vanilla to leave them unchanged. + """ + display_name = "Auto Scroll Chance" + range_start = 0 + range_end = 100 + special_range_names = {"vanilla": -1, "none": 0, "all": 100} + default = -1 + + +class AutoScrollMode(Choice): + """ + Always: Any auto scroll levels will always auto-scroll. + Global Trap Item: Auto scroll levels will only auto-scroll after obtaining the Auto Scroll trap item. + Level Trap Items: As with Trap Item, but there is a separate trap item for each auto scroll level. + Global Cancel Item: Auto Scroll levels will stop auto-scrolling after obtaining the Auto Scroll Cancel item. + Level Cancel Items: As with Cancel Item, but there is a separate cancel item for each auto scroll level. + Chaos: Each level will randomly always auto scroll, have an Auto Scroll Trap, or have an Auto Scroll Cancel item. + The effects of Trap and Cancel items are permanent! If Accessibility is not set to Full, + Traps may cause locations to become permanently unreachable. + With individual level items, the number of auto scroll levels may be limited by the available space in the item + pool. + """ + display_name = "Auto Scroll Mode" + option_always = 0 + option_global_trap_item = 1 + option_level_trap_items = 2 + option_global_cancel_item = 3 + option_level_cancel_items = 4 + option_chaos = 5 + default = 0 + + +class RandomizeMusic(Toggle): + """ + Randomize the music that plays in levels and overworld areas. + """ + display_name = "Randomize Music" + + +class EnergyLink(Toggle): + """ + All extra lives beyond 1 are transferred into the server's shared EnergyLink storage. If you drop to 0, + 1 will be replenished if there is sufficient energy stored. + """ + display_name = "Energy Link" + default = 1 + + + + +@dataclass +class SML2Options(PerGameCommonOptions): + accessibility: ItemsAccessibility + shuffle_golden_coins: ShuffleGoldenCoins + required_golden_coins: GoldenCoinsRequired + mario_coin_fragment_percentage: MarioCoinFragmentPercentage + mario_coin_fragments_required_percentage: MarioCoinFragmentsRequiredPercentage + coinsanity: Coinsanity + coinsanity_checks: CoinsanityChecks + shuffle_midway_bells: ShuffleMidwayBells + marios_castle_midway_bell: MariosCastleMidwayBell + shuffle_pipe_traversal: ShufflePipeTraversal + auto_scroll_mode: AutoScrollMode + auto_scroll_chances: AutoScrollChances + difficulty_mode: DifficultyMode + randomize_enemies: RandomizeEnemies + randomize_platforms: RandomizePlatforms + randomize_music: RandomizeMusic + energy_link: EnergyLink diff --git a/worlds/marioland2/rom.py b/worlds/marioland2/rom.py new file mode 100644 index 0000000000..2a19a9cb8c --- /dev/null +++ b/worlds/marioland2/rom.py @@ -0,0 +1,146 @@ +import hashlib +import os +import pkgutil + +import Utils + +from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes +from settings import get_settings + +from .rom_addresses import rom_addresses +from .sprites import sprite_name_to_id + + +def randomize_music(patch, random): + # overworld + overworld_music_tracks = [0x05, 0x06, 0x0D, 0x0E, 0x10, 0x12, 0x1B, 0x1C, 0x1E] + random.shuffle(overworld_music_tracks) + for i, track in zip([0x3004F, 0x3EA9B, 0x3D186, 0x3D52B, 0x3D401, 0x3D297, 0x3D840, 0x3D694, 0x3D758], + overworld_music_tracks): + patch.write_bytes(i, track) + # levels + for i in range(0x5619, 0x5899, 0x14): + patch.write_bytes(i, random.choice([0x01, 0x0B, 0x11, 0x13, 0x14, 0x17, 0x1D, 0x1F, 0x28])) + + +def generate_output(self, output_directory: str): + + patch = SuperMarioLand2ProcedurePatch(player=self.player, player_name=self.player_name) + + patch.write_file("basepatch.bsdiff4", pkgutil.get_data(__name__, "basepatch.bsdiff4")) + random = self.random + + if self.options.marios_castle_midway_bell: + # Remove Question Mark Block + patch.write_bytes(0x4F012, 0x5D) + # Fix level pointer to read midway bell flag + patch.write_bytes(0x3E569, 0x18) + patch.write_bytes(0x3E56A, 0x18) + # Position and screen coordinates + patch.write_bytes(0x383B, [0xD4, 0x01, 0x4D, 0x0A, 0xC0, 0x01, 0x50, 0x0A]) + + if self.options.coinsanity: + # Add platform to return to start of Pumpkin Zone Secret Course 1 + patch.write_bytes(0x258B6, 0x3B) + patch.write_bytes(0x258F8, 0x7a) + patch.write_bytes(0x2594D, 0x67) + patch.write_bytes(0x259A8, 0x68) + patch.write_bytes(0x259A9, 0x60) + + i = 0xe077 + for level, sprites in self.sprite_data.items(): + for sprite_data in sprites: + sprite_id = sprite_name_to_id[sprite_data["sprite"]] + data = [((sprite_id & 0b01000000) >> 2) | ((sprite_id & 0b00111000) << 2) | sprite_data["screen"], + ((sprite_id & 0b00000111) << 5) | sprite_data["x"], + sprite_data["misc"] | sprite_data["y"]] + patch.write_bytes(i, data) + i += 3 + patch.write_bytes(i, 255) + i += 1 + + if self.options.randomize_music: + randomize_music(patch, random) + + if self.options.shuffle_golden_coins: + patch.write_bytes(rom_addresses["Coin_Shuffle"], 0x40) + if self.options.shuffle_midway_bells: + patch.write_bytes(rom_addresses["Disable_Midway_Bell"], 0xC9) + + if self.options.coinsanity: + for section in ("A", "B"): + for i in range(0, 30): + patch.write_bytes(rom_addresses[f"Coinsanity_{section}"] + i, 0x00) + + star_count = max(len([loc for loc in self.multiworld.get_filled_locations() if loc.item.player == self.player + and loc.item.name == "Super Star Duration Increase"]), 1) + patch.write_bytes(rom_addresses["Star_Count"], star_count // 256) + patch.write_bytes(rom_addresses["Star_Count"] + 1, star_count - (star_count // 256)) + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + patch.write_bytes(rom_addresses["Coins_Required"], self.coin_fragments_required // 256) + patch.write_bytes(rom_addresses["Coins_Required"] + 1, self.coin_fragments_required % 256) + patch.write_bytes(rom_addresses["Required_Golden_Coins"], 6) + else: + patch.write_bytes(rom_addresses["Coins_Required"] + 1, self.options.required_golden_coins.value) + patch.write_bytes(rom_addresses["Required_Golden_Coins"], self.options.required_golden_coins.value) + patch.write_bytes(rom_addresses["Midway_Bells"], self.options.shuffle_midway_bells.value) + patch.write_bytes(rom_addresses["Energy_Link"], self.options.energy_link.value) + patch.write_bytes(rom_addresses["Difficulty_Mode"], self.options.difficulty_mode.value) + patch.write_bytes(rom_addresses["Coin_Mode"], self.options.shuffle_golden_coins.value) + + for level, i in enumerate(self.auto_scroll_levels): + # We set 0 if no auto scroll or auto scroll trap, so it defaults to no auto scroll. 1 if always or cancel items. + patch.write_bytes(rom_addresses["Auto_Scroll_Levels"] + level, max(0, i - 1)) + patch.write_bytes(rom_addresses["Auto_Scroll_Levels_B"] + level, i) + + if self.options.energy_link: + # start with 1 life if Energy Link is on so that you don't deposit lives at the start of the game. + patch.write_bytes(rom_addresses["Starting_Lives"], 1) + + rom_name = bytearray(f'AP{Utils.__version__.replace(".", "")[0:3]}_{self.player}_{self.multiworld.seed:11}\0', + 'utf8')[:21] + rom_name.extend([0] * (21 - len(rom_name))) + patch.write_bytes(0x77777, rom_name) + patch.write_file("tokens.bin", patch.get_token_binary()) + patch.write(os.path.join(output_directory, + f"{self.multiworld.get_out_file_name_base(self.player)}{patch.patch_file_ending}")) + + +class SuperMarioLand2ProcedurePatch(APProcedurePatch, APTokenMixin): + hash = "a8413347d5df8c9d14f97f0330d67bce" + patch_file_ending = ".apsml2" + game = "Super Mario Land 2" + result_file_ending = ".gb" + procedure = [ + ("apply_bsdiff4", ["basepatch.bsdiff4"]), + ("apply_tokens", ["tokens.bin"]), + ] + + @classmethod + def get_source_data(cls) -> bytes: + return get_base_rom_bytes() + + def write_bytes(self, offset, value): + if isinstance(value, int): + value = [value] + self.write_token(APTokenTypes.WRITE, offset, bytes(value)) + + +def get_base_rom_bytes(): + file_name = get_base_rom_path() + with open(file_name, "rb") as file: + base_rom_bytes = bytes(file.read()) + + basemd5 = hashlib.md5() + basemd5.update(base_rom_bytes) + if SuperMarioLand2ProcedurePatch.hash != basemd5.hexdigest(): + raise Exception("Supplied Base Rom does not match known MD5 for Super Mario Land 1.0. " + "Get the correct game and version, then dump it") + return base_rom_bytes + + +def get_base_rom_path(): + file_name = get_settings()["sml2_options"]["rom_file"] + if not os.path.exists(file_name): + file_name = Utils.user_path(file_name) + return file_name \ No newline at end of file diff --git a/worlds/marioland2/rom_addresses.py b/worlds/marioland2/rom_addresses.py new file mode 100644 index 0000000000..e4b4f69cd7 --- /dev/null +++ b/worlds/marioland2/rom_addresses.py @@ -0,0 +1,39 @@ +rom_addresses = { + "Space_Physics": 0x4e7, + "Pipe_Traversal_A": 0x11a4, + "Pipe_Traversal_SFX_A": 0x11a9, + "Pipe_Traversal_B": 0x11d6, + "Pipe_Traversal_SFX_B": 0x11e7, + "Pipe_Traversal_C": 0x1226, + "Pipe_Traversal_SFX_C": 0x123f, + "Pipe_Traversal_D": 0x1256, + "Pipe_Traversal_SFX_D": 0x125b, + "Enable_Swim": 0x1d17, + "Coinsanity_B": 0x1d86, + "Auto_Scroll_Levels": 0x1f71, + "Starting_Lives": 0x2920, + "Get_Hurt_To_Big_Mario": 0x31c7, + "Get_Mushroom_A": 0x345c, + "Get_Fire_Flower_A": 0x346d, + "Get_Carrot_A": 0x347e, + "Invincibility_Star_A": 0x349e, + "Invincibility_Star_B": 0x34a3, + "Enable_Bubble": 0x34e5, + "Coinsanity_A": 0x591f, + "Coin_Shuffle": 0x304ce, + "Required_Golden_Coins": 0x306e9, + "Disable_Midway_Bell": 0x3ef1e, + "Get_Carrot_C": 0x6092f, + "Get_Mushroom_C": 0x60930, + "Get_Fire_Flower_C": 0x60933, + "Get_Mushroom_B": 0x60ddb, + "Get_Carrot_B": 0x60de7, + "Get_Fire_Flower_B": 0x60df3, + "Coins_Required": 0x80139, + "Difficulty_Mode": 0x8013b, + "Star_Count": 0x8013c, + "Midway_Bells": 0x8013e, + "Energy_Link": 0x8013f, + "Coin_Mode": 0x80140, + "Auto_Scroll_Levels_B": 0x80141, +} diff --git a/worlds/marioland2/sprite_randomizer.py b/worlds/marioland2/sprite_randomizer.py new file mode 100644 index 0000000000..8440da2b37 --- /dev/null +++ b/worlds/marioland2/sprite_randomizer.py @@ -0,0 +1,131 @@ +# Based on SML2R enemy and platform randomizer +# # https://github.com/slashinfty/sml2r-node/blob/862128c73d336d6cbfbf6290c09f3eff103688e8/src/index.ts#L284 + +def randomize_enemies(sprite_data, random): + for level, level_sprite_data in sprite_data.items(): + shuffle = () + if level in ("Mushroom Zone", "Macro Zone 4"): + shuffle = ("Koopa Troopa", "Goomba", "Paragoomba (Vertical)", "Paragoomba (Diagonal)") + elif level in ("Scenic Course", "Pumpkin Zone Secret Course 1"): + shuffle = ("Goomba", "Paragoomba (Vertical)", "Paragoomba (Diagonal)") + elif level == "Tree Zone 1": + shuffle = ("Money Bag/Bopping Toady", "Ragumo/Aqua Kuribo", "Pencil/Spikey", "Kyotonbo") + elif level == "Tree Zone 2": + shuffle = ("Noko Bombette/Bear", "No 48/Mogyo") + elif level == "Tree Zone 3": + shuffle = ("Battle Beetle", "Be", "Ant") + elif level == "Tree Zone 5": + shuffle = ("Paragoomba (Diagonal)", "Dondon", "Paragoomba (Vertical)") + elif level == "Pumpkin Zone 2": + shuffle = ("Boo/Bomubomu", "Kyororo", "Honebon/F Boy", "Karakara", "Star (Vertical)/Blurp (Horizontal)", + "Star (Horizontal)/Blurp (Vertical)") + elif level == "Pumpkin Zone 3": + shuffle = ("Boo/Bomubomu", "Unibo/Terekuribo") + elif level == "Mario Zone 1": + shuffle = ("Koopa Troopa", "Neiji/Buichi", "Tatenoko") + elif level == "Mario Zone 2": + shuffle = ("Paragoomba (Diagonal)", "Goomba", "Paragoomba (Vertical)", "Noko Bombette/Bear", + "Boo/Bomubomu") + elif level == "Turtle Zone 1": + shuffle = ("Horizontal Blurp", "Shark", "Cheep Cheep (Vertical)", "Paragoomba (Diagonal)", "Goomba", + "Spiny Cheep Cheep", "Paragoomba (Vertical)", + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)") + elif level == "Hippo Zone": + shuffle = ("Horizontal Blurp", "Dondon", "Unibo/Terekuribo", "Toriuo") + elif level == "Space Zone 2": + shuffle = ("Tosenbo/Pikku", "Star (Vertical)/Blurp (Horizontal)", "Star (Horizontal)/Blurp (Vertical)") + elif level == "Macro Zone 1": + shuffle = ("Kyotonbo", "Goronto", "Dokanto", "Chikunto") + elif level == "Macro Zone 2": + shuffle = ("Cheep Cheep (Vertical)", "Battle Beetle", "Be", + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "Ant") + elif level == "Macro Zone 3": + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Goomba", "Be", "Paragoomba (Vertical)", + "Honebon/F Boy") + elif level == "Pumpkin Zone Secret Course 2": + shuffle = ("Koopa Troopa", "Goomba") + for sprite in level_sprite_data: + if level == "Pumpkin Zone 1": + if sprite["sprite"] == "Falling Spike": + shuffle = ("Boo/Bomubomu", "Falling Spike", "Kurokyura/Jack-in-the-Box", "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] == "Falling Spike on Chain": + shuffle = ("Boo/Bomubomu", "Falling Spike on Chain", "Kurokyura/Jack-in-the-Box", + "Masked Ghoul/Bullet Bill") + else: + shuffle = ("Boo/Bomubomu", "Kurokyura/Jack-in-the-Box", "Masked Ghoul/Bullet Bill") + elif level == "Pumpkin Zone 4": + if sprite["sprite"] == "Falling Spike on Chain": + shuffle = ("Boo/Bomubomu", "Falling Spike on Chain", "Masked Ghoul/Bullet Bill", "Rerere/Poro", + "Tosenbo/Pikku") + else: + shuffle = ("Boo/Bomubomu", "Masked Ghoul/Bullet Bill", "Rerere/Poro", "Tosenbo/Pikku") + elif level == "Mario Zone 3": + if sprite["sprite"] == "Claw Grabber": + shuffle = ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto", "Claw Grabber", + "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] in ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto"): + shuffle = ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto", "Masked Ghoul/Bullet Bill") + else: + shuffle = () + elif level == "Mario Zone 4": + if sprite["sprite"] == "Spinning Spike/Tamara": + shuffle = ("Goomba", "Spinning Spike/Tamara", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] == "Moving Saw (Floor)": + shuffle = ("Goomba", "Moving Saw (Floor)", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + else: + shuffle = ("Goomba", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + elif level == "Turtle Zone 3": + if sprite["sprite"] == "Pencil/Spikey": + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Ragumo/Aqua Kuribo", "Pencil/Spikey", + "Paragoomba (Vertical)", "Honebon/F Boy") + else: + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Ragumo/Aqua Kuribo", + "Paragoomba (Vertical)", "Honebon/F Boy") + elif level == "Space Zone 1": + if sprite["sprite"] == "Boo/Bomubomu": + shuffle = ("Boo/Bomubomu", "No 48/Mogyo") + else: + shuffle = ("Boo/Bomubomu", "No 48/Mogyo", "Rerere/Poro") + elif level == "Mario's Castle": + if sprite["sprite"] in ("Fire Pakkun Zo (Large)", "Fire Pakkun Zo (Left)"): + shuffle = ("Fire Pakkun Zo (Large)", "Fire Pakkun Zo (Left)") + else: + shuffle = ("Spike Ball (Large)", "Spike Ball (Small)") + elif level == "Tree Zone 4": + # Deviation from SML2R: No Buichis placed into non-Buichi locations, as they can place under the + # underground question mark blocks. Potentially could make a list of which ones are allowed to become + # Buichis? + if sprite["sprite"] in ("Runaway Heart Block/Bibi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", + "Spinning Spike (Horizontal)/Unera"): + shuffle = ("Runaway Heart Block/Bibi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", "Spinning Spike (Horizontal)/Unera") + elif sprite["sprite"] == "Neiji/Buichi": + shuffle = ("Runaway Heart Block/Bibi", "Neiji/Buichi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", "Spinning Spike (Horizontal)/Unera") + else: + shuffle = () + if sprite["sprite"] in ("Piranha Plant", "Fire Piranha Plant"): + if level not in ("Pumpkin Zone 2", "Pumpkin Zone 4", "Macro Zone 3"): + shuffle = ("Piranha Plant", "Fire Piranha Plant") + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + elif level == "Mario's Castle" and sprite["sprite"] == "Karamenbo" and not random.randint(0, 9): + sprite["y"] += 1 + + +def randomize_platforms(sprite_data, random): + shuffle = ("Moving Platform (Small, Vertical)", "Moving Platform (Large, Vertical)", + "Moving Platform (Small, Horizontal)", "Moving Platform (Large, Horizontal)", + "Moving Platform (Large, Diagonal)", "Falling Platform") + for sprite in sprite_data["Tree Zone 3"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + shuffle = ("Cloud Platform (Horizontal)", "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)") + for sprite in sprite_data["Tree Zone 5"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + shuffle = ("Falling Bone Platform", "Rising Bone Platform", "Skull Platform") + for sprite in sprite_data["Mario's Castle"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) diff --git a/worlds/marioland2/sprites.py b/worlds/marioland2/sprites.py new file mode 100644 index 0000000000..33a1473129 --- /dev/null +++ b/worlds/marioland2/sprites.py @@ -0,0 +1,1016 @@ +sprite_name_to_id = { + "Ant": 93, "Ragumo/Aqua Kuribo": 32, "Battle Beetle": 51, "Be": 52, "Noko Bombette/Bear": 68, + "Runaway Heart Block/Bibi": 53, "Star (Vertical)/Blurp (Horizontal)": 94, + "Star (Horizontal)/Blurp (Vertical)": 95, "Boo/Bomubomu": 77, + "Money Bag/Bopping Toady": 31, "Neiji/Buichi": 64, "Masked Ghoul/Bullet Bill": 83, + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)": 61, "Cheep Cheep (Vertical)": 7, + "Chikunto": 39, "Dokanto": 37, "Dondon": 57, "Honebon/F Boy": 85, "Fire Pakkun Zo (Large)": 104, + "Fire Pakkun Zo (Left)": 105, "Fire Pakkun Zo (Right)": 106, "Fire Piranha Plant": 13, "Floating Face": 100, + "Genkottsu (1.5 Tiles)": 99, "Genkottsu (2 Tiles)": 98, "Goomba": 9, "Goronto": 35, + "Piranha Plant (Downward)/Grubby": 66, "Kurokyura/Jack-in-the-Box": 81, + "Karakara": 86, "Karamenbo": 102, "Kiddokatto": 72, "Koopa Troopa": 1, "Kyororo": 84, "Kyotonbo": 34, + "No 48/Mogyo": 88, "Paragoomba (Diagonal)": 8, "Paragoomba (Vertical)": 58, "Tosenbo/Pikku": 92, + "Piranha Plant": 12, "Rerere/Poro": 90, "Shark": 6, + "Spinning Platform (Horizontal)/Skeleton Bee": 62, "Pencil/Spikey": 33, + "Spiny Cheep Cheep": 11, "Spinning Spike/Tamara": 67, "Tatenoko": 75, "Unibo/Terekuribo": 87, + "Toriuo": 91, "Spinning Spike (Horizontal)/Unera": 65, "Claw Grabber": 73, + "Diagonal Ball on Chain": 71, "Falling Spike": 78, "Falling Spike on Chain": 79, "Spinning Spike (Vertical)": 80, + "Spike Ball (Large)": 110, "Spike Ball (Small)": 111, "Moving Saw (Ceiling)": 74, "Moving Saw (Floor)": 76, + "Moving Platform (Small, Vertical)": 40, "Moving Platform (Large, Vertical)": 41, + "Moving Platform (Small, Horizontal)": 42, "Moving Platform (Large, Horizontal)": 43, + "Moving Platform (Large, Diagonal)": 45, "Falling Platform": 46, "Rising Platform": 47, + "Rotating Platform (Small)": 48, "Owl Platform (Vertical)": 55, "Cloud Platform (Horizontal)": 56, + "Spinning Platform (Vertical)": 63, "Falling Bone Platform": 96, "Rising Bone Platform": 97, "Skull Platform": 103, + "Propeller Platform": 107, "Heart": 15, "Mushroom": 27, "Flower": 28, "Carrot": 29, "Star": 30, + "Mushroom Block": 17, "Flower Block": 18, "Carrot Block": 19, "Star Block": 20, "Heart Block": 21, + "Money Bag Block": 25, "Bubble": 24, "Midway Bell": 23, "Bonus Bell": 22, "Horizontal Blurp": 5, + "Big Diagonal Moving Platform": 44} + +sprite_id_to_name = {a: b for b, a in sprite_name_to_id.items()} + +level_sprites = { + "Mushroom Zone": [ + {"screen": 1, "sprite": "Goomba", "x": 27, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 9, "y": 24, "misc": 32}, + {"screen": 2, "sprite": "Mushroom Block", "x": 21, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 7, "y": 26, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 18, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 19, "y": 22, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 22, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Heart Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Goomba", "x": 5, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Midway Bell", "x": 29, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Goomba", "x": 1, "y": 30, "misc": 32}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 13, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 20, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Flower Block", "x": 25, "y": 23, "misc": 32}, + {"screen": 12, "sprite": "Heart", "x": 15, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Goomba", "x": 3, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Piranha Plant", "x": 16, "y": 30, "misc": 32}, + {"screen": 14, "sprite": "Goomba", "x": 11, "y": 22, "misc": 32}, + {"screen": 14, "sprite": "Koopa Troopa", "x": 20, "y": 22, "misc": 160}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 13, "misc": 32}], + "Tree Zone 1": [ + {"screen": 1, "sprite": "Star Block", "x": 17, "y": 21, "misc": 32}, + {"screen": 2, "sprite": "Ragumo/Aqua Kuribo", "x": 5, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Heart", "x": 19, "y": 30, "misc": 0}, + {"screen": 2, "sprite": "Ragumo/Aqua Kuribo", "x": 23, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Money Bag/Bopping Toady", "x": 1, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Money Bag/Bopping Toady", "x": 20, "y": 24, "misc": 160}, + {"screen": 4, "sprite": "Money Bag/Bopping Toady", "x": 9, "y": 24, "misc": 32}, + {"screen": 4, "sprite": "Heart", "x": 13, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Money Bag/Bopping Toady", "x": 31, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Pencil/Spikey", "x": 3, "y": 24, "misc": 160}, + {"screen": 5, "sprite": "Kyotonbo", "x": 21, "y": 22, "misc": 160}, + {"screen": 6, "sprite": "Money Bag/Bopping Toady", "x": 11, "y": 24, "misc": 160}, + {"screen": 6, "sprite": "Money Bag/Bopping Toady", "x": 23, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Pencil/Spikey", "x": 28, "y": 24, "misc": 160}, + {"screen": 7, "sprite": "Heart Block", "x": 29, "y": 5, "misc": 32}, + {"screen": 8, "sprite": "Midway Bell", "x": 13, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Money Bag/Bopping Toady", "x": 29, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Ragumo/Aqua Kuribo", "x": 10, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Kyotonbo", "x": 15, "y": 10, "misc": 160}, + {"screen": 9, "sprite": "Mushroom Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Kyotonbo", "x": 3, "y": 10, "misc": 160}, + {"screen": 10, "sprite": "Pencil/Spikey", "x": 19, "y": 24, "misc": 160}, + {"screen": 10, "sprite": "Star Block", "x": 25, "y": 21, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 7, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 27, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 31, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Money Bag/Bopping Toady", "x": 15, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Ragumo/Aqua Kuribo", "x": 3, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Money Bag/Bopping Toady", "x": 23, "y": 24, "misc": 32}, + {"screen": 14, "sprite": "Money Bag/Bopping Toady", "x": 15, "y": 30, "misc": 160}, + {"screen": 14, "sprite": "Kyotonbo", "x": 31, "y": 24, "misc": 160}, + {"screen": 15, "sprite": "Bonus Bell", "x": 19, "y": 13, "misc": 32}, + {"screen": 15, "sprite": "Heart Block", "x": 25, "y": 15, "misc": 32}], + "Tree Zone 2": [ + {"screen": 2, "sprite": "No 48/Mogyo", "x": 9, "y": 30, "misc": 0}, + {"screen": 2, "sprite": "Mushroom Block", "x": 23, "y": 19, "misc": 0}, + {"screen": 2, "sprite": "No 48/Mogyo", "x": 27, "y": 30, "misc": 0}, + {"screen": 3, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "No 48/Mogyo", "x": 15, "y": 28, "misc": 160}, + {"screen": 3, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 0}, + {"screen": 4, "sprite": "No 48/Mogyo", "x": 3, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "No 48/Mogyo", "x": 17, "y": 28, "misc": 160}, + {"screen": 5, "sprite": "Noko Bombette/Bear", "x": 1, "y": 30, "misc": 128}, + {"screen": 5, "sprite": "No 48/Mogyo", "x": 7, "y": 28, "misc": 32}, + {"screen": 6, "sprite": "Falling Platform", "x": 22, "y": 22, "misc": 0}, + {"screen": 7, "sprite": "Midway Bell", "x": 3, "y": 14, "misc": 0}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 15, "y": 30, "misc": 0}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 17, "y": 8, "misc": 32}, + {"screen": 7, "sprite": "Money Bag Block", "x": 19, "y": 19, "misc": 32}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 19, "y": 0, "misc": 32}, + {"screen": 8, "sprite": "Mushroom Block", "x": 5, "y": 13, "misc": 0}, + {"screen": 8, "sprite": "Noko Bombette/Bear", "x": 11, "y": 24, "misc": 0}, + {"screen": 8, "sprite": "Carrot Block", "x": 17, "y": 21, "misc": 64}, + {"screen": 9, "sprite": "Noko Bombette/Bear", "x": 3, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Noko Bombette/Bear", "x": 23, "y": 30, "misc": 64}, + {"screen": 10, "sprite": "Noko Bombette/Bear", "x": 11, "y": 30, "misc": 64}, + {"screen": 10, "sprite": "Noko Bombette/Bear", "x": 31, "y": 30, "misc": 64}, + {"screen": 11, "sprite": "Money Bag Block", "x": 5, "y": 19, "misc": 0}, + {"screen": 11, "sprite": "Mushroom Block", "x": 13, "y": 5, "misc": 0}, + {"screen": 11, "sprite": "Heart", "x": 19, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 3, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 5, "y": 16, "misc": 0}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 13, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Heart", "x": 27, "y": 8, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 15, "misc": 32}], + "Tree Zone 4": [ + {"screen": 1, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 11, "y": 26, "misc": 160}, + {"screen": 1, "sprite": "Runaway Heart Block/Bibi", "x": 20, "y": 24, "misc": 0}, + {"screen": 1, "sprite": "Flower Block", "x": 25, "y": 21, "misc": 32}, + {"screen": 2, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 16, "y": 24, "misc": 128}, + {"screen": 3, "sprite": "Neiji/Buichi", "x": 18, "y": 18, "misc": 0}, + {"screen": 3, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 28, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Neiji/Buichi", "x": 4, "y": 18, "misc": 0}, + {"screen": 4, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 12, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Neiji/Buichi", "x": 22, "y": 18, "misc": 0}, + {"screen": 4, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 28, "y": 30, "misc": 0}, + {"screen": 5, "sprite": "Neiji/Buichi", "x": 8, "y": 18, "misc": 128}, + {"screen": 6, "sprite": "Runaway Heart Block/Bibi", "x": 12, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 13, "y": 12, "misc": 160}, + {"screen": 6, "sprite": "Mushroom Block", "x": 19, "y": 17, "misc": 32}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 23, "y": 28, "misc": 128}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 25, "y": 18, "misc": 160}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 31, "y": 24, "misc": 160}, + {"screen": 7, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 2, "y": 24, "misc": 0}, + {"screen": 7, "sprite": "Runaway Heart Block/Bibi", "x": 28, "y": 24, "misc": 128}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 1, "y": 12, "misc": 32}, + {"screen": 8, "sprite": "Piranha Plant (Downward)/Grubby", "x": 5, "y": 28, "misc": 0}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 5, "y": 18, "misc": 32}, + {"screen": 8, "sprite": "Runaway Heart Block/Bibi", "x": 14, "y": 24, "misc": 0}, + {"screen": 8, "sprite": "Star Block", "x": 17, "y": 11, "misc": 32}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 19, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 17, "y": 19, "misc": 0}, + {"screen": 9, "sprite": "Piranha Plant (Downward)/Grubby", "x": 21, "y": 20, "misc": 0}, + {"screen": 9, "sprite": "Spinning Spike/Tamara", "x": 23, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Midway Bell", "x": 0, "y": 18, "misc": 0}, + {"screen": 10, "sprite": "Spinning Spike/Tamara", "x": 5, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Piranha Plant (Downward)/Grubby", "x": 11, "y": 20, "misc": 0}, + {"screen": 10, "sprite": "Spinning Spike/Tamara", "x": 17, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Mushroom Block", "x": 23, "y": 19, "misc": 0}, + {"screen": 12, "sprite": "Runaway Heart Block/Bibi", "x": 2, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 28, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Tree Zone 3": [ + {"screen": 0, "sprite": "Moving Platform (Large, Vertical)", "x": 19, "y": 10, "misc": 32}, + {"screen": 0, "sprite": "Carrot Block", "x": 25, "y": 25, "misc": 0}, + {"screen": 0, "sprite": "Ant", "x": 28, "y": 18, "misc": 32}, + {"screen": 1, "sprite": "Ant", "x": 0, "y": 22, "misc": 64}, + {"screen": 1, "sprite": "Battle Beetle", "x": 10, "y": 24, "misc": 64}, + {"screen": 1, "sprite": "Moving Platform (Large, Diagonal)", "x": 11, "y": 22, "misc": 32}, + {"screen": 1, "sprite": "Fire Piranha Plant", "x": 18, "y": 20, "misc": 128}, + {"screen": 1, "sprite": "Cheep Cheep (Vertical)", "x": 18, "y": 21, "misc": 0}, + {"screen": 1, "sprite": "Mushroom Block", "x": 21, "y": 15, "misc": 64}, + {"screen": 1, "sprite": "Heart Block", "x": 21, "y": 7, "misc": 64}, + {"screen": 1, "sprite": "Be", "x": 30, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Piranha Plant", "x": 4, "y": 24, "misc": 192}, + {"screen": 2, "sprite": "Be", "x": 14, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Fire Piranha Plant", "x": 20, "y": 24, "misc": 192}, + {"screen": 2, "sprite": "Falling Platform", "x": 24, "y": 27, "misc": 0}, + {"screen": 2, "sprite": "Heart Block", "x": 25, "y": 19, "misc": 0}, + {"screen": 3, "sprite": "Falling Platform", "x": 0, "y": 25, "misc": 0}, + {"screen": 3, "sprite": "Falling Platform", "x": 0, "y": 31, "misc": 32}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 4, "y": 15, "misc": 64}, + {"screen": 3, "sprite": "Falling Platform", "x": 8, "y": 31, "misc": 32}, + {"screen": 3, "sprite": "Ant", "x": 20, "y": 30, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 32}, + {"screen": 3, "sprite": "Heart Block", "x": 29, "y": 5, "misc": 32}, + {"screen": 4, "sprite": "Fire Piranha Plant", "x": 4, "y": 22, "misc": 192}, + {"screen": 4, "sprite": "Moving Platform (Small, Horizontal)", "x": 8, "y": 19, "misc": 0}, + {"screen": 4, "sprite": "Ant", "x": 12, "y": 20, "misc": 64}, + {"screen": 4, "sprite": "Moving Platform (Small, Vertical)", "x": 14, "y": 2, "misc": 64}, + {"screen": 4, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 0}, + {"screen": 4, "sprite": "Money Bag Block", "x": 27, "y": 15, "misc": 32}, + {"screen": 4, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 64}], + "Tree Zone 5": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 15, "y": 17, "misc": 64}, + {"screen": 1, "sprite": "Rotating Platform (Small)", "x": 15, "y": 19, "misc": 64}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 2, "y": 26, "misc": 192}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 16, "y": 26, "misc": 192}, + {"screen": 2, "sprite": "Heart Block", "x": 17, "y": 13, "misc": 64}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 26, "y": 26, "misc": 192}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 22, "misc": 192}, + {"screen": 3, "sprite": "Owl Platform (Vertical)", "x": 23, "y": 28, "misc": 64}, + {"screen": 4, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 11, "y": 19, "misc": 64}, + {"screen": 5, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 1, "y": 21, "misc": 64}, + {"screen": 5, "sprite": "Cloud Platform (Horizontal)", "x": 18, "y": 20, "misc": 64}, + {"screen": 5, "sprite": "Cloud Platform (Horizontal)", "x": 26, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Cloud Platform (Horizontal)", "x": 2, "y": 20, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 18, "y": 20, "misc": 64}, + {"screen": 6, "sprite": "Heart Block", "x": 23, "y": 21, "misc": 64}, + {"screen": 6, "sprite": "Dondon", "x": 30, "y": 14, "misc": 64}, + {"screen": 7, "sprite": "Carrot Block", "x": 9, "y": 19, "misc": 64}, + {"screen": 7, "sprite": "Rotating Platform (Small)", "x": 9, "y": 21, "misc": 64}, + {"screen": 7, "sprite": "Heart Block", "x": 23, "y": 13, "misc": 64}, + {"screen": 7, "sprite": "Rotating Platform (Small)", "x": 23, "y": 23, "misc": 64}, + {"screen": 8, "sprite": "Mushroom Block", "x": 21, "y": 13, "misc": 64}, + {"screen": 9, "sprite": "Star Block", "x": 5, "y": 7, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 7, "y": 14, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 27, "y": 20, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 31, "y": 16, "misc": 64}, + {"screen": 10, "sprite": "Cloud Platform (Horizontal)", "x": 20, "y": 22, "misc": 64}, + {"screen": 10, "sprite": "Paragoomba (Vertical)", "x": 31, "y": 18, "misc": 64}, + {"screen": 11, "sprite": "Cloud Platform (Horizontal)", "x": 8, "y": 22, "misc": 64}, + {"screen": 11, "sprite": "Paragoomba (Vertical)", "x": 16, "y": 25, "misc": 64}], + "Pumpkin Zone 1": [ + {"screen": 1, "sprite": "Falling Spike on Chain", "x": 9, "y": 14, "misc": 160}, + {"screen": 1, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 0}, + {"screen": 1, "sprite": "Masked Ghoul/Bullet Bill", "x": 19, "y": 30, "misc": 0}, + {"screen": 1, "sprite": "Falling Spike on Chain", "x": 27, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 17, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 23, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 29, "y": 22, "misc": 32}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 1, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 21, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 5, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Carrot Block", "x": 17, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 21, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Falling Spike", "x": 27, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Boo/Bomubomu", "x": 1, "y": 28, "misc": 0}, + {"screen": 6, "sprite": "Masked Ghoul/Bullet Bill", "x": 2, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 5, "y": 7, "misc": 0}, + {"screen": 6, "sprite": "Boo/Bomubomu", "x": 9, "y": 28, "misc": 128}, + {"screen": 6, "sprite": "Fire Piranha Plant", "x": 16, "y": 2, "misc": 192}, + {"screen": 6, "sprite": "Midway Bell", "x": 24, "y": 22, "misc": 32}, + {"screen": 7, "sprite": "Falling Spike", "x": 1, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 9, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Falling Spike", "x": 27, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 31, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 16, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Masked Ghoul/Bullet Bill", "x": 17, "y": 24, "misc": 160}, + {"screen": 8, "sprite": "Fire Piranha Plant", "x": 24, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Masked Ghoul/Bullet Bill", "x": 7, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 11, "y": 10, "misc": 160}, + {"screen": 9, "sprite": "Piranha Plant", "x": 20, "y": 14, "misc": 32}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 23, "y": 30, "misc": 128}, + {"screen": 10, "sprite": "Cheep Cheep (Vertical)", "x": 30, "y": 11, "misc": 160}, + {"screen": 11, "sprite": "Cheep Cheep (Vertical)", "x": 6, "y": 19, "misc": 32}, + {"screen": 11, "sprite": "Kurokyura/Jack-in-the-Box", "x": 11, "y": 30, "misc": 0}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 3, "misc": 32}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 11, "misc": 0}], + "Pumpkin Zone 2": [ + {"screen": 1, "sprite": "Karakara", "x": 7, "y": 30, "misc": 160}, + {"screen": 1, "sprite": "Karakara", "x": 15, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Karakara", "x": 23, "y": 30, "misc": 160}, + {"screen": 2, "sprite": "Piranha Plant", "x": 20, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Honebon/F Boy", "x": 4, "y": 11, "misc": 160}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 4, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Mushroom Block", "x": 17, "y": 21, "misc": 64}, + {"screen": 4, "sprite": "Kyororo", "x": 29, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Honebon/F Boy", "x": 6, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Kyororo", "x": 13, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Kyororo", "x": 29, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Midway Bell", "x": 1, "y": 16, "misc": 32}, + {"screen": 6, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 21, "y": 30, "misc": 192}, + {"screen": 6, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 28, "y": 25, "misc": 64}, + {"screen": 7, "sprite": "Mushroom", "x": 3, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 9, "y": 13, "misc": 160}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 13, "y": 21, "misc": 160}, + {"screen": 7, "sprite": "Heart", "x": 29, "y": 14, "misc": 32}, + {"screen": 8, "sprite": "Carrot", "x": 7, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Flower", "x": 13, "y": 14, "misc": 32}, + {"screen": 8, "sprite": "Heart", "x": 19, "y": 20, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 1, "y": 13, "misc": 32}, + {"screen": 9, "sprite": "Kyororo", "x": 19, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 20, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Kyororo", "x": 21, "y": 16, "misc": 32}, + {"screen": 10, "sprite": "Kyororo", "x": 5, "y": 14, "misc": 32}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 7, "y": 28, "misc": 32}, + {"screen": 10, "sprite": "Kyororo", "x": 22, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 0, "y": 26, "misc": 192}, + {"screen": 11, "sprite": "Falling Spike", "x": 5, "y": 24, "misc": 64}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 7, "y": 30, "misc": 32}, + {"screen": 11, "sprite": "Kyororo", "x": 10, "y": 16, "misc": 32}, + {"screen": 11, "sprite": "Falling Spike", "x": 15, "y": 24, "misc": 64}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 19, "y": 28, "misc": 192}, + {"screen": 12, "sprite": "Karakara", "x": 9, "y": 30, "misc": 32}, + {"screen": 12, "sprite": "Karakara", "x": 17, "y": 30, "misc": 32}, + {"screen": 12, "sprite": "Karakara", "x": 25, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Karakara", "x": 19, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 32}], + "Pumpkin Zone 3": [ + {"screen": 1, "sprite": "Unibo/Terekuribo", "x": 21, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Unibo/Terekuribo", "x": 21, "y": 20, "misc": 160}, + {"screen": 3, "sprite": "Carrot Block", "x": 9, "y": 7, "misc": 32}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 19, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Boo/Bomubomu", "x": 1, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Boo/Bomubomu", "x": 19, "y": 14, "misc": 160}, + {"screen": 6, "sprite": "Moving Platform (Small, Horizontal)", "x": 0, "y": 8, "misc": 64}, + {"screen": 6, "sprite": "Moving Platform (Small, Horizontal)", "x": 0, "y": 14, "misc": 64}, + {"screen": 6, "sprite": "Flower Block", "x": 17, "y": 19, "misc": 64}, + {"screen": 7, "sprite": "Unibo/Terekuribo", "x": 1, "y": 26, "misc": 32}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 17, "y": 18, "misc": 64}, + {"screen": 8, "sprite": "Fire Piranha Plant", "x": 16, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Heart Block", "x": 23, "y": 5, "misc": 64}, + {"screen": 8, "sprite": "Flower Block", "x": 25, "y": 17, "misc": 64}, + {"screen": 9, "sprite": "Midway Bell", "x": 5, "y": 22, "misc": 32}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 19, "y": 22, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 2, "y": 27, "misc": 32}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 25, "y": 14, "misc": 160}, + {"screen": 11, "sprite": "Carrot Block", "x": 7, "y": 13, "misc": 32}, + {"screen": 11, "sprite": "Boo/Bomubomu", "x": 23, "y": 18, "misc": 160}, + {"screen": 13, "sprite": "Boo/Bomubomu", "x": 3, "y": 28, "misc": 32}, + {"screen": 13, "sprite": "Boo/Bomubomu", "x": 12, "y": 5, "misc": 64}, + {"screen": 14, "sprite": "Unibo/Terekuribo", "x": 3, "y": 28, "misc": 160}, + {"screen": 14, "sprite": "Boo/Bomubomu", "x": 5, "y": 18, "misc": 192}, + {"screen": 14, "sprite": "Unibo/Terekuribo", "x": 14, "y": 24, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 13, "misc": 64}], + "Pumpkin Zone 4": [ + {"screen": 1, "sprite": "Tosenbo/Pikku", "x": 19, "y": 30, "misc": 160}, + {"screen": 1, "sprite": "Piranha Plant", "x": 24, "y": 0, "misc": 64}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 9, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 24, "y": 21, "misc": 160}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 23, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Falling Spike on Chain", "x": 29, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Falling Spike on Chain", "x": 3, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Falling Spike on Chain", "x": 9, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Tosenbo/Pikku", "x": 28, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 7, "y": 11, "misc": 64}, + {"screen": 5, "sprite": "Boo/Bomubomu", "x": 17, "y": 26, "misc": 192}, + {"screen": 5, "sprite": "Heart Block", "x": 29, "y": 15, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 7, "sprite": "Midway Bell", "x": 15, "y": 24, "misc": 32}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 3, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Rerere/Poro", "x": 10, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 17, "y": 22, "misc": 160}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 27, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Rerere/Poro", "x": 3, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 9, "y": 22, "misc": 160}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 19, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 25, "y": 26, "misc": 160}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 31, "y": 22, "misc": 32}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 5, "y": 18, "misc": 32}, + {"screen": 12, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 16, "misc": 192}, + {"screen": 12, "sprite": "Masked Ghoul/Bullet Bill", "x": 25, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 6, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Flower Block", "x": 13, "y": 23, "misc": 32}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 18, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Money Bag Block", "x": 25, "y": 23, "misc": 32}, + {"screen": 14, "sprite": "Boo/Bomubomu", "x": 13, "y": 30, "misc": 160}], + "Mario Zone 1": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 5, "y": 23, "misc": 64}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 7, "y": 9, "misc": 64}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 13, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 13, "y": 30, "misc": 192}, + {"screen": 1, "sprite": "Spinning Spike (Vertical)", "x": 19, "y": 22, "misc": 0}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 19, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 13, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 25, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Spinning Platform (Vertical)", "x": 1, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Spinning Platform (Vertical)", "x": 7, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 19, "y": 26, "misc": 192}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 31, "y": 14, "misc": 192}, + {"screen": 4, "sprite": "Spinning Platform (Vertical)", "x": 23, "y": 20, "misc": 64}, + {"screen": 4, "sprite": "Tatenoko", "x": 26, "y": 15, "misc": 192}, + {"screen": 4, "sprite": "Spinning Platform (Vertical)", "x": 29, "y": 20, "misc": 64}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 16, "misc": 192}, + {"screen": 5, "sprite": "Spinning Platform (Vertical)", "x": 19, "y": 22, "misc": 64}, + {"screen": 5, "sprite": "Spinning Platform (Vertical)", "x": 23, "y": 22, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 5, "y": 11, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 16, "y": 12, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 19, "y": 20, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 24, "misc": 192}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 12, "y": 30, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 13, "y": 17, "misc": 64}, + {"screen": 9, "sprite": "Mushroom Block", "x": 3, "y": 19, "misc": 64}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 3, "y": 0, "misc": 96}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 11, "y": 0, "misc": 224}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 19, "y": 0, "misc": 224}, + {"screen": 9, "sprite": "Heart Block", "x": 27, "y": 7, "misc": 32}, + {"screen": 9, "sprite": "Spinning Platform (Vertical)", "x": 29, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Tatenoko", "x": 4, "y": 13, "misc": 32}, + {"screen": 10, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 7, "y": 21, "misc": 64}, + {"screen": 10, "sprite": "Carrot Block", "x": 9, "y": 7, "misc": 32}, + {"screen": 10, "sprite": "Spinning Platform (Vertical)", "x": 9, "y": 18, "misc": 32}, + {"screen": 10, "sprite": "Bonus Bell", "x": 19, "y": 17, "misc": 64}], + "Mario Zone 2": [ + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 9, "y": 28, "misc": 32}, + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 31, "y": 22, "misc": 160}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 18, "misc": 160}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 15, "y": 21, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 3, "y": 20, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 12, "y": 18, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 28, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 3, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Heart", "x": 8, "y": 28, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 9, "y": 20, "misc": 192}, + {"screen": 5, "sprite": "Carrot Block", "x": 17, "y": 11, "misc": 64}, + {"screen": 5, "sprite": "Goomba", "x": 25, "y": 26, "misc": 192}, + {"screen": 5, "sprite": "Money Bag Block", "x": 27, "y": 19, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 3, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Star Block", "x": 7, "y": 11, "misc": 64}, + {"screen": 7, "sprite": "Noko Bombette/Bear", "x": 6, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Midway Bell", "x": 5, "y": 18, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 21, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 31, "y": 16, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 32}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 19, "y": 20, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 5, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Mushroom", "x": 1, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Goomba", "x": 9, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Flower", "x": 17, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Carrot", "x": 25, "y": 14, "misc": 32}, + {"screen": 12, "sprite": "Boo/Bomubomu", "x": 12, "y": 16, "misc": 32}, + {"screen": 12, "sprite": "Boo/Bomubomu", "x": 24, "y": 20, "misc": 160}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 16, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Noko Bombette/Bear", "x": 12, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Mario Zone 3": [ + {"screen": 1, "sprite": "Kurokyura/Jack-in-the-Box", "x": 15, "y": 23, "misc": 160}, + {"screen": 1, "sprite": "Kiddokatto", "x": 21, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Masked Ghoul/Bullet Bill", "x": 4, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Diagonal Ball on Chain", "x": 9, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Diagonal Ball on Chain", "x": 1, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Mushroom Block", "x": 13, "y": 17, "misc": 32}, + {"screen": 3, "sprite": "Diagonal Ball on Chain", "x": 25, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 160}, + {"screen": 4, "sprite": "Diagonal Ball on Chain", "x": 27, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 160}, + {"screen": 6, "sprite": "Carrot Block", "x": 9, "y": 21, "misc": 32}, + {"screen": 6, "sprite": "Kiddokatto", "x": 25, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 28, "misc": 32}, + {"screen": 7, "sprite": "Midway Bell", "x": 27, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Kurokyura/Jack-in-the-Box", "x": 11, "y": 21, "misc": 32}, + {"screen": 8, "sprite": "Heart Block", "x": 13, "y": 3, "misc": 32}, + {"screen": 8, "sprite": "Kiddokatto", "x": 31, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Claw Grabber", "x": 23, "y": 28, "misc": 32}, + {"screen": 10, "sprite": "Claw Grabber", "x": 13, "y": 28, "misc": 32}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 4, "y": 28, "misc": 64}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 5, "y": 20, "misc": 160}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 8, "y": 12, "misc": 192}, + {"screen": 11, "sprite": "Kiddokatto", "x": 26, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 23, "misc": 64}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 28, "y": 18, "misc": 192}, + {"screen": 12, "sprite": "Claw Grabber", "x": 11, "y": 28, "misc": 32}, + {"screen": 12, "sprite": "Kiddokatto", "x": 21, "y": 20, "misc": 32}, + {"screen": 13, "sprite": "Mushroom Block", "x": 13, "y": 21, "misc": 32}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 18, "y": 28, "misc": 160}, + {"screen": 13, "sprite": "Kurokyura/Jack-in-the-Box", "x": 25, "y": 21, "misc": 32}, + {"screen": 14, "sprite": "Diagonal Ball on Chain", "x": 9, "y": 30, "misc": 32}, + {"screen": 14, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 24, "misc": 160}, + {"screen": 15, "sprite": "Claw Grabber", "x": 3, "y": 18, "misc": 32}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Mario Zone 4": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 9, "y": 17, "misc": 32}, + {"screen": 1, "sprite": "Spinning Spike/Tamara", "x": 9, "y": 25, "misc": 160}, + {"screen": 1, "sprite": "Spinning Spike/Tamara", "x": 29, "y": 25, "misc": 32}, + {"screen": 2, "sprite": "Masked Ghoul/Bullet Bill", "x": 12, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Spinning Spike/Tamara", "x": 29, "y": 21, "misc": 160}, + {"screen": 3, "sprite": "Spinning Spike/Tamara", "x": 15, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 26, "misc": 160}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 24, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 2, "y": 26, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 22, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 2, "y": 14, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 14, "y": 8, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 26, "y": 2, "misc": 32}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 9, "y": 25, "misc": 160}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 15, "y": 21, "misc": 32}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 21, "y": 25, "misc": 160}, + {"screen": 7, "sprite": "Mushroom Block", "x": 25, "y": 23, "misc": 0}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 17, "y": 26, "misc": 128}, + {"screen": 8, "sprite": "Masked Ghoul/Bullet Bill", "x": 30, "y": 24, "misc": 0}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 11, "y": 30, "misc": 128}, + {"screen": 9, "sprite": "Midway Bell", "x": 16, "y": 24, "misc": 0}, + {"screen": 9, "sprite": "Goomba", "x": 26, "y": 30, "misc": 0}, + {"screen": 10, "sprite": "Moving Saw (Ceiling)", "x": 17, "y": 26, "misc": 0}, + {"screen": 10, "sprite": "Moving Saw (Floor)", "x": 19, "y": 22, "misc": 128}, + {"screen": 11, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 0}, + {"screen": 11, "sprite": "Moving Saw (Ceiling)", "x": 25, "y": 26, "misc": 128}, + {"screen": 11, "sprite": "Moving Saw (Floor)", "x": 27, "y": 22, "misc": 0}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 29, "y": 30, "misc": 0}, + {"screen": 13, "sprite": "Moving Saw (Floor)", "x": 9, "y": 28, "misc": 128}, + {"screen": 13, "sprite": "Moving Saw (Floor)", "x": 19, "y": 28, "misc": 0}, + {"screen": 14, "sprite": "Spinning Spike/Tamara", "x": 13, "y": 25, "misc": 0}, + {"screen": 14, "sprite": "Goomba", "x": 21, "y": 30, "misc": 128}], + "Turtle Zone 1": [ + {"screen": 1, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 2, "y": 16, "misc": 192}, + {"screen": 1, "sprite": "Horizontal Blurp", "x": 12, "y": 21, "misc": 64}, + {"screen": 1, "sprite": "Mushroom Block", "x": 13, "y": 3, "misc": 64}, + {"screen": 2, "sprite": "Horizontal Blurp", "x": 1, "y": 18, "misc": 64}, + {"screen": 2, "sprite": "Spiny Cheep Cheep", "x": 11, "y": 26, "misc": 64}, + {"screen": 2, "sprite": "Cheep Cheep (Vertical)", "x": 26, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Goomba", "x": 3, "y": 8, "misc": 64}, + {"screen": 3, "sprite": "Goomba", "x": 17, "y": 8, "misc": 64}, + {"screen": 3, "sprite": "Star Block", "x": 17, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 18, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Heart Block", "x": 19, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Shark", "x": 27, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Paragoomba (Diagonal)", "x": 1, "y": 4, "misc": 64}, + {"screen": 4, "sprite": "Goomba", "x": 10, "y": 8, "misc": 64}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 1, "y": 16, "misc": 64}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 9, "y": 22, "misc": 192}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 16, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Shark", "x": 12, "y": 21, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 21, "y": 18, "misc": 64}, + {"screen": 6, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 25, "y": 16, "misc": 64}, + {"screen": 7, "sprite": "Spiny Cheep Cheep", "x": 21, "y": 17, "misc": 64}, + {"screen": 7, "sprite": "Horizontal Blurp", "x": 25, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Cheep Cheep (Vertical)", "x": 7, "y": 20, "misc": 64}, + {"screen": 8, "sprite": "Shark", "x": 15, "y": 14, "misc": 192}, + {"screen": 8, "sprite": "Spiny Cheep Cheep", "x": 25, "y": 24, "misc": 192}, + {"screen": 8, "sprite": "Mushroom Block", "x": 31, "y": 3, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 15, "y": 24, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 23, "y": 20, "misc": 192}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 29, "y": 26, "misc": 192}, + {"screen": 10, "sprite": "Shark", "x": 10, "y": 18, "misc": 192}, + {"screen": 10, "sprite": "Money Bag Block", "x": 11, "y": 31, "misc": 32}, + {"screen": 11, "sprite": "Shark", "x": 5, "y": 22, "misc": 64}, + {"screen": 11, "sprite": "Horizontal Blurp", "x": 16, "y": 28, "misc": 192}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 9, "misc": 64}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 23, "misc": 64}], + "Turtle Zone 2": [ + {"screen": 0, "sprite": "Shark", "x": 17, "y": 12, "misc": 192}, + {"screen": 0, "sprite": "Carrot Block", "x": 21, "y": 19, "misc": 64}, + {"screen": 0, "sprite": "Masked Ghoul/Bullet Bill", "x": 22, "y": 28, "misc": 192}, + {"screen": 1, "sprite": "Honebon/F Boy", "x": 13, "y": 12, "misc": 192}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Karakara", "x": 28, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Shark", "x": 7, "y": 10, "misc": 64}, + {"screen": 2, "sprite": "Karakara", "x": 17, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Karakara", "x": 23, "y": 22, "misc": 64}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 25, "y": 14, "misc": 32}, + {"screen": 3, "sprite": "Karakara", "x": 2, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Karakara", "x": 6, "y": 14, "misc": 192}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 192}, + {"screen": 3, "sprite": "Flower Block", "x": 21, "y": 11, "misc": 64}, + {"screen": 4, "sprite": "Pencil/Spikey", "x": 7, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 10, "y": 14, "misc": 160}, + {"screen": 4, "sprite": "Pencil/Spikey", "x": 11, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Karakara", "x": 21, "y": 22, "misc": 64}, + {"screen": 4, "sprite": "Karakara", "x": 28, "y": 12, "misc": 192}, + {"screen": 5, "sprite": "Pencil/Spikey", "x": 1, "y": 24, "misc": 192}, + {"screen": 5, "sprite": "Star Block", "x": 5, "y": 5, "misc": 64}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 24, "misc": 192}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 30, "y": 10, "misc": 32}, + {"screen": 6, "sprite": "Masked Ghoul/Bullet Bill", "x": 6, "y": 28, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 10, "y": 22, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 14, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Midway Bell", "x": 15, "y": 4, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 18, "y": 10, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 26, "y": 2, "misc": 64}, + {"screen": 7, "sprite": "Karakara", "x": 8, "y": 14, "misc": 160}, + {"screen": 7, "sprite": "Karakara", "x": 19, "y": 27, "misc": 192}, + {"screen": 8, "sprite": "Flower", "x": 5, "y": 4, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 7, "y": 3, "misc": 64}, + {"screen": 8, "sprite": "Pencil/Spikey", "x": 11, "y": 24, "misc": 32}, + {"screen": 8, "sprite": "Money Bag Block", "x": 23, "y": 13, "misc": 64}, + {"screen": 9, "sprite": "Pencil/Spikey", "x": 9, "y": 24, "misc": 192}, + {"screen": 9, "sprite": "Pencil/Spikey", "x": 19, "y": 24, "misc": 64}, + {"screen": 10, "sprite": "Rising Platform", "x": 4, "y": 22, "misc": 64}, + {"screen": 10, "sprite": "Rising Platform", "x": 10, "y": 16, "misc": 64}, + {"screen": 10, "sprite": "Bonus Bell", "x": 21, "y": 9, "misc": 64}, + {"screen": 12, "sprite": "Pencil/Spikey", "x": 5, "y": 24, "misc": 192}, + {"screen": 12, "sprite": "Pencil/Spikey", "x": 9, "y": 24, "misc": 192}, + {"screen": 12, "sprite": "Karakara", "x": 19, "y": 24, "misc": 64}, + {"screen": 12, "sprite": "Karakara", "x": 26, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Karakara", "x": 1, "y": 26, "misc": 192}, + {"screen": 13, "sprite": "Pencil/Spikey", "x": 15, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Honebon/F Boy", "x": 24, "y": 28, "misc": 192}, + {"screen": 14, "sprite": "Pencil/Spikey", "x": 1, "y": 24, "misc": 192}, + {"screen": 14, "sprite": "Shark", "x": 14, "y": 26, "misc": 64}], + "Turtle Zone 3": [ + {"screen": 1, "sprite": "Ragumo/Aqua Kuribo", "x": 1, "y": 26, "misc": 160}, + {"screen": 1, "sprite": "Ragumo/Aqua Kuribo", "x": 31, "y": 22, "misc": 160}, + {"screen": 2, "sprite": "Carrot Block", "x": 15, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Pencil/Spikey", "x": 29, "y": 14, "misc": 160}, + {"screen": 3, "sprite": "Pencil/Spikey", "x": 13, "y": 22, "misc": 160}, + {"screen": 3, "sprite": "Pencil/Spikey", "x": 21, "y": 26, "misc": 32}, + {"screen": 4, "sprite": "Ragumo/Aqua Kuribo", "x": 5, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Vertical)", "x": 0, "y": 24, "misc": 160}, + {"screen": 5, "sprite": "Midway Bell", "x": 12, "y": 18, "misc": 32}, + {"screen": 5, "sprite": "Ragumo/Aqua Kuribo", "x": 27, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 29, "y": 19, "misc": 32}, + {"screen": 6, "sprite": "Honebon/F Boy", "x": 1, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Ragumo/Aqua Kuribo", "x": 7, "y": 20, "misc": 160}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 24, "y": 20, "misc": 160}, + {"screen": 7, "sprite": "Ragumo/Aqua Kuribo", "x": 6, "y": 28, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 27, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Ragumo/Aqua Kuribo", "x": 7, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Ragumo/Aqua Kuribo", "x": 19, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 9, "sprite": "Honebon/F Boy", "x": 27, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Money Bag Block", "x": 29, "y": 11, "misc": 32}, + {"screen": 11, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 24, "misc": 160}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 160}], + "Hippo Zone": [ + {"screen": 0, "sprite": "Money Bag Block", "x": 5, "y": 7, "misc": 32}, + {"screen": 0, "sprite": "Heart Block", "x": 7, "y": 5, "misc": 0}, + {"screen": 0, "sprite": "Heart Block", "x": 31, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Heart Block", "x": 1, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Bubble", "x": 6, "y": 24, "misc": 0}, + {"screen": 1, "sprite": "Mushroom Block", "x": 27, "y": 9, "misc": 32}, + {"screen": 2, "sprite": "Toriuo", "x": 11, "y": 8, "misc": 160}, + {"screen": 2, "sprite": "Unibo/Terekuribo", "x": 25, "y": 26, "misc": 128}, + {"screen": 2, "sprite": "Toriuo", "x": 29, "y": 8, "misc": 160}, + {"screen": 3, "sprite": "Toriuo", "x": 11, "y": 8, "misc": 32}, + {"screen": 3, "sprite": "Unibo/Terekuribo", "x": 17, "y": 26, "misc": 128}, + {"screen": 3, "sprite": "Heart Block", "x": 17, "y": 25, "misc": 0}, + {"screen": 4, "sprite": "Toriuo", "x": 3, "y": 8, "misc": 160}, + {"screen": 4, "sprite": "Unibo/Terekuribo", "x": 9, "y": 26, "misc": 128}, + {"screen": 4, "sprite": "Toriuo", "x": 21, "y": 8, "misc": 32}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 6, "y": 10, "misc": 160}, + {"screen": 5, "sprite": "Mushroom Block", "x": 13, "y": 11, "misc": 32}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 19, "y": 12, "misc": 32}, + {"screen": 5, "sprite": "Unibo/Terekuribo", "x": 25, "y": 10, "misc": 128}, + {"screen": 5, "sprite": "Unibo/Terekuribo", "x": 27, "y": 18, "misc": 0}, + {"screen": 6, "sprite": "Unibo/Terekuribo", "x": 7, "y": 22, "misc": 128}, + {"screen": 6, "sprite": "Unibo/Terekuribo", "x": 11, "y": 12, "misc": 128}, + {"screen": 6, "sprite": "Horizontal Blurp", "x": 13, "y": 14, "misc": 160}, + {"screen": 6, "sprite": "Bubble", "x": 14, "y": 30, "misc": 0}, + {"screen": 7, "sprite": "Dondon", "x": 13, "y": 10, "misc": 128}, + {"screen": 7, "sprite": "Dondon", "x": 15, "y": 18, "misc": 128}, + {"screen": 7, "sprite": "Dondon", "x": 17, "y": 26, "misc": 0}, + {"screen": 7, "sprite": "Toriuo", "x": 25, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Toriuo", "x": 5, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Flower Block", "x": 19, "y": 25, "misc": 0}, + {"screen": 8, "sprite": "Toriuo", "x": 21, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Toriuo", "x": 31, "y": 8, "misc": 32}, + {"screen": 9, "sprite": "Money Bag Block", "x": 11, "y": 5, "misc": 0}, + {"screen": 9, "sprite": "Horizontal Blurp", "x": 15, "y": 12, "misc": 160}, + {"screen": 9, "sprite": "Horizontal Blurp", "x": 27, "y": 10, "misc": 160}, + {"screen": 10, "sprite": "Dondon", "x": 9, "y": 14, "misc": 0}, + {"screen": 10, "sprite": "Dondon", "x": 13, "y": 24, "misc": 0}, + {"screen": 10, "sprite": "Toriuo", "x": 19, "y": 8, "misc": 32}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 5, "misc": 0}], + "Space Zone 1": [ + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 19, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 3, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 5, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Rerere/Poro", "x": 25, "y": 5, "misc": 160}, + {"screen": 4, "sprite": "Money Bag Block", "x": 9, "y": 21, "misc": 0}, + {"screen": 4, "sprite": "Money Bag Block", "x": 11, "y": 29, "misc": 0}, + {"screen": 4, "sprite": "Heart", "x": 13, "y": 6, "misc": 32}, + {"screen": 4, "sprite": "Mushroom Block", "x": 23, "y": 15, "misc": 32}, + {"screen": 5, "sprite": "No 48/Mogyo", "x": 1, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Heart", "x": 5, "y": 16, "misc": 0}, + {"screen": 5, "sprite": "Boo/Bomubomu", "x": 23, "y": 28, "misc": 160}, + {"screen": 6, "sprite": "Rerere/Poro", "x": 18, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 5, "y": 11, "misc": 32}, + {"screen": 7, "sprite": "Rerere/Poro", "x": 6, "y": 20, "misc": 160}, + {"screen": 7, "sprite": "Midway Bell", "x": 15, "y": 22, "misc": 32}, + {"screen": 7, "sprite": "Rerere/Poro", "x": 19, "y": 13, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 1, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Money Bag Block", "x": 7, "y": 21, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 17, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Heart Block", "x": 3, "y": 15, "misc": 0}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 8, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Rerere/Poro", "x": 31, "y": 15, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 31, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Boo/Bomubomu", "x": 3, "y": 28, "misc": 32}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 32}], + "Space Zone 2": [ + {"screen": 2, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 5, "y": 22, "misc": 128}, + {"screen": 2, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 25, "y": 16, "misc": 128}, + {"screen": 2, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 27, "y": 30, "misc": 128}, + {"screen": 3, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 11, "y": 10, "misc": 128}, + {"screen": 4, "sprite": "Mushroom", "x": 1, "y": 6, "misc": 0}, + {"screen": 4, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 3, "y": 30, "misc": 128}, + {"screen": 4, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 23, "y": 26, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 1, "y": 22, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 9, "y": 26, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 27, "y": 14, "misc": 0}, + {"screen": 6, "sprite": "Mushroom Block", "x": 13, "y": 15, "misc": 0}, + {"screen": 6, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 19, "y": 18, "misc": 128}, + {"screen": 7, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 22, "misc": 128}, + {"screen": 7, "sprite": "Mushroom Block", "x": 17, "y": 9, "misc": 0}, + {"screen": 7, "sprite": "Tosenbo/Pikku", "x": 27, "y": 24, "misc": 128}, + {"screen": 8, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 3, "y": 16, "misc": 128}, + {"screen": 9, "sprite": "Tosenbo/Pikku", "x": 3, "y": 16, "misc": 0}, + {"screen": 9, "sprite": "Tosenbo/Pikku", "x": 25, "y": 16, "misc": 0}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 16, "misc": 128}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 25, "y": 16, "misc": 128}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 15, "y": 20, "misc": 128}, + {"screen": 11, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 25, "y": 22, "misc": 0}, + {"screen": 12, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 5, "y": 16, "misc": 128}, + {"screen": 12, "sprite": "Mushroom Block", "x": 31, "y": 11, "misc": 0}, + {"screen": 13, "sprite": "Star Block", "x": 5, "y": 17, "misc": 0}, + {"screen": 13, "sprite": "Tosenbo/Pikku", "x": 7, "y": 17, "misc": 128}, + {"screen": 13, "sprite": "Midway Bell", "x": 19, "y": 20, "misc": 0}, + {"screen": 13, "sprite": "Mushroom", "x": 31, "y": 6, "misc": 0}, + {"screen": 15, "sprite": "Tosenbo/Pikku", "x": 1, "y": 26, "misc": 128}, + {"screen": 15, "sprite": "Mushroom Block", "x": 17, "y": 19, "misc": 0}], + "Macro Zone 1": [ + {"screen": 1, "sprite": "Kyotonbo", "x": 1, "y": 22, "misc": 0}, + {"screen": 1, "sprite": "Goronto", "x": 23, "y": 26, "misc": 128}, + {"screen": 2, "sprite": "Moving Platform (Large, Horizontal)", "x": 20, "y": 31, + "misc": 64}, {"screen": 3, "sprite": "Chikunto", "x": 1, "y": 16, "misc": 64}, + {"screen": 3, "sprite": "Mushroom Block", "x": 3, "y": 21, "misc": 64}, + {"screen": 4, "sprite": "Chikunto", "x": 19, "y": 28, "misc": 192}, + {"screen": 5, "sprite": "Big Diagonal Moving Platform", "x": 12, "y": 23, + "misc": 64}, + {"screen": 5, "sprite": "Moving Platform (Large, Horizontal)", "x": 14, "y": 31, + "misc": 64}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 13, "misc": 64}, + {"screen": 6, "sprite": "Dokanto", "x": 25, "y": 28, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 31, "y": 27, "misc": 64}, + {"screen": 7, "sprite": "Kyotonbo", "x": 27, "y": 28, "misc": 64}, + {"screen": 8, "sprite": "Flower Block", "x": 1, "y": 27, "misc": 64}, + {"screen": 8, "sprite": "Chikunto", "x": 9, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Heart Block", "x": 11, "y": 27, "misc": 64}, + {"screen": 9, "sprite": "Chikunto", "x": 19, "y": 28, "misc": 192}, + {"screen": 9, "sprite": "Money Bag Block", "x": 25, "y": 27, "misc": 64}, + {"screen": 9, "sprite": "Goronto", "x": 29, "y": 28, "misc": 64}, + {"screen": 10, "sprite": "Heart Block", "x": 9, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Heart Block", "x": 13, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Midway Bell", "x": 15, "y": 26, "misc": 64}, + {"screen": 10, "sprite": "Heart Block", "x": 21, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Moving Platform (Large, Horizontal)", "x": 30, "y": 31, + "misc": 64}, + {"screen": 11, "sprite": "Carrot Block", "x": 3, "y": 15, "misc": 64}, + {"screen": 11, "sprite": "Falling Platform", "x": 26, "y": 17, "misc": 64}, + {"screen": 12, "sprite": "Moving Platform (Large, Horizontal)", "x": 28, "y": 31, + "misc": 64}, {"screen": 13, "sprite": "Kyotonbo", "x": 3, "y": 18, "misc": 192}, + {"screen": 13, "sprite": "Chikunto", "x": 17, "y": 28, "misc": 64}, + {"screen": 13, "sprite": "Dokanto", "x": 25, "y": 18, "misc": 64}, + {"screen": 14, "sprite": "Kyotonbo", "x": 0, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Moving Platform (Large, Horizontal)", "x": 0, "y": 31, + "misc": 64}, {"screen": 14, "sprite": "Goronto", "x": 12, "y": 26, "misc": 32}, + {"screen": 14, "sprite": "Dokanto", "x": 19, "y": 28, "misc": 192}, + {"screen": 14, "sprite": "Flower Block", "x": 21, "y": 21, "misc": 64}, + {"screen": 15, "sprite": "Big Diagonal Moving Platform", "x": 13, "y": 21, + "misc": 64}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 64}], + "Macro Zone 2": [ + {"screen": 1, "sprite": "Ant", "x": 10, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Mushroom Block", "x": 19, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Piranha Plant", "x": 28, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Ant", "x": 21, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Battle Beetle", "x": 23, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Ant", "x": 5, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Fire Piranha Plant", "x": 22, "y": 2, "misc": 192}, + {"screen": 4, "sprite": "Ant", "x": 8, "y": 26, "misc": 160}, + {"screen": 4, "sprite": "Fire Piranha Plant", "x": 18, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Battle Beetle", "x": 16, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 5, "y": 26, "misc": 192}, + {"screen": 6, "sprite": "Carrot Block", "x": 7, "y": 15, "misc": 64}, + {"screen": 6, "sprite": "Ant", "x": 16, "y": 18, "misc": 64}, + {"screen": 7, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 0, "y": 23, "misc": 192}, + {"screen": 7, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 11, "y": 28, "misc": 64}, + {"screen": 7, "sprite": "Fire Piranha Plant", "x": 30, "y": 20, "misc": 192}, + {"screen": 8, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 15, "y": 28, "misc": 64}, + {"screen": 8, "sprite": "Star Block", "x": 19, "y": 9, "misc": 64}, + {"screen": 8, "sprite": "Piranha Plant", "x": 30, "y": 22, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 11, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 17, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Midway Bell", "x": 31, "y": 14, "misc": 64}, + {"screen": 10, "sprite": "Ant", "x": 1, "y": 18, "misc": 64}, + {"screen": 10, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 31, "y": 28, "misc": 64}, + {"screen": 11, "sprite": "Ant", "x": 3, "y": 16, "misc": 64}, + {"screen": 11, "sprite": "Star Block", "x": 9, "y": 15, "misc": 64}, + {"screen": 11, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 19, "y": 15, "misc": 160}, + {"screen": 11, "sprite": "Cheep Cheep (Vertical)", "x": 21, "y": 29, "misc": 64}, + {"screen": 12, "sprite": "Be", "x": 9, "y": 14, "misc": 32}, + {"screen": 12, "sprite": "Be", "x": 21, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Be", "x": 27, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 15, "misc": 32}], + "Macro Zone 3": [ + {"screen": 1, "sprite": "Koopa Troopa", "x": 0, "y": 26, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 9, "y": 22, "misc": 32}, + {"screen": 1, "sprite": "Carrot Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 23, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 4, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 29, "y": 26, "misc": 32}, + {"screen": 3, "sprite": "Piranha Plant", "x": 28, "y": 2, "misc": 64}, + {"screen": 4, "sprite": "Piranha Plant (Downward)/Grubby", "x": 4, "y": 25, "misc": 160}, + {"screen": 4, "sprite": "Goomba", "x": 14, "y": 30, "misc": 160}, + {"screen": 4, "sprite": "Goomba", "x": 30, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant (Downward)/Grubby", "x": 8, "y": 25, "misc": 32}, + {"screen": 5, "sprite": "Money Bag Block", "x": 11, "y": 21, "misc": 64}, + {"screen": 5, "sprite": "Honebon/F Boy", "x": 11, "y": 30, "misc": 64}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 23, "y": 28, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 15, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 23, "y": 26, "misc": 64}, + {"screen": 7, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 11, "y": 26, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 3, "y": 5, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 7, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 17, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Star Block", "x": 29, "y": 23, "misc": 64}, + {"screen": 8, "sprite": "Midway Bell", "x": 31, "y": 22, "misc": 32}, + {"screen": 9, "sprite": "Be", "x": 31, "y": 18, "misc": 32}, + {"screen": 10, "sprite": "Be", "x": 11, "y": 18, "misc": 32}, + {"screen": 11, "sprite": "Piranha Plant", "x": 16, "y": 24, "misc": 160}, + {"screen": 12, "sprite": "Carrot Block", "x": 23, "y": 17, "misc": 32}, + {"screen": 13, "sprite": "Koopa Troopa", "x": 7, "y": 4, "misc": 160}, + {"screen": 13, "sprite": "Paragoomba (Vertical)", "x": 15, "y": 24, "misc": 128}, + {"screen": 13, "sprite": "Bonus Bell", "x": 23, "y": 5, "misc": 0}], + "Macro Zone 4": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 7, "y": 28, "misc": 160}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 17, "y": 24, "misc": 32}, + {"screen": 2, "sprite": "Runaway Heart Block/Bibi", "x": 5, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 11, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 21, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Piranha Plant", "x": 6, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant (Downward)/Grubby", "x": 4, "y": 25, "misc": 32}, + {"screen": 5, "sprite": "Money Bag Block", "x": 11, "y": 7, "misc": 32}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Goomba", "x": 7, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Goomba", "x": 11, "y": 18, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 25, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Runaway Heart Block/Bibi", "x": 5, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Fire Piranha Plant", "x": 24, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Midway Bell", "x": 3, "y": 20, "misc": 32}, + {"screen": 8, "sprite": "Piranha Plant", "x": 8, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Goomba", "x": 26, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 1, "y": 11, "misc": 32}, + {"screen": 9, "sprite": "Goomba", "x": 1, "y": 20, "misc": 32}, + {"screen": 9, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 16, "misc": 160}, + {"screen": 10, "sprite": "Paragoomba (Diagonal)", "x": 29, "y": 26, "misc": 160}, + {"screen": 11, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 26, "misc": 32}], + "Mario's Castle": [ + {"screen": 0, "sprite": "Mushroom Block", "x": 15, "y": 17, "misc": 32}, + {"screen": 1, "sprite": "Falling Bone Platform", "x": 14, "y": 27, "misc": 32}, + {"screen": 1, "sprite": "Falling Bone Platform", "x": 22, "y": 27, "misc": 32}, + {"screen": 1, "sprite": "Skull Platform", "x": 25, "y": 30, "misc": 64}, + {"screen": 1, "sprite": "Rising Bone Platform", "x": 30, "y": 28, "misc": 32}, + {"screen": 2, "sprite": "Skull Platform", "x": 5, "y": 30, "misc": 64}, + {"screen": 2, "sprite": "Falling Bone Platform", "x": 16, "y": 27, "misc": 32}, + {"screen": 2, "sprite": "Falling Bone Platform", "x": 24, "y": 27, "misc": 32}, + {"screen": 2, "sprite": "Skull Platform", "x": 29, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Rising Bone Platform", "x": 0, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 3, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Rising Bone Platform", "x": 18, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 25, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Falling Bone Platform", "x": 26, "y": 27, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 27, "y": 30, "misc": 64}, + {"screen": 4, "sprite": "Rising Bone Platform", "x": 2, "y": 28, "misc": 32}, + {"screen": 4, "sprite": "Genkottsu (1.5 Tiles)", "x": 22, "y": 31, "misc": 64}, + {"screen": 5, "sprite": "Genkottsu (2 Tiles)", "x": 6, "y": 31, "misc": 64}, + {"screen": 5, "sprite": "Karamenbo", "x": 14, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Karamenbo", "x": 20, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Genkottsu (2 Tiles)", "x": 22, "y": 31, "misc": 64}, + {"screen": 6, "sprite": "Karamenbo", "x": 1, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Karamenbo", "x": 8, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Karamenbo", "x": 21, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Propeller Platform", "x": 4, "y": 30, "misc": 64}, + {"screen": 7, "sprite": "Propeller Platform", "x": 16, "y": 30, "misc": 64}, + {"screen": 7, "sprite": "Floating Face", "x": 19, "y": 26, "misc": 32}, + {"screen": 8, "sprite": "Propeller Platform", "x": 4, "y": 30, "misc": 64}, + {"screen": 8, "sprite": "Floating Face", "x": 17, "y": 29, "misc": 32}, + {"screen": 8, "sprite": "Floating Face", "x": 17, "y": 23, "misc": 32}, + {"screen": 8, "sprite": "Propeller Platform", "x": 18, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Floating Face", "x": 15, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Floating Face", "x": 16, "y": 22, "misc": 32}, + {"screen": 10, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 64}, + {"screen": 10, "sprite": "Spike Ball (Large)", "x": 11, "y": 28, "misc": 64}, + {"screen": 10, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Spike Ball (Small)", "x": 29, "y": 30, "misc": 64}, + {"screen": 11, "sprite": "Fire Pakkun Zo (Left)", "x": 8, "y": 28, "misc": 192}, + {"screen": 11, "sprite": "Fire Pakkun Zo (Left)", "x": 14, "y": 26, "misc": 64}, + {"screen": 11, "sprite": "Spike Ball (Large)", "x": 31, "y": 30, "misc": 192}, + {"screen": 12, "sprite": "Fire Pakkun Zo (Large)", "x": 15, "y": 26, "misc": 64}, + {"screen": 12, "sprite": "Fire Pakkun Zo (Left)", "x": 24, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Fire Pakkun Zo (Left)", "x": 0, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Fire Pakkun Zo (Left)", "x": 8, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Spike Ball (Large)", "x": 29, "y": 30, "misc": 64}, + {"screen": 14, "sprite": "Spike Ball (Small)", "x": 12, "y": 26, "misc": 192}, + {"screen": 15, "sprite": "Fire Pakkun Zo (Right)", "x": 4, "y": 16, "misc": 64}, + {"screen": 15, "sprite": "Mushroom Block", "x": 15, "y": 19, "misc": 32}], + "Scenic Course": [ + {"screen": 1, "sprite": "Paragoomba (Diagonal)", "x": 1, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 11, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Paragoomba (Diagonal)", "x": 21, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 31, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Diagonal)", "x": 9, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 19, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Diagonal)", "x": 29, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Diagonal)", "x": 7, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Star Block", "x": 19, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Diagonal)", "x": 27, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 5, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Mushroom Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Paragoomba (Diagonal)", "x": 25, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 3, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 1, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 11, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 21, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 31, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Paragoomba (Diagonal)", "x": 9, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 11, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Paragoomba (Diagonal)", "x": 19, "y": 30, "misc": 32}], + "Turtle Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 7, "y": 21, "misc": 32}, + {"screen": 1, "sprite": "Heart Block", "x": 27, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 29, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Flower Block", "x": 11, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Money Bag Block", "x": 1, "y": 19, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 31, "y": 28, "misc": 32}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 21, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Mushroom Block", "x": 19, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 21, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Carrot Block", "x": 23, "y": 23, "misc": 32}], + "Pumpkin Zone Secret Course 1": [ + {"screen": 0, "sprite": "Carrot Block", "x": 29, "y": 29, "misc": 0}, + {"screen": 1, "sprite": "Paragoomba (Vertical)", "x": 22, "y": 0, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 14, "y": 2, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 4, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 30, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 23, "y": 4, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 25, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 19, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 29, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Goomba", "x": 11, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Goomba", "x": 29, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Star", "x": 25, "y": 24, "misc": 32}], + "Space Zone Secret Course": [ + {"screen": 2, "sprite": "Rerere/Poro", "x": 2, "y": 2, "misc": 32}, + {"screen": 3, "sprite": "Rerere/Poro", "x": 14, "y": 20, "misc": 0}, + {"screen": 4, "sprite": "Heart", "x": 3, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Heart", "x": 5, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Rerere/Poro", "x": 26, "y": 2, "misc": 32}, + {"screen": 5, "sprite": "Heart Block", "x": 21, "y": 19, "misc": 0}], + "Tree Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 3, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 9, "y": 24, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 13, "y": 14, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 25, "y": 16, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 3, "y": 20, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 19, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 27, "y": 22, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 11, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 19, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 31, "y": 26, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 9, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 25, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 29, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 9, "y": 13, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 17, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 27, "y": 26, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 11, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 31, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 7, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 27, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 5, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 13, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 21, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Heart Block", "x": 31, "y": 13, "misc": 32}], + "Macro Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 32}, + {"screen": 1, "sprite": "Falling Platform", "x": 28, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Falling Platform", "x": 12, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Falling Platform", "x": 18, "y": 26, "misc": 32}, + {"screen": 3, "sprite": "Heart Block", "x": 11, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Flower Block", "x": 17, "y": 17, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 25, "y": 27, "misc": 32}], + "Pumpkin Zone Secret Course 2": [ + {"screen": 0, "sprite": "Flower Block", "x": 25, "y": 11, "misc": 0}, + {"screen": 1, "sprite": "Heart Block", "x": 9, "y": 17, "misc": 0}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 16, "y": 20, "misc": 0}, + {"screen": 1, "sprite": "Heart Block", "x": 23, "y": 15, "misc": 0}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 29, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Heart Block", "x": 5, "y": 13, "misc": 0}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 13, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Goomba", "x": 21, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 31, "y": 20, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 17, "y": 17, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 25, "y": 13, "misc": 0}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 1, "y": 20, "misc": 0}, + {"screen": 4, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 2, "y": 22, "misc": 0}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 10, "y": 22, "misc": 0}, + {"screen": 5, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 26, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 2, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 10, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 7, "sprite": "Goomba", "x": 13, "y": 18, "misc": 0}, + {"screen": 7, "sprite": "Heart Block", "x": 15, "y": 17, "misc": 0}, + {"screen": 7, "sprite": "Goomba", "x": 29, "y": 18, "misc": 0}, + {"screen": 8, "sprite": "Heart Block", "x": 9, "y": 17, "misc": 0}, + {"screen": 8, "sprite": "Goomba", "x": 11, "y": 18, "misc": 0}, + {"screen": 8, "sprite": "Heart Block", "x": 23, "y": 17, "misc": 0}, + {"screen": 8, "sprite": "Goomba", "x": 25, "y": 18, "misc": 0}, + {"screen": 9, "sprite": "Falling Platform", "x": 12, "y": 20, "misc": 0}, + {"screen": 9, "sprite": "Heart", "x": 23, "y": 16, "misc": 0}, + {"screen": 10, "sprite": "Falling Platform", "x": 0, "y": 22, "misc": 0}, + {"screen": 10, "sprite": "Heart", "x": 17, "y": 14, "misc": 0}]} From 7e772b4ee9462045b0b0aff54e5fe7431ec4067f Mon Sep 17 00:00:00 2001 From: Sunny Bat Date: Wed, 21 May 2025 09:12:37 -0700 Subject: [PATCH 154/199] Raft: Small Raft doc update, bugfix (#5008) * Small doc touchups * Advanced Scarecrow progressive * Add period to doc Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --------- Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --- worlds/raft/docs/setup_en.md | 3 ++- worlds/raft/progressives.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/raft/docs/setup_en.md b/worlds/raft/docs/setup_en.md index 16e7883776..25e2c16bc5 100644 --- a/worlds/raft/docs/setup_en.md +++ b/worlds/raft/docs/setup_en.md @@ -45,7 +45,8 @@ ## Multiplayer Raft You're able to have multiple Raft players on a single Raftipelago world. This will work, with a few notes: -- Only the player that creates/loads the world can connect to Archipelago (this is the "host" of the Raft world). Other players do not need to connect; everything will be routed through the the host. +- Every player that joins the Raft world must have the Raftipelago mod loaded. +- Only the player that creates/loads the world can connect to Archipelago (this is the "host" of the Raft world). Other players do not need to run */connect*; everything will be routed through the the host. - Players other than the host will be labeled as a "Raft Player (Steam name)" when using ingame chat, which will be routed through Archipelago chat. - Ingame chat will only work when the host is connected to the Archipelago server. diff --git a/worlds/raft/progressives.json b/worlds/raft/progressives.json index 11bd614ab0..6f3900738e 100644 --- a/worlds/raft/progressives.json +++ b/worlds/raft/progressives.json @@ -30,7 +30,7 @@ "Steering Wheel": "progressive-engine", "Engine controls": "progressive-engine", "Scarecrow": "progressive-scarecrow", - "Advanced scarecrow": "progressive-scarecrow", + "Advanced Scarecrow": "progressive-scarecrow", "Simple collection net": "progressive-net", "Advanced collection net": "progressive-net", "Storage": "progressive-storage", From a076b9257d3c15da7f7a96ae6b6aa0c2684244d7 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Wed, 21 May 2025 09:59:04 -0700 Subject: [PATCH 155/199] DS3: Don't make unrandomized items into events (#5018) The DS3 static randomizer uses the relative ordering of location names to map between Archipelago's notion of location IDs and the static randomizer's. Treating unrandomized locations as excluded can break this behavior by removing some locations from the list, causing further locations to be incorrectly assigned. The only reason this wasn't a bigger problem up to this point was that location order only matters on a per-region and per-item basis. That means this only causes problems in practice when a single region has multiple locations with the same default item, and some of those locations are randomized while others are not. Since exclusions (and thus randomization) are usually done based on item types, we managed to dodge this bullet for a long time. --- worlds/dark_souls_3/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index b9f32a8d40..5e1003d2a9 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -273,9 +273,7 @@ class DarkSouls3World(World): self.player, location, parent = new_region, - event = True, ) - event_item.code = None new_location.place_locked_item(event_item) if location.name in excluded: excluded.remove(location.name) From a409167f6479caa4b896daa4a9fbdee71ae1d0ae Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Thu, 22 May 2025 04:27:03 +1000 Subject: [PATCH 156/199] core: Reconfigure stdout to utf8 (#5017) --- Utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Utils.py b/Utils.py index f930335b24..f4752448e2 100644 --- a/Utils.py +++ b/Utils.py @@ -540,6 +540,7 @@ def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, if add_timestamp: stream_handler.setFormatter(formatter) root_logger.addHandler(stream_handler) + sys.stdout.reconfigure(encoding="utf-8", errors="replace") # Relay unhandled exceptions to logger. if not getattr(sys.excepthook, "_wrapped", False): # skip if already modified From 6827368e60c1a3ef95002ea1b43b2a0f643dc8d4 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 22 May 2025 00:45:49 +0200 Subject: [PATCH 157/199] Core: generate templates faster and "cleaner" (#5019) --- Options.py | 13 ++++++++----- data/options.yaml | 5 ++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Options.py b/Options.py index 86e58ca64a..3d08c5f003 100644 --- a/Options.py +++ b/Options.py @@ -1676,6 +1676,7 @@ def get_option_groups(world: typing.Type[World], visibility_level: Visibility = def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], generate_hidden: bool = True) -> None: import os + from inspect import cleandoc import yaml from jinja2 import Template @@ -1714,19 +1715,21 @@ def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], ge # yaml dump may add end of document marker and newlines. return yaml.dump(scalar).replace("...\n", "").strip() + with open(local_path("data", "options.yaml")) as f: + file_data = f.read() + template = Template(file_data) + for game_name, world in AutoWorldRegister.world_types.items(): if not world.hidden or generate_hidden: option_groups = get_option_groups(world) - with open(local_path("data", "options.yaml")) as f: - file_data = f.read() - res = Template(file_data).render( + + res = template.render( option_groups=option_groups, __version__=__version__, game=game_name, yaml_dump=yaml_dump_scalar, dictify_range=dictify_range, + cleandoc=cleandoc, ) - del file_data - with open(os.path.join(target_folder, get_file_safe_name(game_name) + ".yaml"), "w", encoding="utf-8-sig") as f: f.write(res) diff --git a/data/options.yaml b/data/options.yaml index 09bfcdcec1..3fbe25a921 100644 --- a/data/options.yaml +++ b/data/options.yaml @@ -51,10 +51,9 @@ requires: {%- for option_key, option in group_options.items() %} {{ option_key }}: {%- if option.__doc__ %} - # {{ option.__doc__ + # {{ cleandoc(option.__doc__) | trim - | replace('\n\n', '\n \n') - | replace('\n ', '\n# ') + | replace('\n', '\n# ') | indent(4, first=False) }} {%- endif -%} From defdf34e609ea91a9ce7373aa3dea4771d050ec0 Mon Sep 17 00:00:00 2001 From: Fly Hyping Date: Wed, 21 May 2025 19:00:45 -0400 Subject: [PATCH 158/199] Wargroove: apworld (#4764) - Players and AI can sacrifice their own units and upload them to the multiworld. - Players and AI can summon random units from the multiworld. - Has 4 new separate options for how many sacrifices and summons either the player or the AI can make per level attempt. - New /sacrifice_summon command to toggle sacrifices and summons on/off. Useful if the AI makes a level impossible with their summons. - Linux Support. - Is an apworld now. --------- Co-authored-by: Raspberry Floof Co-authored-by: KScl Co-authored-by: Abigail Fox Co-authored-by: qwint Co-authored-by: Fabian Dill --- .../wargroove/Client.py | 229 +++++++++++++++--- worlds/wargroove/Options.py | 63 ++++- worlds/wargroove/__init__.py | 37 ++- .../data/mods/ArchipelagoMod/maps.dat | Bin 276454 -> 391423 bytes .../data/mods/ArchipelagoMod/mod.dat | Bin 594 -> 593 bytes .../data/mods/ArchipelagoMod/modAssets.dat | Bin 53878 -> 67643 bytes ...paign-c40a6e5b0cdf86ddac03b276691c483d.cmp | Bin 114384 -> 114528 bytes ...n-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak | Bin 114384 -> 114416 bytes worlds/wargroove/docs/en_Wargroove.md | 4 +- worlds/wargroove/docs/wargroove_en.md | 14 +- 10 files changed, 298 insertions(+), 49 deletions(-) rename WargrooveClient.py => worlds/wargroove/Client.py (63%) diff --git a/WargrooveClient.py b/worlds/wargroove/Client.py similarity index 63% rename from WargrooveClient.py rename to worlds/wargroove/Client.py index 595a221cd2..3dc5d6eb0c 100644 --- a/WargrooveClient.py +++ b/worlds/wargroove/Client.py @@ -2,14 +2,15 @@ from __future__ import annotations import atexit import os +import pkgutil import sys import asyncio import random -import shutil +import typing from typing import Tuple, List, Iterable, Dict -from worlds.wargroove import WargrooveWorld -from worlds.wargroove.Items import item_table, faction_table, CommanderData, ItemData +from . import WargrooveWorld +from .Items import item_table, faction_table, CommanderData, ItemData import ModuleUpdate ModuleUpdate.update() @@ -21,7 +22,7 @@ import logging if __name__ == "__main__": Utils.init_logging("WargrooveClient", exception_logger="Client") -from NetUtils import NetworkItem, ClientStatus +from NetUtils import ClientStatus from CommonClient import gui_enabled, logger, get_base_parser, ClientCommandProcessor, \ CommonContext, server_loop @@ -29,6 +30,34 @@ wg_logger = logging.getLogger("WG") class WargrooveClientCommandProcessor(ClientCommandProcessor): + def _cmd_sacrifice_summon(self): + """Toggles sacrifices and summons On/Off""" + if isinstance(self.ctx, WargrooveContext): + self.ctx.has_sacrifice_summon = not self.ctx.has_sacrifice_summon + if self.ctx.has_sacrifice_summon: + self.output(f"Sacrifices and summons are enabled.") + else: + unit_summon_response_file = os.path.join(self.ctx.game_communication_path, "unitSummonResponse") + if os.path.exists(unit_summon_response_file): + os.remove(unit_summon_response_file) + self.output(f"Sacrifices and summons are disabled.") + + def _cmd_deathlink(self): + """Toggles deathlink On/Off""" + if isinstance(self.ctx, WargrooveContext): + self.ctx.has_death_link = not self.ctx.has_death_link + Utils.async_start(self.ctx.update_death_link(self.ctx.has_death_link), name="Update Deathlink") + if self.ctx.has_death_link: + death_link_send_file = os.path.join(self.ctx.game_communication_path, "deathLinkSend") + if os.path.exists(death_link_send_file): + os.remove(death_link_send_file) + self.output(f"Deathlink enabled.") + else: + death_link_receive_file = os.path.join(self.ctx.game_communication_path, "deathLinkReceive") + if os.path.exists(death_link_receive_file): + os.remove(death_link_receive_file) + self.output(f"Deathlink disabled.") + def _cmd_resync(self): """Manually trigger a resync.""" self.output(f"Syncing items.") @@ -58,6 +87,11 @@ class WargrooveContext(CommonContext): commander_defense_boost_multiplier: int = 0 income_boost_multiplier: int = 0 starting_groove_multiplier: float + has_death_link: bool = False + has_sacrifice_summon: bool = True + player_stored_units_key: str = "" + ai_stored_units_key: str = "" + max_stored_units: int = 1000 faction_item_ids = { 'Starter': 0, 'Cherrystone': 52025, @@ -71,6 +105,31 @@ class WargrooveContext(CommonContext): 'Income Boost': 52023, 'Commander Defense Boost': 52024, } + unit_classes = { + "archer", + "ballista", + "balloon", + "dog", + "dragon", + "giant", + "harpoonship", + "harpy", + "knight", + "mage", + "merman", + "rifleman", + "soldier", + "spearman", + "thief", + "thief_with_gold", + "travelboat", + "trebuchet", + "turtle", + "villager", + "wagon", + "warship", + "witch", + } def __init__(self, server_address, password): super(WargrooveContext, self).__init__(server_address, password) @@ -78,31 +137,80 @@ class WargrooveContext(CommonContext): self.syncing = False self.awaiting_bridge = False # self.game_communication_path: files go in this path to pass data between us and the actual game + game_options = WargrooveWorld.settings + + # Validate the AppData directory with Wargroove save data. + # By default, Windows sets an environment variable we can leverage. + # However, other OSes don't usually have this value set, so we need to rely on a settings value instead. + appdata_wargroove = None if "appdata" in os.environ: - options = Utils.get_options() - root_directory = os.path.join(options["wargroove_options"]["root_directory"]) - data_directory = os.path.join("lib", "worlds", "wargroove", "data") - dev_data_directory = os.path.join("worlds", "wargroove", "data") - appdata_wargroove = os.path.expandvars(os.path.join("%APPDATA%", "Chucklefish", "Wargroove")) - if not os.path.isfile(os.path.join(root_directory, "win64_bin", "wargroove64.exe")): - print_error_and_close("WargrooveClient couldn't find wargroove64.exe. " - "Unable to infer required game_communication_path") - self.game_communication_path = os.path.join(root_directory, "AP") - if not os.path.exists(self.game_communication_path): - os.makedirs(self.game_communication_path) - self.remove_communication_files() - atexit.register(self.remove_communication_files) - if not os.path.isdir(appdata_wargroove): - print_error_and_close("WargrooveClient couldn't find Wargoove in appdata!" - "Boot Wargroove and then close it to attempt to fix this error") - if not os.path.isdir(data_directory): - data_directory = dev_data_directory - if not os.path.isdir(data_directory): - print_error_and_close("WargrooveClient couldn't find Wargoove mod and save files in install!") - shutil.copytree(data_directory, appdata_wargroove, dirs_exist_ok=True) + appdata_wargroove = os.environ['appdata'] else: - print_error_and_close("WargrooveClient couldn't detect system type. " - "Unable to infer required game_communication_path") + try: + appdata_wargroove = game_options.save_directory + except FileNotFoundError: + print_error_and_close("WargrooveClient couldn't detect a path to the AppData folder.\n" + "Unable to infer required game_communication_path.\n" + "Try setting the \"save_directory\" value in your local options file " + "to the AppData folder containing your Wargroove saves.") + appdata_wargroove = os.path.expandvars(os.path.join(appdata_wargroove, "Chucklefish", "Wargroove")) + if not os.path.isdir(appdata_wargroove): + print_error_and_close(f"WargrooveClient couldn't find Wargroove data in your AppData folder.\n" + f"Looked in \"{appdata_wargroove}\".\n" + f"If you haven't yet booted the game at least once, boot Wargroove " + f"and then close it to attempt to fix this error.\n" + f"If the AppData folder above seems wrong, try setting the " + f"\"save_directory\" value in your local options file " + f"to the AppData folder containing your Wargroove saves.") + + # Check for the Wargroove game executable path. + # This should always be set regardless of the OS. + root_directory = game_options["root_directory"] + if not os.path.isfile(os.path.join(root_directory, "win64_bin", "wargroove64.exe")): + print_error_and_close(f"WargrooveClient couldn't find wargroove64.exe in " + f"\"{root_directory}/win64_bin/\".\n" + f"Unable to infer required game_communication_path.\n" + f"Please verify the \"root_directory\" value in your local " + f"options file is set correctly.") + self.game_communication_path = os.path.join(root_directory, "AP") + if not os.path.exists(self.game_communication_path): + os.makedirs(self.game_communication_path) + self.remove_communication_files() + atexit.register(self.remove_communication_files) + if not os.path.isdir(appdata_wargroove): + print_error_and_close("WargrooveClient couldn't find Wargoove in appdata!" + "Boot Wargroove and then close it to attempt to fix this error") + mods_directory = os.path.join(appdata_wargroove, "mods", "ArchipelagoMod") + save_directory = os.path.join(appdata_wargroove, "save") + + # Wargroove doesn't always create the mods directory, so we have to do it + if not os.path.isdir(mods_directory): + os.makedirs(mods_directory) + resources = ["data/mods/ArchipelagoMod/maps.dat", + "data/mods/ArchipelagoMod/mod.dat", + "data/mods/ArchipelagoMod/modAssets.dat", + "data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp", + "data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak"] + file_paths = [os.path.join(mods_directory, "maps.dat"), + os.path.join(mods_directory, "mod.dat"), + os.path.join(mods_directory, "modAssets.dat"), + os.path.join(save_directory, "campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp"), + os.path.join(save_directory, "campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak")] + for resource, destination in zip(resources, file_paths): + file_data = pkgutil.get_data("worlds.wargroove", resource) + if file_data is None: + print_error_and_close("WargrooveClient couldn't find Wargoove mod and save files in install!") + with open(destination, 'wb') as f: + f.write(file_data) + + def on_deathlink(self, data: typing.Dict[str, typing.Any]) -> None: + with open(os.path.join(self.game_communication_path, "deathLinkReceive"), 'w+') as f: + text = data.get("cause", "") + if text: + f.write(f"DeathLink: {text}") + else: + f.write(f"DeathLink: Received from {data['source']}") + super(WargrooveContext, self).on_deathlink(data) async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -138,20 +246,25 @@ class WargrooveContext(CommonContext): def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: + slot_data = args["slot_data"] + self.has_death_link = slot_data.get("death_link", False) filename = f"AP_settings.json" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - slot_data = args["slot_data"] - json.dump(args["slot_data"], f) + json.dump(slot_data, f) self.can_choose_commander = slot_data["can_choose_commander"] print('can choose commander:', self.can_choose_commander) self.starting_groove_multiplier = slot_data["starting_groove_multiplier"] self.income_boost_multiplier = slot_data["income_boost"] self.commander_defense_boost_multiplier = slot_data["commander_defense_boost"] - f.close() for ss in self.checked_locations: filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.close() + pass + + self.player_stored_units_key = f"wargroove_player_units_{self.team}" + self.ai_stored_units_key = f"wargroove_ai_units_{self.team}" + self.set_notify(self.player_stored_units_key, self.ai_stored_units_key) + self.update_commander_data() self.ui.update_tracker() @@ -161,7 +274,6 @@ class WargrooveContext(CommonContext): filename = f"seed{i}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write(str(random.randint(0, 4294967295))) - f.close() if cmd in {"RoomInfo"}: self.seed_name = args["seed_name"] @@ -189,7 +301,6 @@ class WargrooveContext(CommonContext): f.write(f"{item_count * self.commander_defense_boost_multiplier}") else: f.write(f"{item_count}") - f.close() print_filename = f"AP_{str(network_item.item)}.item.print" print_path = os.path.join(self.game_communication_path, print_filename) @@ -200,7 +311,6 @@ class WargrooveContext(CommonContext): self.item_names.lookup_in_game(network_item.item) + " from " + self.player_names[network_item.player]) - f.close() self.update_commander_data() self.ui.update_tracker() @@ -209,7 +319,7 @@ class WargrooveContext(CommonContext): for ss in self.checked_locations: filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.close() + pass def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" @@ -385,7 +495,6 @@ class WargrooveContext(CommonContext): async def game_watcher(ctx: WargrooveContext): - from worlds.wargroove.Locations import location_table while not ctx.exit_event.is_set(): if ctx.syncing == True: sync_msg = [{'cmd': 'Sync'}] @@ -397,6 +506,12 @@ async def game_watcher(ctx: WargrooveContext): victory = False for root, dirs, files in os.walk(ctx.game_communication_path): for file in files: + if file == "deathLinkSend" and ctx.has_death_link: + with open(os.path.join(ctx.game_communication_path, file), 'r') as f: + failed_mission = f.read() + if ctx.slot is not None: + await ctx.send_death(f"{ctx.player_names[ctx.slot]} failed {failed_mission}") + os.remove(os.path.join(ctx.game_communication_path, file)) if file.find("send") > -1: st = file.split("send", -1)[1] sending = sending+[(int(st))] @@ -404,6 +519,40 @@ async def game_watcher(ctx: WargrooveContext): if file.find("victory") > -1: victory = True os.remove(os.path.join(ctx.game_communication_path, file)) + if file == "unitSacrifice" or file == "unitSacrificeAI": + if ctx.has_sacrifice_summon: + stored_units_key = ctx.player_stored_units_key + if file == "unitSacrificeAI": + stored_units_key = ctx.ai_stored_units_key + with open(os.path.join(ctx.game_communication_path, file), 'r') as f: + unit_class = f.read() + message = [{"cmd": 'Set', "key": stored_units_key, + "default": [], + "want_reply": True, + "operations": [{"operation": "add", "value": [unit_class[:64]]}]}] + await ctx.send_msgs(message) + os.remove(os.path.join(ctx.game_communication_path, file)) + if file == "unitSummonRequestAI" or file == "unitSummonRequest": + if ctx.has_sacrifice_summon: + stored_units_key = ctx.player_stored_units_key + if file == "unitSummonRequestAI": + stored_units_key = ctx.ai_stored_units_key + with open(os.path.join(ctx.game_communication_path, "unitSummonResponse"), 'w') as f: + if stored_units_key in ctx.stored_data: + stored_units = ctx.stored_data[stored_units_key] + if stored_units is None: + stored_units = [] + wg1_stored_units = [unit for unit in stored_units if unit in ctx.unit_classes] + if len(wg1_stored_units) != 0: + summoned_unit = random.choice(wg1_stored_units) + message = [{"cmd": 'Set', "key": stored_units_key, + "default": [], + "want_reply": True, + "operations": [{"operation": "remove", "value": summoned_unit[:64]}]}] + await ctx.send_msgs(message) + f.write(summoned_unit) + os.remove(os.path.join(ctx.game_communication_path, file)) + ctx.locations_checked = sending message = [{"cmd": 'LocationChecks', "locations": sending}] await ctx.send_msgs(message) @@ -418,8 +567,9 @@ def print_error_and_close(msg): Utils.messagebox("Error", msg, error=True) sys.exit(1) -if __name__ == '__main__': - async def main(args): +def launch(*launch_args: str): + async def main(): + args = parser.parse_args(launch_args) ctx = WargrooveContext(args.connect, args.password) ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") if gui_enabled: @@ -439,7 +589,6 @@ if __name__ == '__main__': parser = get_base_parser(description="Wargroove Client, for text interfacing.") - args, rest = parser.parse_known_args() colorama.just_fix_windows_console() - asyncio.run(main(args)) + asyncio.run(main()) colorama.deinit() diff --git a/worlds/wargroove/Options.py b/worlds/wargroove/Options.py index 1af0772065..a933cdb17b 100644 --- a/worlds/wargroove/Options.py +++ b/worlds/wargroove/Options.py @@ -1,6 +1,6 @@ -import typing from dataclasses import dataclass -from Options import Choice, Option, Range, PerGameCommonOptions +from Options import Choice, Range, PerGameCommonOptions, StartInventoryPool, OptionDict, OptionGroup, \ + DeathLinkMixin class IncomeBoost(Range): @@ -31,8 +31,65 @@ class CommanderChoice(Choice): option_unlockable_factions = 1 option_random_starting_faction = 2 + +class PlayerSacrificeLimit(Range): + """How many times the player can sacrifice a unit at the Stronghold per level attempt. + Sacrificed units are stored in the multiworld for other players to summon.""" + display_name = "Player Sacrifice Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class PlayerSummonLimit(Range): + """How many times the player can summon a unit at the Stronghold per level attempt. + Summoned units are from the multiworld which were sacrificed by other players.""" + display_name = "Player Summon Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class AISacrificeLimit(Range): + """How many times the AI can sacrifice a unit at the Stronghold per level attempt. + Sacrificed units are stored in the multiworld for other AIs to summon.""" + display_name = "AI Sacrifice Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class AISummonLimit(Range): + """How many times the AI can summon a unit at the Stronghold per level attempt. + Summoned units are from the multiworld which were sacrificed by other AIs. + AI summoning can be overwhelming, use /sacrifice_summon in the client if a level becomes impossible.""" + display_name = "AI Summon Limit" + range_start = 0 + range_end = 5 + default = 0 + + +wargroove_option_groups = [ + OptionGroup("General Options", [ + IncomeBoost, + CommanderDefenseBoost, + CommanderChoice + ]), + OptionGroup("Sacrifice and Summon Options", [ + PlayerSacrificeLimit, + PlayerSummonLimit, + AISacrificeLimit, + AISummonLimit, + ]), +] + @dataclass -class WargrooveOptions(PerGameCommonOptions): +class WargrooveOptions(DeathLinkMixin, PerGameCommonOptions): income_boost: IncomeBoost commander_defense_boost: CommanderDefenseBoost commander_choice: CommanderChoice + player_sacrifice_limit: PlayerSacrificeLimit + player_summon_limit: PlayerSummonLimit + ai_sacrifice_limit: AISacrificeLimit + ai_summon_limit: AISummonLimit + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/wargroove/__init__.py b/worlds/wargroove/__init__.py index f204f468d1..e6bcc6288a 100644 --- a/worlds/wargroove/__init__.py +++ b/worlds/wargroove/__init__.py @@ -8,18 +8,42 @@ from .Locations import location_table from .Regions import create_regions from .Rules import set_rules from worlds.AutoWorld import World, WebWorld -from .Options import WargrooveOptions +from .Options import WargrooveOptions, wargroove_option_groups +from worlds.LauncherComponents import Component, components, Type, launch as launch_component + + +def launch_client(*args: str): + from .Client import launch + launch_component(launch, name="WargrooveClient", args=args) + + +components.append(Component("Wargroove Client", game_name="Wargroove", func=launch_client, component_type=Type.CLIENT)) class WargrooveSettings(settings.Group): class RootDirectory(settings.UserFolderPath): """ - Locate the Wargroove root directory on your system. - This is used by the Wargroove client, so it knows where to send communication files to + Locates the Wargroove root directory on your system. + This is used by the Wargroove client, so it knows where to send communication files to. """ description = "Wargroove root directory" + class SaveDirectory(settings.UserFolderPath): + """ + Locates the Wargroove save file directory on your system. + This is used by the Wargroove client, so it knows where to send mod and save files to. + """ + description = "Wargroove save file/appdata directory" + + def browse(self, **kwargs): + from Utils import messagebox + messagebox("AppData folder not found", + "WargrooveClient couldn't detect a path to the AppData folder.\n" + "Please select the folder containing the \"/Chucklefish/Wargroove/\" directories.") + super().browse(**kwargs) + root_directory: RootDirectory = RootDirectory("C:/Program Files (x86)/Steam/steamapps/common/Wargroove") + save_directory: SaveDirectory = SaveDirectory("%APPDATA%") class WargrooveWeb(WebWorld): @@ -32,6 +56,8 @@ class WargrooveWeb(WebWorld): ["Fly Sniper"] )] + option_groups = wargroove_option_groups + class WargrooveWorld(World): """ @@ -55,6 +81,11 @@ class WargrooveWorld(World): 'commander_defense_boost': self.options.commander_defense_boost.value, 'can_choose_commander': self.options.commander_choice.value != 0, 'commander_choice': self.options.commander_choice.value, + 'player_sacrifice_limit': self.options.player_sacrifice_limit.value, + 'player_summon_limit': self.options.player_summon_limit.value, + 'ai_sacrifice_limit': self.options.ai_sacrifice_limit.value, + 'ai_summon_limit': self.options.ai_summon_limit.value, + 'death_link': self.options.death_link.value, 'starting_groove_multiplier': 20 # Backwards compatibility in case this ever becomes an option } diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat b/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat index a7ffb0733133a55cc128eaef62b7f70b23849699..fca94c194eaed831d7daafcb9a654136bd3110d1 100644 GIT binary patch delta 321539 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�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Ξ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
    K^L*`dw`Y%8+Wc|7M$BShcJP3@W9ulH?atO{w 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

    m!rr?h3(}kr3$c`1`8I1n3{={Hh6(VGe+O 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

    T-VUF4v6uc!5)1));jow{JbgdzcRX;6LYimK#^x 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 Nq0zU8@?reK|3AKIShfHF diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat b/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat index 22464857e0da7e4892304c934203d3a3f729cf9c..6a12724d9acc3dbeedfa137f9a6940ba30bddc6c 100644 GIT binary patch delta 489 zcmVO;6iE5KSD)M`-vc74$%* z?H>RoL_m&QP%o9LmU}euPVH6KyVmYH5&iX@u_h2gt6=HL^7_rZnR&BWr_<>Xx`Zu4 z<#o*Do6q+M+XQG*=>wnk3HSC<{dA_r@Q%LT6ZQ!jV;)SMjCV|&FwqBp)kIValS&04 zFDb@C;V+6pfzv9LxO%K|sA@2U`@*#x6FC1bWAUjd#yR2cIqI9&msIy%jF{quhIC5* zcL}FbJjWW%kq56LGvP991NTdk`vSU zT!CBCXkQB7m7fofb*nO9i)d@6v&L9$T(K`R>kFCRrP1h{v`J%J@K%ij(HIDMhtQ6C zgTT>$1o*NC+x-bl@+F#_}y delta 490 zcmVO;6iE5KSD)M`$RNiuORI z?H_PM1Or}tO*UFRj~AAdHrVI%)HsG)9LgGUBVWj z@;YYn&F6cBZ2~l@^np+Ngd6*)?wzSIyrHkRgnfd>mq(? zuD~s6v@eD4%Fl<#x>XslMYJ{3S!1j=uGp8E^@Ysu(rENe+N3dEc&)~PXbgnBLug06 zLE!K|0(@B_!c+bu$$z-AhsiH6Y!WzrZ3iDjVM$(IX`UXL8EH|!LoB;uT?O^U@M<)? g7=0U#Cs*UkucOIie7Ph3XJTk3=t?<%0N>fov#uuc!2kdN diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat b/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat index 54026ab2c2dd7ed3f6ed0bb5da5ba1889d1e8385..a51c17e954fd2622701520f283a919b375f3aae7 100644 GIT binary patch delta 10313 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 AKmY&$ delta 1880 zcmV-e2dDVEkOcOm1CStp1p)v700000_5=U`00000c$|%rO>fjN5I{>MR6rmBCqzY$ zKoPM1ievi*m!3d~KM;8nlNz#dWP2CEuVC(+gNi>p^ym=l^=Je#|dOSq4)vIsc zzg~TW#Y1?e9Aibe5D7XT0NdJVbz}dUYNg9)T^kbr2tIQnrNRV%?v!vblTf<0vj62^ z!3a_q5qWHr%5*N+I2MH^V^VR<6900BH#^hD$xjgCREb>n{M#A6_Rj505lsUd`Bqbt!=&CXu3?)04fX{tT|22!=DNa>4p0JspVXZCx8bmCdk} zOktXlL_Hs217GLOYq6J1m zK?+awDZ~SaONd%;OxNf?Q>o+MFN#mTytbWbbnU*l>OR2G0>p1Pj61av6M|Jv7s+2A%KPa&VwM>LGhbqUb7+q4xA8~Rgu_7RIA5Z^*jM)>HfN*^ z<%*z1KkyYS1I$HRhm~nRTz$SPOhcOy!eJzkTvX&g#U@)yvpWK!2eV@etp$H^0RR91 z0001ZoJEk`3c@f9h4<$sA~F;&y!YBYgm|luP-+dMFx%3#;^UjtY#V%poaCHsDY7gp zksMheAMnqyV1Wh=QXyJdL)saMx}$dNqR~M}6|^;i6rrS1FkGDJDPx0B)vug856VaK zI8xS}ZR8uMKc;MvQqzYB-Y-qrPB;&@FQ^!jh3vscsIj)ZF)FWJxN~Sb{Z+TTykUJy zZs~gnS3B6~X}_K|%HAV~S$V`TXamdgZXOBypV1Lde7}k--C%ltA=XHIlYtRnlaLVz zv*8i34YRx-uq(6YOuqrM{!T*zvm{j76|+QY14gsFvFrr1#kMgIlLN?Vlc;%zvupHM z4}ZuF00000004NLomcyB8$}RKfr4o13sg$q+w_sRrALyMf{JLHI1)rWRF%N5*7|O3 zFPwL+-MyH|^8enMy*Ybr-@|I8knJfi1rk$&C@tbxf7Nh=I`15 zTh=Z%%@z-E(<9jM6WI0|teJ8h>BJC;E+Y}HSOmva8+{3D5!mBKEUDlOf!jA0-3G)X z|3&WOCcNEQ%SZI16AwiE-x-Q#8-G~V(}uZ$VB&violvo0x;JfV~S#Qsqm1!7?jVKlCE{l(PJ=k@iH! zPMcHY#qwyUTn>GL|H)rO7b!SD)_+6I0-q`A=rA28QZdrTmk<{6G5yA)6&n`LhMObI z^eeFM>KUtuUM~^hcdTas9rC?Mt26{{9!m7Uji#o5GtoK#{jo=CIrcLGjAe;p? zlWU8bMoAA^WD2Vu&$*u@2!HEe zfF*4r1e|N@u()vuAHiItC4;Lg+*k;O8T3h=>`mD=Bq@b4b|PBQXMdE^&3fWMnOBOz z70#_o6pWJV+6<;qqc6a60i~zx4}B8M53I?&4w)V+h+Oy7AB8(Mc{Yu3c;UV6+Zy^R z)<1&@#(0`~t~m)X`f-MAVSI6P;Vc7swryo9Kt4aS$@6I|dP0hC1>VG3C9>>FFyMBk zM?A)HzQHot!z+m}j(^MfT?#Hbyo-^c+e&nYwr!Sj6^%6{`GPv@uiW~{aGO&1s1zYA zf@N31DOj2}4G>-4Mlfg?uQ)RX5?yW#2Q32+!nd)bT1Wwe+=$p@ zaH~*a%=!kP5`W9E5o^OOlcyFxkqVkXjP2^*%!uNPU5d=jGEvHbOoYxHG5%JE2Y(ak)O(Gr+)H S;z0joBmdtG|K0;O>@zcn1CAa5 diff --git a/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp b/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp index 93c4f3c88742c3707352898f964916160dcef92e..f823aa0477dbdc330023f131eab4c0129d50126f 100644 GIT binary patch literal 114528 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 MW#eAJ=f4h>cX+6{@Bjb+ literal 114384 zcmV(mK=Z#yOiWo*K~_Zp000000000rN-iNiMJC+>oZ25S86FSvIQ-$**EM*#jPM#L zR|O?l+aLL7MkD%L8|<~-W{MaBj<(}x{c-y7yt;mH@MN42^YvH5^afl}l&Uy%e@MCF zk?+TCqKa8KFoB)fQSP#dd_|T`^y)Tzu~)`IV%?gR7a-M0;e*Tud!2re7WMUl2l40n zwZeC2@JNWRwl#Gdsh_=uAaeT(G}ZpK=KPMsJO>mxVYfp!<9zGU+$mFdO&DxuXg_KC zde81c^A}Fhh2^BZPRp!v^?YK9vx+z{EzSd;*Cn%gg^6|!Id`Q!&u7xUX-cAy8kRrvTiz|XK*5)I}iiVsAV5FN>v+3+6y99`pnG~ z-ajV8b6&<9s}Fr|2Y-R{JIpv3JOMz!$4J?+?5zL9hR+4}5h&I$RMALC6O@};^J@gv z!WZsgFJMv>!nHgoYIt9YkWvdkc*_-+Sn07W%nVD+Aj})%3mtO23j1M`&8}I86+@*Z z#W)RkiDm+r{mz*nlx*Kk^x|+GH8n3$@C|!a_98HB{y=j!I4T_82lRd6h(D{ZJG;v9 zh5*6kCB}9GS#BuV9oj;Mr-_leij9EunyCE!B1@v<4V`pr0TVgONi`wtkYlr1LjK@! z3m`i^BR`cvUU9nL1mgK=G^VTi>b!@(&g}!XIGYOf6%WAgk$gDEpJNB7Ttv_x3DWGn zc{Ei}&}Mu7U=J%d$}CX=>2Hf+(z`-&r>qH2)mjjdh;aJMb1!%1Zz!II#^tY}p8YqE zSuLA*->>)$Fa3WLqpbY!2q}g=+9$r8B;LXe!Zk$`-8!CF9_nb>aydb8TXk^qF`4-_@#`w(C5}_MQ60lwdyj zq;p@qJ36#Z>$GWhgC_2NDUtaR)V!xpZK~AlO3J;33qiMfabxf8B(0Sz6)0{Kigs~x zuQ`ZgFQ*M?(h$o|Q@DRVz}o~VvA3vglS4jfG}g=Y#2I(F71eNT8ND-`xa28FGcW%FCP>Ve092#G zl)%TPK@&F*PP0w&lZ?EzvwD$E_W&7tJ!?P+?mI7tVlgESFpG{ZtJ=QkW*z&W1c%i&Ck)SSOzw%t5END`w@>d@xsW|Hba7)} zuQZL;auk5(p()GS!Me#Ph^=|uRncNcY8gG?a63EFqp2DuajGE>;fY>tC5TkGv@}wU zI(v0JK7}MXo>tIBbF4lk=DX|2^#9rR15I@5#2aFrH7j6#32N1Ng_ghXmFfw~`beN< z|AB(P(ZGYr+#LLpBxbbXL1#-0;|IdlE0=$f>=eHSnR3ay|7gQ8fb&)~d!=DzP}NcCxTVf)Awv7+R5CH^{&uU=53n)VXQwiy>@pcoWm+ z=+ViUb-dGvX41i6D1eqOHOFBo=9k|cjaBY0Vh#OAo#1Y=(1yIQk%Ox@Qe_^f9NZ5m zpZwm--xR;y&@Q{7^A{@O^4&*rnJGO6_gh?GA=Mle(VAGa5p|11^ zUE3)Z;P}~dh)&YvljRlD6^T6F*qU=Gfp5DT6oCV+s0OC?A`p=> z7pOB_Q!pTcaAVrRH&86h_Q!aD1@$>sl21E-e!9^jxLqEym;2s-su$eDH5|gm&2@hl zR}7;^rih!%KJ2tWEfxdYuK>4F$GcofVgg8C0hBGcob|((0Ev4(6f{I$ZjhLk?Bzh_ zU=~bZ<%CG;XI z8?=hq$#4SNSeQ|=8AloBVX|BAAL~xmb%Ui)Z5sE1KnEHj#pbNV|8i5z3AgT}S0rCo z@*bxN`#X*HFXr0Td*u6RT~Uus5faG)6BQLL(b9k0HnfDr7dR?ffWY4^3P)XNOs~OQ zRx^IIM%$=M94vJ5XQlY#UAPatg~8pY1G9fSPgaF4@EnCLDKvz$;^mkM6r&=o9 zTL%4fFaFsIWP%|&B5qFh3ajB4tQE=(C!JkZZ?oAtBT4}Olcc@?bq=O@Z(iITCvUm# zBil%xCnaUQ9ld=R#McnMb9VvXHpU$H*FHml11FS18xPW#Rc1(={MQnk%3|Nxy4xpR z_goZJqJtO{osPVo;xn4?kV{$etBfOn<+|sozz2zYL~*fWjn-hEM&3T%yk+kK@s>-xYxh4_j2B(8%FkW+mAx z77~vc+w?$o@E_#uYPHaO!s)-DXdtoBt?79?+0c3@IIk}z*-Lwsrou_J7n;lk%%&zg+aupdRV;Q`ZrQ_{2Vjlcb4-3_1fKQ;%^WQNOml&zBVQ(9# ztMQ%Rte6STOeAePBGADgd>n4S6w@2AKm||F#t#K9P@pm~McMYZPZ=RcV>{#LQY-J!4sOfG6=rT#scl-wc8GwS`_Qs16;m#; zLo|n1PETkp{pohVp`Sl+C-aWs(9)Z$duBAF8T?+hIAbvO#zSK0Al5B`Na;;6QH9qp z{nQ%V%xPfZ`9;RMSuX-VHY@4@D{aQ|U`caMm8`y95uXBnQ-vD55Q6Z=2$*j-pRM_|qD=e)YV z@9B5fO&Bi4?;JKuYoVX#0QBeGmQAug3f&MZ`-^HxA)wxDKtYd^+yXI#CH+>IAgY~b z?+l#WvC0k@F!%MHHgal9x0ZthbL|`^@0(KrKP^iNRfMnnHoq2Sr{Y5N`|Cz82%f6R zYlJae{I_?^CypC#zwxc(xEh~tKW^U{JlT0F38Mo%vwIJ^f)@yQ)eZ_*s7KzE9CSY7 ziV(9Z%B})p5b3&Zlr6|H-+(eiq71+~J@xP|Dlp;m0u#J(SzWY!_#);WRV=(pWGM?T%NY`6r zG&~cpMfz(8(O-c%iT}fac_^H|Rq0%7>(382rX3e2B<1W`qcRXN1P`F~MIozBa7JoQ zWzCM+xEZL2VP3H?#3>Gs1s+*4DJRYikRm=eWwM^!FY8NAr%G;(C9Iwnb4{^j36+SZ z{aq3o|DLG15oC@zLK!W#8AiH>x$&qsXZ*0s`rlqf#6lMQyKo*p z(c|gTbm9~`^dxnv{0G&fazHe{GkmpH%hdR7aP8{skA@*~=Z;%-m%Xqr^wqp$v+MZx zzIxyZ&cydZIx_AV95h0h6--8I@W_s~{5eszl%HXik#8+u8_Q`9vWAM`gMsK!TK%Um@Bp>dKG z2TY$TLPlN(x=?HHCJ%xeu1#P6mSHjz zF0k|__0{WFJb|t)Fo!{5Fo@Ggh{%+GH>u=DqZ6rAWaduA-vqA-CQZxdlLOCXxA3S< zlDT7kD)STgGwA7_C>6p45E3ZR*lhK=SDdfT%Qcj=XzuD+x&b^~qZ-D$YgjM`;!L}8 zxzt^W7|v_E)R5!XClB|N2j%}&Ema<_3{!_sLBeq#k@5=i_;MUnVx<8496d=jviu(^JK zd2dGwFcA&2$^sDLU+;ZHB>Z0$_l*8N@|(sBjrE(p7z&Clh@)ov8MQ<*SI*M@O_VC& zKsxOQJ`1Uk6aVkHBO^^|d|1KadJWPV1T0H30Ud`N8 z%W|DSo5F3Y`G0&p8M_~4&oM8}vE1ejyxK?SBRr;_IMK=7*OW2dPv%`BuMCGLAT%ZH z@GHYj^OpXl)3BM8&+Im4wqHC32j4-Wv-;(ftw7xtJ!fnM_4HHsfEj4{Da-;@2UVIc zWH-#A|Neu;M<)-PSYO5lR=7;&vIBn9-2K!l2&LynO7Bc~zH;2sRFy1G8FLD|%3|yx z73HYbiH=U!)_skZ4~JGpT+!1&$W=DwW81W0ig|LUS9`_h;IG`9Ak# z8fxnLreHOyo0i*($a()1fe?#0(%;#zUo!tE#eNcKfj{&Dx;)|X&9Mk5DOMMWj}yUW z9aOuCW3Kcb>=iGLc{B@2)ke#4&SP_ndG5S^m?^V?7pC4JW;5&5OXG2~2b%_KZD%Od zj}%_KN+tDaYJWh_jE~71r96JaG?U3Y0Ht!R)ME0kYG?R6Sny?s2+6SUnN*}Zj&+38 zsm<5sYy{oW`_~l+hNlR>t(v+w@PI0qRA$_K!?3BC#`oypiFSqA=1U^x$UNd%Y-qKB zOm!OKq=}bn09{ZIszcy5i*X=ZW&Tg~Fk|xmxx@KvRKX%9+ARA9u*_H>Tq>ljxAjcp zUeo_^jKW784|Ldg8>x~EUi6~&Y3{&$AM@G^u}blFdseQ$rD!mR-?^CgoQaVbj7s0Z zQCAfx{08sC1N<2AF`2|-r*9dwUbVeo3a!U6X3cbs!ZJeoFDx~};oCSsn2NOmSmde` z0^)mD5(O9`Gi|jG)3f7p3v2zMWul*~Qkd!ISNm<1Y5&CDaWJM@tWm~T<>0mL_=wTd~I z^>Qvix!V}?kzP5@gml`&F1eao$woEHIw&tL7(0M8HU$RZ*JfoX;;3Fd5nkd?9_G>4 zg)n?YqB(QeplUC(a%2|I zq%2ufO~LJ|rF<1|{E6z%adegmP%{%UwT&4ExOxyOXtz!7%jj7cx|&ifPZ4;yetlTa zd{Pb>Fwd{O(sEaI-uFVzzGYJSl2XWSN-KClC#4$u`p6@;nMov|T@QxK1bgG*p#Ki` z*gyaFTz*|J5^DMo6U-Ug*~O%p60rd2UYYu0I9hs% z>bU3wiGD6-9~$|=SA&#wvFMODs(;pe0ye0h9 zfAb28XGz-{^_^#M%*#+16C-%jRwicmAC;MHmz?$#BTn}7Tmm2KnC+^h+@18Gs!i02P~q+H zdJ{YiWmXcw5Z)|V=3to@3KZ(?OrtJ}Bd1g^%ny9qOa)`s4RWO_Uw*KSwI(_j6X;FE z9i-6nBup6iGG1zT%z~MC89RQQyt_4*H1r6Z~0UMR))$!gWlJwQ3`l zn;Vw_DA`3iY70b=-oGtfNtiVt>CJ$Z-e~zUUnW)kkA@UaDRms`fqRRGX za{b&MKh#!)Av&R0E4)2pOxG;myQX9p5|iS zd}k*Sb?DokZq*TW<{Ad203t0Qd!ICA3lU<1XuT+^H+Dt;XEXw71UU#cKSmb660;a* z33dKND+@+nDaUL1-N@L96?W70rH(jU^}v5%4||vy#W<#@q(s5QS_3aCBxIBI6T`9| z)bQuXdFvkN78@=)9Iv*TU6T`Ze;X|W)cZEB$odAhRjpNIwiaxbRo0lv8*0Ar&LCi; z%IOiP>0wq;uML4u0~u2=!L9n=--wE`fO=imw*q@{mMb2*v7?2Y!CQnVuM~EN`J!)$ zp3NrUXBwPV-gcS|^4@_6^`RL$&9Iw{hbbQSqNv@sCuy2esDqzwQ4*&fJ)ESi>IkeP^hOloicJ%Fax%Cm zm*BkZ>^(-%DVTRm6jyk~0GrCK&>pJZB9N=;=E-xICLWK9yDku4)z(?G5GU5RtGc|L zmyYon2!B|aWz7{rMrz91<@qYn-DcX2-A|@@!!^)Ap2n|m>1fsvQgR74{`No`MJO=; zKz4; zeP4Xs`By6wZN^Ql%#NB6%UhWzIaiHY0^2|ETF?^o(nA!fSRbS`mNIB}l9A{x(n47A zDg6)N$~XAx!rX}wkNlSNX?p3XPb64}i)VnLG(a!zR2HulFofz8&8?K;ZG*pVoN7AU zns?#*u>cI*T&CY)b49F=?sq6%xB7B&GxG2lBlKCkHNfTOr8a<0}f2nDFRie>dn{9nQj z`xT`93t6)4Ft9S}!ldYSm%s4yi0nu;@nrjc#NEA~-h<};9eB$&VUO|kthA6BR7-96xb7WwDpH6X>fWd8C_=6D5}Vnp-0}W z|DKVaIf}`2v_S}u@9g_RMZ{t7Tmt1V74Nuti(p`S#Q$=jEZS7%HLWS|JhJ6_xLL;M zv=!B`clH*G0T0D}v)-%s3QKF)F*@`9dL7aF9(tZ^{8I}`GzyL?)QoVmg)7dqG>xgW zX5)3^CK9II5@E7!{R)KE@rm=Rc(aVtAs=`Dm~Q5Wqqvy&bAuN*Y(y(+oF;|Z554w9 z6i)y$snsAhDVMaS4R`({W-^X{Wb-=DznFbE==LPevLJHbM<|9BTE7;?j-e1^qMEso zCN>}=BLHJ&gq({$$Y=dZy$KmtF_(!p94?~=YfTh*nG5;!mG#a;UV(6gZ*q>!9NdDV z<8mrWFMO;zDre33^JEft9DUbyBK34gh;ks|6Q$3I3a99-6dw9$H#a?VVNWf2$ z*oMGCpm`Kfb5ZroD{#z7n%{4D9S8P7_HyUHj3|$+>5USOjaQMSYnQPM_84h>_ueLq z%uC3d$v>Va<5YogwgYw904w+9u=S@faBhv~~p#V3q5 zx|x>cLY5(8zqfsE*})-B?wJ!e0aT(O_-6-3$dDYX8z)pZNZXZ1Cke~zv2L@CLAdwq zUGRpC`ZSkxE!kE~UguAZW1!=-66}4Zoq8|F{Jt}b1l31Z7-LIZq?IRsTo@K#sw4ry znJtigKZwT2S$7Sg-M*ImWvKWyxoSE}T)q|Z7ZBa}hFM^wIPXFlXSA!@3;(xW=<=Du zoF2zCZ&caV)hLErl^$1ZhhrUec~wX1yPW0h%1 zMYb1R(~s9gvcFp`t`qs7o&JSC>ARY8IRp45n|4%#@uPE-0MZrEL+|*{9v|%NL(^AD z*UF0Tl#rePK&EYeFc2UTBv)=r?cNDa#_fNFg0vJI>vvl;X}=voW0^Slz>f3`R(;r~ z?D^Z!=e!Ns$J^NJurLeWPZMEEtQG_$OrVDJ@ceV@G2@p$v(urw0&6{jgt+lJ6#%Wy z%IHSmR5f80y}~LKoa9v{#2&IYDtv^%r#5vGV@}6H@AaC> zBk@JU!HrhhJm-G$cVkauLXnmZmTo7~IxSDMg_h$g#oe$AQYeHHHVP32Z-Pb`o$}57 z26p8B6P)!fCgf-~FL7t$m7;G7df>JhgTS}21MUdRwwK9Q7JF<8=_Dt)O+xa2n?dDK zY&UH)0m_%-!ZFf)RnHTweJB@p7EmT9(tl%Op9b2uO=(&-o&~u;?4B*2 zEjsqG!|ISiE36KC2GO~;`#Y@Y|D&x!hJFDaI@yISh{z@(t%sce8u?*4Jm1V$RH&2w zI%n9mlPBP`q{Q9LyVaIXh`IOwb}2_T;58o8ZObP2b`z(QuU> zL*61xN0cC-WweXy+oQ5xZ^g+bMZhCIsq;sEJYGBY6Tc^`7RYY%KHW4e>I#`6uAg5K zcUyGc#v+e|-y|FnB)!1}R9- zo@--FzukX@G9z*|Hp_}8UffpV$0Z28V-0n?+H8Pl{tb^aViRuuDwnjgD>wjBYbE|` zqSl>arlaDf&+)eIG%I+9w`O-tOvFs~;VD^<$P`#8E>hs3;5E#m+EM=0S;c>X?<5@g zU+6bPZPgY2&C#vYHkDDEIA&fI{baz^!QiP8ikw~xGJO*NBp-nSJD4$T!O$L+j>U`U zKrm>ce_JnD4y5)s1{Y->u5KlwE`2SKi^FT#fq&6t#r^D|a3D3I-KEuAmT^`eZo+X%sKSpQ=&c}J$QgWfJ9jBV zyQLy3UgB?A8})hdSA{s}(iN0i*3ZR)7VFG0O5VKSTgj&^w^>YC=~73BZuD7(f=TM> zJ+G&L2`)W1y3Td}WR9CnZ^D|knq7xJWWZ~$(b7sT&P?;Mbna_-uTM(6&4N`qX6k#^ zf}W`8?X6a+Tv`Ty<4w26K~&o6kUIv^O7N;fMe1AR6%w!E3}jdKb)`EMSKbVkQM=_- zQd1@m9~zIZU^V}Hp0NLtZ%o{5iovFMMfID5$3x9yJ)-UZ{FL6>s??@kDU(Dr?Tbrb z0T0EmW>>G_=#)AL$dji6ntnRHv9;5)=Jv_>E+p-W*tEwWsrI-flNfE%LL@xFyHo8P#|t)4{ZNrKh_z+g)UzR6!1wsNmyBw`&80O3E&WbTLP8o>Tdw6t=0k z)V*Ym{=HmJB}UYBBkDK46VzTrdiQ z?XQtx5R}3vg>f9Hb$Tt7H)W2kN{8WPdtysR9VET7o4!%8opMfSpVo()AKk6~Z8cH( zq=oQ_MdJqnHlMkZFvlDbOl*M71>(usv7@Pq4X2gi#p~;D6yHC1cG~4aj{=Kdb$zn5 z8hboviRk&R!C+PPisCK6Tr115Wsl}$fiNN(gV9)Qz1KCcWDK-u07NF4^}{R;E+(Tu zhQJF8N1d4W)0bk0c-Z}eN=MFK5e;49q^En22X_DA_(WxjTs(CZ{1igR>jN@{HyN5& zqI`uSb9h~b)0LV>(m9cmJD#(FC$7a!tv=2cP9R%_?Y)|rTcj!=RoZVtJFNzYHN#tM zvIq$EUP0Jn&?DI$171CMhOVYBD447*>fJqlh?XCLZPCtIH9dIaZG{gH!?U5pm?T_TP0Al}fb9?ZT11PgeqG;%Rcc?+o!)p}z1D3I&HByv<) zxO}FlL&>2ILcexYd(BU4j)vCP1{DtzLX-HV6N5X0>8Kmj6)13rNPbem+(h?4F~!3D zD9t6};5NIy0JZbIXCR&(I_c@J%jX_PS-6f~-7z?WmQJ1-vUK&uha!0uP{Sw`?Pn|n zuxs<}!~^*w;<}C4b;?oUJ%adh!Mr0%I$;S>KyURkafY{+d z219!9*Fa37Y61!I9$C5)Vvk%%RCFtk4}J-C8=dcKyQv(R!7HCrSDHW}$wx!_b57)J z*!}u8Em0WLzAz8z-E_pId;o*m@!fuw9g{Jq4oYRiBucz*4$K3TzCueCr1`ue)^9b0Q2|yz`985A5mRYJ^VObc2fQ$!-np z!ZbuhYHTIaL;m`vw|vyv@isdcIjh%iT;@8LdtMk6b+g|9cibwgNgBWkW~#is3Ey*)LVj$K?d z7;m60`~*zGK4i#gYU>F@m5WgCQ|&&2y;T^RMX76_viqzxp$*cl(EJ+o~T&O2#>&Xt%RO~Di`_VrR= zG}0+V-y@T-5uK|Ma+3%LFI`Wd`|b;(o2?f~o~q}0eM5xuPpWB0Tk;II4-jTW@#yLz z=(?jSaW;xKBU78mBAKx^BRHUfJzt>p;M_Ud#0etg7;!shU{Sq`bRw*)m|(wf;yK+d zD^erIxD_AKoNmIImIctDfFZh9CO!R?m8pt>3Bbm$jXfHO=n<;AB01f2F7;=#q11Xf zqpDMWaaSZ^;MBPda=zDp`%x`cX(xP%lQ7_qI6vibM-uBI2dPkf8to6|fY`PRMMF$goa5s&X! z9Vsh{eRBSLfDcC(WHaYR1NvBg{2-;&M#@iH)PS8xvH6*CH_<9ceb{qS6b#mgV|KGF z|I-0))By-$gqy|hwM7ntwUK zQ@5#+C}xl*6wvy?tW~~L@8%qRefT(*7IsueI8#M3sl~5>9G_fvT)rCo-%t!PYe-)g zO;PIh-6SX9A&y(PWKih?-~c!%{&QyKl|e+@8V5asJF+-N{jUq~v};`+uR*q}diSZ; zR&?O=g=Ao}jj>`G++w9onjwoIDCR>0!TLiZ?=ePR)neb#HK4itJJfCTunVZuXjtpFa*-&migFP&(gnHAZoJ2B8WNVo73 zzDyEomW{+n-@#iuZj)WIc8j=X_+YhO++T*LL1Lwd5NYEoz@?JJ-gonPUSf1s5Sdlj zlx>PDxWxA+GciDA!A}GvwhTrrlJLsY63;N(zOgr}=z(~q`@h%sbRC8W7~VdVSDVwy zXl|!TfkYe&56EGjULa$&fDnEkp)6hAm4NpOjmCZu8~Vrl=_0DhGUKIBq!(fuBdpQT zw;qLYHR~7SgjJ1mNlHEb6vV3$K5P)z7h#!yEf28>Jzkx@Esyw3J$IuBJIZv2+rY0E zZ%Mzg*Re#Hv%bO7glJwH1o!hs7iIl7eH7{S|9x@|yNd{4b!8s%)LD5kG=PDe(Dkl} z)B&_<2Nkoqa*wcF)7RsZnLOS>pOe6WqO?{D$yeoym(a*$`VpTofWkAEJlA!+?K?m% zS>!J99>IX9pzbWigf7P=5{$hW_YtUWC$gz?HNIu7ZM zu;Mz0A4PPzkVc6^lVhRRrsbwBrR8g~zh`0gO_0s!cViHT0!yxFH z5x6*G!V+N&JR|SWKl@Y_F_1^)p~~Xhk#j7=Fua4&lMD0KCb(7_3_U{o*W8I zQ)8Ga4#)r9#b#DiLpoJxN4m-zu76}gU2#ByGKWh|n??Pqj`z(#;Zf8W2|35z}GZ3f0wS;bMIGhs?Im)Cf5rDh@r;v??p1jFkhgrdp<+*20L@xU`0bm?l*-9@|9a*5 z2L1+K>cUP9hq}e}q<;~9Qblv&Her+C@S_qXe9OH-=DoP|PGvI=q|Krf_<0_J8zisT z7Wb)CmSu6in*1A1dc>5oLnX(^qNNaD2N=LRHHQTT!!yAvbycB&*vzg-GW6~)AjO?@9U1LFm85&q)qUd zIRYHL*dA|oM#^F4DH-(O{^YMr<_z)oK}%8Xjcj0!z3>Df^(5Vh5aUWaV;os?m+LFa zl;Dd6t`q@p`+)8bl`6+DvN6{k!lsh{?(FJ&+*B%Ftk~)G;l|vaTZD}rAQFRy)tZm# z&o`0@+hu;P4&yKpzLZLckQhHrt>^~;JwXYCb`+l@zVfG4xMXPpL*EIZoE9J0JM=mwFkLv%!&w<%4#^dFJkn zx>ZU-jDa~65x1zwh(#D$7jeK3LW<$YlCX@v@W*=>Ql_Ji-M6g*t4Duwr`?EatndQ{ zj0+r}v)n^}E)mjl-%cN9M+y8ssRlD!o@h;jY?hv^c7-XNR6R41yKGMe*`d^_LN1MB zcxi=DKpP4zr>8t5TOlZ|-Nvm3JK*H)~) zJy7=3of;F~+~ZE8WljZ0P2yDn9!!^U$kd&urbie%eD6S?-q@&{iSk2z+zNX>Q{A0X zjCf&}Y5Ryz&4nWAMtiPkG1%tvGz`pH_T+=R6A6#;VVk7*j~2^GNHG|xyqLhj+6k`F zSEgcv4?eho1haZJ+jXcU5zq<@ExVu8G#b(mJMMhDL^4EqlbXAseL?01TYsTE<=77E zqXNJ<%J3me*xmxGV0p~4RRJAa9uj4B#E^c+YZ%cInzW!PZaKGX-izWb^Smt3U_kW2 zz+a4NdUjGO!(YQ7h;Br1Ya(_)g@R0QG&h*A!Yc}5`BiGkRH~as(9NR*Nb*r;_(f6d zW;wxi0NKHT;)rRG`5dPBKfFV0(hCrPgtG((8V_$QR#%Q{9yh;dB+Z=qz^G-?hh%K$ zCnC@ni+07$(F=9!<}K`*9mjn$pj_UtU)j6|d3k|}R>c(2hMMY@D+li&Osq%pav0U} z9kYMIFl9!48`pBJ@9kWO_u4mMdEpY$S$3+>RyQ|Jr` zvCxcGg7s4VgtSH>O%3E6VCOr{7NcpEfbnFxC!OBC;!h#is;YJRmw5m7Z0#W7Ef{*f zo9sKH>P#}1n-aGjG45Z@(@Un>i&v6e8v(ofdd2!5}^ z(ZT-d3sI&(NjY236}qX$TSwGE0x_f#x)oGaG*QtAKYUw>pS%;beo3Z{pFCu>nf*iN zh)h`QB?l@$r4m(boEBaWi|fIVsLWXtaNdt4l(v!J!X04yMiuOA&)#N42lZ^(xc{OCqz~GNPb~f*dPS*<)c+l)66_zOPGK z{|6veO8GK~`{)i!BT(9i^kiBt?N`M~WJ~n`%EZZD!{3TioxORBFgbYI4_|^Ys{(LC zX$(|btsafFus-n6fM9^3=r#SFI!HL8sQEWYo)X z2)FeF$jH^f>WF9e_O3W$5)}=5Jqyj6ce+#3QRiY-(E!wb8j&vB4@M-6 zdsL%a^UcI#Dr{%mWtP=6^aDxhaPAGDvS{c{QXyo#5YI%vI=0vtlDP%1pcX7ZJ`^?# zs%JEtm3&Uqmlkw-*msG;Rhn@w_ONU?MlA@<*fK$VJhU3ZAl&1VmJ9g<-I}iMYp)dI z-;1HCw+p#QEejuO?qv!1@NRm@E zadmi58=D$l5@8VO@yFDVPN@?qRl4OfRjjn2?69A( zR3Q0D-ukiOT8;5#NV zgNaz4nt22;m&jPj%0lE03dmZ)0TxYTUL4aexa{#X;rv0RXD2}^<1w$kZn^g>pqL#c zNPw&fNAu5a$h?6hqpHa>K)Dsy-EWiE6MU`&o}X9+f{g4~;Qa>&P;2_({PLb_1L6vEgZGPW zc@eIpzX;e!7x4i+&gw@*he0UOx|uf7Nj(P+h09qGFS4m2FfynT`axx~;JuiQz6g; zuo13Aw;alrUq5P1ct7zh|vvHI?6XMa}xsfZWyF?7tch6Ib@&Xvk`Z{h`r1~s6Z|6ZKlacaE zqdhB?*z$%_s*aH%3Y5mOMrHo;S&P0o8X5aYbQ23Hgad zMi5XeHD}qRsq#FB3uW@Vc5VGB6C7G@@B9UFw_$HHszJOAI0v>J-i*7qn_67G?j!I(v-dOTLmWlOo+%42-C@!<~4YL~(hWYv@Rh~Q^<1gD>3-nzo892o9jkJMnw``FBo zjAO9{b;R!_oq3PQX*c-{qG@xXJsB+^7O`^nUdWL!;gQ=x5@RAy=mSrAXEY3b)2^b? zSy^Tyd{Xljs}NL+zx2Z8bi1|p>+)x?n%x$Q|3;%L?qdKMR*@RZ!>}N0X0P64c)`!v zd8=81zP=sw2vY@MTazx(g`t5(dvZ7>jps2yf|w(NWUTP7aWZ7&e4mM?cg01rhE;KQ zYkk7WI;_*KJvk}Lb|Q!0Olful!=dLP*pG39BpgglsJWD-B|w860(^q72o6?7HadLZ zmITt=2)~Ay!?j9Wk9_uQOYpz$OD`bJ4-N9DjRfoh9PA}c*Gk2gR^qPNl{_!*~>;F1I}a)qU5^(F+k400z&eM8E}rbl(GS~y3}Sh+ak~9l@uTo zvuf4j*9~YD%NWM{#M7UsVZ!hLKEyJUlpuJW^gQcG!m_XL}82HmQv$I zK%~_{{PGho&yDY*b`L{n60^P@dDe1Q?MVb+aW3e+UEKWXCw*Uhib5ag$JIdj|7@_8 z&&pm5A&F6Om_2$+9QDdP`D;ytXRJWcL0Z+7C1gT1 zQ?MHM;hj*GGu3Q|zg{<^oYBrJc6#JuSQe+^QyB#UKq)GpNAF=!=gO@#8{fs`j}Tu@ zEXj*X7HUdjh_$Q^BEkpqUF=$&@u6tJVGn1E7MHJ|`>g+KmWi6RT%{2yL`;DdK_qjDDHd=L+7Z5;1@`p>ftDNr0Y#H(51lffUy$Aw8&MjKyvte|9Zs z1thU6T_wIXN@HtngvrGm%B1OqFAGH(b0{0Dj~Y}QI@2Ih&9eJeN^F58go<)Iky|qe z3&g$Yd*JQnF`#REPZ+sLJw-ZW*%3VOLgr+v`}!Y*5$w}lJsdAsr82@rBNZ%xJ))sX zH46>h?ykW^_<%pYC}l%uX;k=GMR*&y)r7buP`PZv0;~(BPEQw`xa6EssFqxj+cWxd z?=CxOsQ(KiNCj^#M)toh8Ocb7GRAIj#p+G=v?Y1IEJs(v^1b!2j^K)lALnb~zT-A% zi~`q)@~{`!0Md67(2s+MmP>)HSV?|zx@1SlYPop+b>0 z&-!VLbhl(d1z4n| z)o~fcebT==xeTSM&_!eXQ&&loK18kwR~}()%(LhUN|4HOf3VjpGz$!ZP58*iWpcPA zu&4gcYm62(2HscaWH>*|#jawfw#a4bpp_JJJQfroXjSa~Dqr_HVsuiZzS)+g! zCdLP_^A%e2wz=*R4mVpzk%tDV%>F7yosJJ#;f!B_EaeduYb~2c0)FCSN%ZC;DRtKy zx&~)tYIRGllCpso<0FnPq@6MhSM8@4d;zkF<|lhnGybTslo+P=XG2KdAk%WQ9A`#% zB*5?*V6m`Dl2zcvQ|M={=j$u}2s=};ErRvvGi9iLfKWqWU?|_8FYxC1ssWCud6mmS zgSAqI%)DDq;EGnZo_Ii8`2C~1)jU$ZWrL=#88tJsVT!TKto_r>$A2!=^n%yj2PAAi zgbx*^HoB+*#~E!bN8gid4QSNVp^=21b=&R2B(b?=*vtY>@167UAc>xg=*o8wArF-> zdW-IchZVTw2Zi4}Q)nFF2f-YCnLIh5qS5IJN#0xo&jYapf`Vz7Gojx1;c(P;Fz>&?#Rgje`&CUv!dSSWf z^;l5$42t5y5!C*`8-+TYphLDs^D7MH|MA?LXm73_dBkY~X9C8wf^LN!q4Jyb5o1cz z*KDn9b!F#^WU#LkJ1LM&Hk5 zi&&&nA%Ug-BiNUXCb9W}w9Nf*W@(Y0&fQAhq@1i2b*wQH*=CRtKPvwn0EF>}n*^CZ ziSn}O4+N*qGv&LuUl-69gT>bBl)X9;`zS4zZ{3}?=9c!z+UAh+V(c!iv*4m;Ew8%C z&zzi^omrH0kKvwuheWO3E(vf5?6?L-M}tHcoZlW~X|TTK*_%#+vV6!!KsdsLoEDV< zrl_nl<555+=RsnxQn%uR+{n2g|QHym`O;4wQ@aptIpJ{tQ<*9g}gT-R%m z^s6+}=X=fg^2R|dJ`X=9MFXGx{TgcqJtf2_3{#Zo&*%2vDebDAwS>YRK1pNqD3~tf z8OYb~ylSQ~utyS$6(X^?KVC@o$CF>2(=HqQyT^YdMB!_XHo6?zi|t+T}hI%&i0Z zG3o6+_G8-P5q*Lk53BYZejSpNlN|wqWf%d{?xLSDc(rugfx zO9`iR!a@iMIjQ}EU4!X{8zd>zd_ty2;p9G#n!TMZ{(A{-)7)m)%SlK6>Gk0v#-wiZ zcd8S&!e|!-xj3H=NVQZfp7b3s7Fv-d{6Wj3y<8vcdmSX&Oo6mooARIdoZG`Rwh>tQ z8y5+DAzBRj$P0fTet)}RctfRAz>x7p!CXrF3@srI7Vrecf=?k2WV8!TA%HP^l!HS| z+IQ6>g=uQ=vdLBYj|}=&DzZzjS`(#W3$*9K%{hnlT~cT8OEEJU&5k~uhB-pVtfJUW zpZSqbwIh^eUKR7t5+kNtSnm+_fEbRW;1MY>X{t0n5`$yGaul6EGas2RH=!|`jG`*3 zPex;^#%*1{vx6e2IIAlV!>Z}HgG3_rjDiU_A*nPVQ@Td>XOpE3#K?DIq2)T2<)?8R zqoY8y&+&La9L`X&P47gWr~l;?wYsmpdgFYWx)-Elq9qlUYd5-Tmz^PQhy3iHSlxPh zDn916pGKQ`e@ zTTrviv)d&C7CkQV8fnTOl|$4PDy8t3f@qM6;}brApT|scF$Ji4-AcOw?G~Dlb`$`g zO^FaYI(6iC(S*&o6wThhthONIb(C-`d3wp^JpYkc5+kh~I{%_r@bdGSh?4cKQh5On@!i1$Mq*Jk z9?Z2FMynGZ#JrhK1~Klz9~N%{fBFA)k*BL6y>s@bm0do>=lt7BwUgD0G8OF`)nmoo z@K@D^ZR+OhkJRHm@KJZ3;cI>y#qh#mW`!y(++lrvhYCh)Ug;l>Cj|0m{c~leMPpTW z#MZQ4r)uO?7?ZIBXf!WArk#D}jhVsY*@@?dqesG``?u{me-xn75oJpGtjpc}_`|iu zhuCCxZ{jc0JyE^uZO>u|OBN?FcL>OOii5Fpe){i(E)Kj&9vysZE2xM)YW@)pAM@U- z{}?m7=;k_j$LlKUd#4po$Yw_{i$zP;C~u$zu?C8NKj^yDM{5|Y`US=t87=G=APs8U z1mNH#Z{pR8XV?mf!5s|PiBk*u(iAc@^Y{iD zsyUaMNp!?6vc<+)K`v~4)e`$cxi>!(&;GH*l(_V2k+QDVY_9CeIpymz&zwDM(eeN& z0$qwb42OKJoWa!Ru}EFQQ5;-W@Gr=8@OWl10GGi$NobxYPCjJWKw$dJLY$5scX>}p zg`4an9(=x|`bQ|-C#t{a`p5_~x-5q)^l_dn+zX^=}xbuoh3-)-#HC zJkrZf?p-Z~`y$Kp@4F4!i&O}N?FP(Ad!M&lP2q9-t-o3o7?VMjYjIu_ z&AX~fO@;_+F>l!5ED_!cu!+w1cXO0|9n8njxia&-a%O6pYU+OsZ|x*S_`~6cjJ302 zdN_$iLCOq}y{yczaF;jjXM8P@?8Nw}j~N!(WP<@aEsR`*oc!$$j$#g1QXH6TsWXxg zO9;qQ_Z`xhP`LSb1Y$K7%00g7J1!${3-IJ9qRW5ysRt<6F&!@G-)hiF5(ywp<>HZQ z!h5_$32=Hk*R{VyGKj!okvEv0aI%e9h9e9UsUE;U0fyuU8)l)1&;>tIYhtNJ@B2}eEw){ba; zX+CxD<((gZq90i#nD5OR)DdC(ST{V)R4Bma7VOpP>aSGBLG#t8oMO zXZ7r*h#=UAb1|4OqJNQ_ZJA~Vkh7!shj(?-FY`{HG(0?4ps%(gw}ll1sk0jz9rkKW z=j9>FKECOhRt<)3%J8j_d3}XvdFU?UrWYx0N{PoXjM#v^_HL@P`QJ4 zLEHTxS|q$iGGaZvODZ}2b^s_#$L6t$D^i5SC7lQ$ReL$cgneh4i!rjW+2m@;kQ_|M z8733GMj*x7)h;Nv2!%C5KD5%f=U7sQqm;X2?UVV zk}rZFN@St`muy4)ZqeDh+I87+0E#C2YU+aRxuI1xzGoy%qCQh<&@HjlF4sv(toYhZ zMOv|QybwV!5&A%FO6hqEm6fn6_3jO~A<1BSAV>&eigaSWuia_X62Pn?v8{Kc3ZzA3 zBRRM0*E0owm~+fHfi-Luy^|wu%poXh??35sVylY#mX;}li+FK;vq58p8>2vt^wFVB zx>Pcty43cApX;L!aPiz=7trMmoN)w+cK_az4lk}u`^VVvXc==zN=14r-{{z&G%943 z+N{l<#SCEN2qh!)K|+NzJqEh5t$IW;z4_(HlI|Qy31mS}tluhBteYq>jz*ADs2%hU z77G99UlxD?U6PjyvA3WG(d`Yyv>6+ipq_X%U#TndR?@B{Xo62J_mAH&TdW7{mBa-3 z;9Q;#XN51eYXVF-f+pCJ3k_E5n&3g&r#J==J)6k6iNr;xK(bU%a8k8e4_l*$6_0(k zTW}mFR)o+mF{gc}f8w8nHyPQEcV7#zHtTI`YrEF-bf^{)k0t zJ`e5zGgmjhkz4vUyi*o7pt|*&?ul#D28%@6&n5nM!$t5BIRKU3t-s94B|(PP61f@z z{s^v2Lr(zoz1wJS(8)Tl4D0(RA&tg3MogO;xjLUr%GBYnx za?1Y;`E=TwbrJt5Xm9zj#d`LwDF#0)5g?3xXPwWs-qyB+=-csRy}}pQ|GPrN{aHkR z)XXEe46#R}2@|vgP21*;g`$HNnKPW)n^f@lbSse+9HYa1f3TDKsnDBdN_vbqD)D*O zvw1FinAJ|Zh{kTXSO91T^)h2X@q}^>O|N`AJ!J&rqAir! zO=f6J6r3g(5qMY72ubm$Bgg8V6m?D9XS+#>-Ht&B3P$f0T3M@*0w~$Nrmj)(R~GRy zkZ_`7!!BF#_2^FHfH`28Dvxi0w>OCyN&A&eLo*aXY9(2ZM=aZ$*%0t|1HC+V%SaGNmq1E*NY|@pTtuJ3}Mrcf0&1pe-P#= z*t_*6tVhd-q2g+=*@lE=%tb1?c+%^AhD&FfLLbgDbK@=4;?dnkN(YOOHi$z^-@ZWx z9jqkOJkJmD>{VaRew zh4*(5EAI{qaY^r|&&{DMYV!Wvg;ctc|K~=ZHZl^r&8kH@IydH9EWh`7{^1j?7WucP z_r-!3-yqox0uKXF5^kiNN{1jQMSoS)^vCj%1N63FND&F_-#N1q;sjd3bibnM&+cR@ zbes%qTA#U7UB7xp!4Mc7d*S(W#{EAojC5Wl2rHi)wVaHv)OEbZkSVOc+1O8&_az(V z8_;gm{j()k(bnzFOzL4fz7Q7@U**$m?YG=#>&`J9e0TXoQJ--*ji~gUHX}@6w)s}P z6>72pqsOTTR7i<|x60@>3H6#GLvz?gZHj;#$(mNzrTj%jsfd82(saZ3=oU!aSXNO^ z4_IF0Ny%$KRMaQg#FLFO-dEcYgvA&js@1vV2ytBLUK#Ex%<;(O zHw9LE2QC)?Is6x51Q!*q>DyZ4*!V?fLJ^r@ zcX>-!|K^U+^b@FDvot*VtHDe7cUO5)^*Dj6cPG-Y%sQltnN!R446lM!hGv$ga^4Ad=9s6gb0CV!-bv%4%EWEqj= zIYb+i5VoBDd>?BwnO)vGF^n@Y;)K7V9g=MsnP_b5#IhK)`%xIs1O4v$uj&O&wHKQF z+t-r(%_0Ct0!aXGA9r!m?}U7Pxq{{9N;?pvzh6d@o{o4Ek-^T8Au%ZmKq{-=ZEq|} zdKrvjph^eNmxqh77WM4UQ$Bd!l<{2Hj`%7r`(zM_QTFCbJWZhCjHPpt6zlMZpTWSc z)I%poiuc~=)d~C)bAl&=S&c|8!sm>(tda%m9*2`AIka~mszOtKbFh$c zq>JfU3YYtZePIo^vgiJIv+C=eBe51(<5}%bjRpyTqUw z8S^&e_u~iPI$pDE&#H;8n$Yw?py3Sy%~jgelPUaJjw8rAgL|@=S+3s!@cZNXtRDC-RJOqBWw2Dh^7mB^WoL($M1 zH`Tk2|8D*c&RkZ+zLs9>n3;mxUZAT-zt-s-8lgBm?Edo!budf;3wdgK?gOMn`lg;< z2kj2ru;Z{f>zx;Ey(qMD(PnQ1JpgGl=OXK&&&byWwuMMjE=?B!C`#UHBoTsra~U^i z6{Hl@JEvm9OnSk<6aV->L6EEZr_-flnh&2PEMf+;-F<#>wVM`?l{Dr6KVx5crKMNeDU#h zylP6V5aG^{e8}tNr5URni*3_fHey+dYsvM-H`Cc9D~;)y|4r0Uu~sgW*yAwY@B}E^ zNQXrH2nO>GsgC2*qL#r_lK3A+BR^vlmK@~!LGo8v2MFkYwkwdt)FbMThqq}|=VKqn zn)djJzDl0ds`B)tei$AE-}3_&4<}4n+I%(eNFf~haKb`K1`FsM_pg+Du7)isMdKNd z4%!I_7zsp=j_}%(N={ftw|MPVA6IhdXaI&KxEPcgZ%S152a*SjP;;qrC&^Yn=$EO*o3BL)0oQ#r73{FC-AOyKFa90k zm{*hXTkD?!D%soGWPt(;QS48e7lS!hm&T*<WH9xlbz?73RXlw66*6yKDO(AS|QZ@&4YcYod3o`JPPwJELC5v0s5uE|%p z#IW+b#Ng%$4Ug^GK==ok^Et6Hb9vU|uEy=2e215N&!?0mV^^Xgdt$@Y1w`7klt9iQfTJhqxGRR64xl68rJNI`{LieSji zG(r0Y3!E>;a3>Qxc*&*(5TS4QPFz8cC$Af)B-WiTEr3Vz5OFG@cL?~C95*T~Ry;?8 z8O_?1+Cb|8@Cx@034j!UN}i05(IMwbV@h`48&9LF|5XOt`dv^_F$_p}V2b@`@__l*4E<810{iX*!+0bkLT1w7Z(TYh9A zN{xhh2Wad5K834~mmpCi3Z}C9U|BI|r~dSXeKQyeNcoBLA7K1UKEY1?Ret@qg{^B! zDUru>?D(aW!=}ppt%=bbAwb8_CRY-)-4p@|;R!VOumd(NdzK3s{y(>yzrP`1{(aC? zI6t%-^rcZHx-q;NSC+SlwL6$^S}U^I$wO6?`QapLEnva5oD=|rx&el&#QyKA^lz^M4Zu9HmDnfaw+fM99IT5O8lk|<>YY#qMQHF2*|_3vQiyDr$4UvyCs zid@4UCF%^S@p&cEj12TT79Qa`qWVs{DHaUB_~vzE`c%|Wp0T1)W;KtXCUxDb)Pu_K z?9_`W;y)Ao^36Aw&ZsN5#u3g==SP|U;ic;*cqzSG`H5~9_4quUgTjk??o!X{sEx-9 z{BZbhUBTGf-ny)!ExWv4VATjadlpT>eVfO)#w-E#kwAlg`Dv@9(;Lj(W)rkmz%xZO ze(rjbH^Km8x$CmdGp%(>jYxx*ZUFeHUhDA?S&?~Z3*My!Rt}p!Co8%}lCGN%S064z zrPO#7jZ~a?wk~mZY~bLaF1)rkBv^Q6DG56Ye8~U2>D+IaCfZihun;J{a$OcrDAcFB zRxHy4^&DmfUmnhdrO}UI*%74yT0C9QK4dgL%9_ImTL`|0l|K5v}XMwLm_I8X(;X(A13 zUOe^i*=&HN0>cYw&~kFOwyk*reACY?<=1}h+{O5B_UIjsE2~6ZS{~2*a8!mY`83b= zPH?TR0C=FA@T!6Eg`OtA22FaLObHk(_12yo?>#}vX#o7H` z--zYT_^MHMk}BL`T6}g71&K!L?3tx9UFq82IET)ooIpdJ__f2;ID=Er6)|N7J6a*_ zzml~1t~owi)g)@0sk@cvaG9OANuhM5W(!ds&H_t4!`#Ua{~*YRtR$Sj_UZ(Wri?ap zQEubu>jhkx;=euW=+N3Tz;@d(IXf{z2;-lTcMXP>^2eQ91m2yB*hSc3dyj@%NY={`88^=%u4JJibHF9v z9glntpo>^7!`wO$$7g%WdT?1Qoc+^A)9EJZvoVc<4cFSdz4a)u<7^6(f zVD+gbgBbT_Hb?ob5x%B{&c~n{wv&dE`q?$lzK0}3g5WSz#PUtAS#lsQj#fK7NEXGd zzg{R*hCbWYH`hi3e$Ziu&Qaa+D(lOqvy;_wB1{q&>8DK1oF0VL5_XW;H-kMghhEgu zACP3zT?bh^2PTKC)=3}>j1$Zd)Q5)I0LTCVGAPA)AJBxfpIy=ud>S-*dPJB7Zc9=H zh-m32s0*ZHk+qy+KxaidyfGgV&md;hk15w_Rf<&tK?>%PWgkt>@(X;WrdHr|>zj;B zX_PMStE#0Kd$t|w!RCi7@WT1J1E5L_`h_hRJgc%lc2~gaY4DAYC(YeeajIW~Fu0j$ zc4;`WdeD*Uta!1x#lrXQ5Jiv-6RdGxL~!`Y35VJ3Hm=3zHEEgh-en_$$A6Uev^L`r z;lJHjt^-@&<(&8#$l(H=qf>iMu7B@eYxdgC4ivmfI$KmCy&*aRKQY73yec^0>XL|4 zt$3J;Hsm8HZnykmkCt)m&>b+&8k{qqDE@|&xtkL9un=*BDJ~01Q+N*ooTiT=X|+Xc zwZEw7FYI!6PeWit0sBbqpu&Q9{Vw9Ihi5fEF>FDIH#yPd915W7eG5`GcvDm#FF*Tn zQ`*Vf8!p^GdY*{E0bGISR(9v2P4K*ODWZ7Dd})VvHF{BsI*qV!eLayw&kl4+v&_tv zqIq*Vr+IaHHWzJ?aG4Zwy(Ml%J_WH~(Q-y@wt|<5k(}0@ivA`6=8z4jBVh`5#tX9z z?IzGg4vk^4gm$DCxZD<$Md&N4L4F9b+J=DIF-ehRdVQUYQ9oof8^Iezkom{>i8D%JUT_3<(l z|0i7SZk=wK&h)hH^*p-f)Swpuv^?W4Xau{mmssiUEQNyL4P=$p8T&vJKZcs1iOvrv zTh`X|YXTXOjSwMt;!FO9mZ;dG-d$%C&3!LnP94p3lU3_X0LS=rNX|zpo*JxBnc#=ZWMG z^$guc;Ce+f2s>imCe(^3>dBrJ^O>5MuPXDKVu^Url9Ioq39Hjq`S1!Nmj@qajA5KX z&KC*r#^|R7G8d#6tm>ux!yQOoL9lY6E3-?X2}7aJr|FlckytV0(Y_2Yn$y9%vexFl z6N5HT_G&W`)1L`2kmlF6OyUrzK_dTV@De(af$rRp6-~#VT3uGanQ(C1;vuIH^!bwn zKC7!LgS=7*a=zvF?Ir266n@b0Yfz{zI}RUU-^vg42Qf`b>=_z^g+Fl#NS&{uogV5o zrF$4Xkre1=^WCHe`?s)w8|*>nf=KwWPEI#~HUKa&2-}dyRkeO5bwCpI@35aZJIsdZ zH1$UgJ9s9atY8?=QC1v8172N_5mUSsxQ#oOy67hB?`RRK@%DYhefw+k!>M7bD=Ch; ze%PD|C&PDn0BL#5<2Ns;69q=%n%|s7km&$SbHWE%)FKZErBw73 zmqhipkz=G}J@e#qQE(Asz9kB93ujU&yJ6pooN&;Wx+N+TOk?)nu-FxOCg6WQsp?%J zJK0XOQn4D!^~}Fx&kLR>v6f=~wfAtf@ch7(gW#Wud~(T> zse;PQoSm|u4?k?4y9v23R8;RL!G*>yY2{; z9*cAH8RMENxxq|MXL**;^o`+CWW0#zC^3UT9n9Gy|5@!xi^Vmbf-e{rALfA&ezv8_ zee2M0h^cNsg+CxTj%gtu7slqBmJ68klJ>*yndlL`xVA#6Bk1Jpe#1Ie@ z9O-yQ{Y_^Eo(vw+=$8J<-&*Ve>2H=w&>86JhuE&3X=SuRbB?xiSO=!N6DND6_aaqk zf_%Hp!Z{CC9c0FONS*i?l5e6dd>;BHmcjU{CipN52RfthbQL@|QZVMvxG0;%HP7m- zDk1RYwn7+jJr%25?`;sH^4vZ(-7yzlJ!T?NK+&RRHfnzo)diP;&>(UD4b^7lN7K7F z!rfS8h7X?OoEM+(yP=V);=%vg(PmeDYBfx#Pwgj%cKEME8l7KuOIIxFLhB3iTI4v= zssvaqEM&QOfe1@7D5>hJj7{rVP|^?>8dc?)!$K-w;A4Rv8%%Z%1lr|QD9j_DP%a&` zRW4@}MRIQ6T`vrI2@$W&mggFpF4kfJgz27m|CdO_I?{AxG zg4o$r`O4V#Ch>TlV^r75mRW5%%5L_Ta*=n zg8Ndg74Yi_Sqj#6Xw!|_wieL^^_@_0vY^<|KJ!H)MwYeR}zIYPT z@M@NtA^~1AX{{r|v^@!vb@A88(Z@4)*?=Gh4eljNDq?uy~R2hf={ z^3jY3yhholDi^*5iz385^Rl`ZYp)d&E;ZSgJJ;4cc}1|*-yr_vjEZ=v z8{-%NJ9rCgUiO1ul*n8E1;ae97_G;x=8wD#_2TQgjrZSCMiNHoatouKn;QK9e8KS* zbd;m1E=?Uo7$~B2h*lZSwlu{t#HmPsH-^hXnN@D1&g!X`kSv30i4izb_6H=x+b12A z#bN_cvv+9nWtYG;mS~%I*>k2#k{M6!Z#Zk>b5lNEcaqnc0Ukl7P5wj;O`oj|@Zksj zson0PaX1s{n`B6}7Ax!)QD`ge;1Qk{54s2*;>7xJBtKDptDN`D6(pILS`8~2erd`v z3>}O@CFTI>4sCI{$+y%o2V3-1YDKy@P>TNkX$e@3GP(AL>}w%+Fba;5bEjBl^M%;v zasVjL=n2H@l*1&DbcXYD*9tBjf=!4TtGs-SQ^z1T@|~Rkj_~ekt65W6%go*~mh`*O zx~&frp|67tq4W&p;8bh|3GF9i)rGaQ1qfTe{bYImQ_lvRu=1-RdQb*%$MNo+Fyw;y zYF>zovdz_!$=)N-@$u5vZjyE+9Lcr_nh+-eC`kq~W2p#4s^xYi1I%LhTY=dWw|OFi zyljgZ1QbtBG@z@Q&Mc9*CShR$+@?dwxN1T8v>hz-s<&8psyk2$ri*(pk4YtXG~hRM zu%kEwS!iAH#iakOIe8jYIq}a;;&V`Lm92;rM=f!C4F>`^1VVpACNdGi_F{c#K7YK| z>yY=zQqsF7S&T^3594gKZ!{gbzd6~oCh1_RY}CDkr%*>N}=;14xH;0L+6A?cb>RSFhU-u5xsCsUnj(f}EMUhUy>&QOCUVypFs z{I~;litUT-phI!6haq8M%yb$Ym@D7??N4Ttu9Tr_UHg3xI&b6XlOzo&_HMqHxb|)q z?A}H50P?of@TJr53JGY^zO(|;`MEstc@zcv-znCe{j%G^4Mi?~C0;?VizU7ML)G|!jEmOR*SE91Zd6Wy+D`8~$Fo8*Qds~kVGgN&gD zJY@KIHlw~SQsZ+bIOcfaI_DzfEUSl~Nx4%z5ZDn!H-o-Q*Uh$i^vzWbwmr(1#bbbm zx7A6)Qz95q$+~Gh|B*tR_X2WMo~|Gu6CFWd#KW{Oo+x$MRHe$4CK6`+OL)K)Ew zY8tW1@dJAFfC^zwSjoq-=Zw|2l+cyU5YfTGIoNoskVwIPAtak50?N40IVn@H5CV*~+z?F0}$rwhB_q#?Bp7=)jtcycdHy>0dOZTJ*S%g2M&4E5|xT2N% z?S)?Kb~%tL(C+rUQfs0H1$wo{F_T3sFXj`<&CSf#A zsJJfCM>Na#ox76F&uy#**)R~GCjBvSe2ZurozxBy_?$J*CYX3yruFV~8at-1JxYP7 zqbhRx<#Yy;pHwJPvF;#}zhCWxMC20ifPz&_?nQrXPAyYq7>?8G$X!ok9m z>gFOTC>Nnqso9Mn$*>mn9Azz90r~LE#@wHmSb(hMNtgaMpi>@lBCxKH#aLD(LC^s4 z{UiKm*&s7}&CCe`WQ`>zeU&@MyB!=S6#^-ot?$3Uhpvaze7jjWH#%;rk$;A~>CdqQ zaTq`35gHml5GHf#3u)^O;WF%K`JH=Qpi!0a2|B@-8#a@vq0^v8FI$t(sy;MxJ-6@a zeManBLkL~l4P;};&WzyVw;`#bQcV)*@xg+xkAFVobfeqq$08`YxjKd>T&X-d46%g? zN_12hop^l%rwFot1kxSLimgeLEX7@rA2ANVRd-bMeVzuPZ(auwVXoL3(#74Yjva}e zk`7%fEF1k`?s{Q4ZWZ^?^0{-bhD4*(G4YIFO&;1H$O@#X#tLekTQ0rA3IvOXYW<7a zo#X6a_lPXwtiLp=jo^Fg-8f1js+=Njkt&ksa35`A+MiHA&hW`i>Dx&P6Y5Fxm*$lw zWCffmjb^Akd+xXDglnyQ&bLrrk)jN~eY0O9uY>KN;`On{O|~Cc)h?F?90cVENwD9i zB64j#wlNLQN4WyREXebwGtE{xDPV*EWwG9FdmC$cjTx5Jh4_XNWxlNkdLxXirqQTxE;TcOpZO(;anng#d2 zl%rXXS&HiJEX_>E@nbW?G`p2FX&6$n2I>n`cQE||;4o~nU=Z6vO|5+M1Lao1oFH?_z49xbRa^BicZnA;_~i^4 zX^=a{?%`s?tH0C+0(1=~2L1`L#6`j4=UkS0U&2q@A841WoIrbdX%nJj?Ygy9K~9&- z6%N*Xz$^NxXSFUyY-zYDSAY-J14Q|Gsj(E z5~er?uexJ5`-}6zEEAr2TFxjBPW7B3*Vd2CF*eeuehs7n^g6{CvTs{SLm@?3%3MI% z{soeL%aNoieP`KqCgJ#M*KMFJKLcdN_&^2Kj8d1A1a6>2M{anVgeaX#>o z`CLuU@ZhJT$TPKmxCN{j0cJ?a8eWy|Ad{ z0tD|Qs}x$tY!hFO16LiVur_OSOrHML&KD!Vw&?I%ndhq(Z~9${L$+UyEWpH-c7bm1 zmN-x9l3&>}Cg|7OGiJd$JL$JtFeLSZ)=*F_U0%YGa1=6dYLTu;7}ZQA)^mIyHl2@0 zF1*Fdx{0c<%qt3+V&_<-LSyvkn94OJX~;P(s_!^TE!qZn1&G3erT!z|J|;SQ+X{HU zewDv>B}80CR>^R=#k#q%sVEXwiCG~2wAJuCG?*G6t&&OVgW3i5C)Ut|03eU9@g@#U z`Y38d3zPMAy5j}qj_V{O0W+iG;^vFsLcbQ#8(o#$qESWT*3SHxdmT+|Ca z?7I%Z)Mf)2VU7TGqd59zH;R9*zP*rUUg2u&3Tb859gm}`Gw?UWCs4i8wM!;IbKZy^ zN_E;#{Mpc>w)9UInqCOAKeq+NXK^Su2yFk8M(94V?UCAzQa96aQ6+f(MvUj|** zP&(Om8U0a1^B_WA{Bk+-_PWF0!&-GYH}mQmGgVa)7`29;jq!RpT~Jtsq*MEkF8+ke z+jWwkRJp4O)4d8kp2ODcOG!01HY~IQziIyS@uUyQ`aflP%m-E)m_ga218RJ6$^iAF z>Pw>F=neHnWHu#c4beHPVP3i`>Bb}Q5O?FxUA zr#w5KCg6g1Gt>?+3aoXUI5j2WlvEYp!VV#4%CW{mL8${S?n`sy0T;SeR8lMw#J;g( zWO4{P^-DWB3xCE|^Bc>8wLLYyeM~+$)ecxfZpVi-p@@nr0SPL%K;hU=53CIGR=P)_h2{k|`)Hh<*z<Sn{+;TkmhFTN00viBYYbQ ziTv=$8SXq5Rr{x_`~Sk2v3fT~Rda-8mQ7<6M1&&@uQ`Ur6S+ z#+%qYu)cY2Af!F=y;^IvLhK2J>)iu+FIfss;GjybctArdboqZG!6>QgXP@qtA((1A zmLEW58Ng4eKBzgR!8;^@FSB|zBPFm0$o21pe@Ew+EpSz;?;YA*ExGP1smQL`rac3X zG3Rnylh*5}Ko_kHFJEX5cLRyfA_Cgx8&ccRMmj7l?gHjrc~`^?S=4}d#~u*Ba<^M8 zsn9W--jthZV*`SOekyiEmY>v5+%UeKEb5`1cMaubrM}GlHDyMtmEU09QCm8hUG&S) z6^huXF@|u#^jEKQ(ET~-4epND!Og<#=nBFIy*1-^VLYJ5Rd9CT&%)erIBMnW94RL1 zp%fN=2#n3{Ht9Vr)S&1XNEr4uSfxQLTgOt}X>0yB|S;le4YC(vt*jAiPE)K@F(ii}4_n9OkKpojKUU;7 zD2wEnhFPa8$qA+uwHqd>Q8_<*TA%|Z@zF`M?syqgg71Hk2&*al@R~1Vs3eqmnf^M1 z(#7}gZKK?cbDphq6|iH2Azw5r)xhfezv+L;G8{Km@^7ri+u=(x=fmpe;&y6#tvml( zpxa4jzQY=IMKSISz4sdh7cq8^!YT{cd>-B@@U(wLx0Lx`8ZANpC~hS9{gtdd&c&5sMza$j}+nl(*ixcl>7xype%CBSWwv z2sP}jZO2kj*`9zkRG^VLOCq;P4pu~7j)7x$+{%wk$f$=ZXR5F*4O2}(x0Ls1ZMTPdBt+Fi?<$J`jhx?-?0z#yU@J4C79K7ZfKMCV7Y0sROT7pC)M<6cRr z#wrHR55b(cK}kyl6H2Hk)_(9`B0FCqS1a`Yp3mpsTMdHMxxcluo8h`W?PRFNMgmvw zkVU+j^KL+dXD))W+cv%O4&Ktog8D4=OnVbV&K8k3fCvuIRa-fKgKqro8wuFQm{z6} z(_2r#{ccdIu5omged(HW&zUrc_~|C~+Z?>}`-DT_5^>Df9y{a?|S7JEWNglB38T#2A#9}zV2t@H4U=H4qDnW^VXv+ej~Mwk~B;Us^L*tKPQ z+C8!7pIxvBL{1Kv>Ezk6PqIn9I4O4A+9evH75qxI2aLo$exKeYg00MlOr(5s(d%!# zhnF+3MSkz_b{4YF^qb(YF*!H|j2id)Q&AvC;Q%o}&c8e~s`PU@kb*fZkX z%DBNxKIljvqBjE-yhXv~2uU(Xl-zOd@SvYlBy%G8FrH$nNBn=Yb0|v56?z~s5vrzW zsIOrhXw6pmf6C$IRG-eJf3ph{y8tzMJH`#Xk!xJ^MOM}$Og*2^$-*}*vN?-Wg4AjA3j9J+x?hK0ylMYF0>xbPF^85 zK+3aR&G!=5mcitsFTsg(3oZ?<$6T5*>AcQPfaUU^Pp#@&O7Jy;ZPn-}s*^@lRz5}! z<^=GT8C}x`@?s5E+);Gr4L>|lpebgD>wdpnGgq~G=?<@nfVC6?>l7Rvm<3zBnD|;U z;i8L3m~9L>_nK#_1sNjWFK{$A57fgT_g|yS`d4zn@P>kpYhu(ZahS`|q#@scLQV5o zg{fzs>mf$J+CQF!aDQm7yYI0P#U0L=fW>{Zq>O1Bbt;OJ`pMVUb4#w+@z6aKW^KFPbV{vbW>-Wimxrc=IA64)>MGrOjm{BWY@vs> z4SGREcyu?Qg(@`!E5^3$E{FujWty%L-X-sKFJht_?X?}+*7^iG}x6~4r_faydZ z!gkCipS=PD4TtT#Yva%ON)2b&Mr;1PY75_b0^P`w-b&ETaocvqXFpyX91?WA-OI=% z?!_EaBGu>7J-y;k3RVCn?K`>3+uoi!{e~}bbc_&M{?VFHC5`jS_s^6$TAn@lSh!lc z4ANhTYhOXZ#G6hmUPb!hptV-s0#lVm%$^r@zve%XuHuU$I2~N`PxiagXwz0X#n9B|dRCb3TW zJv76!blr9!1&(nw+UK@vpO#qJP4#aZ4~2g^AlXr$0jE1;3kVRKIVxTL5p7GGF67uz z1_{fB4&2BFMhf|bbW5$CU@=558WB48w>UE=&a%Abp;B}7R$dT3HFTjN4>q*cE10BC zMpY1E6d}`uHHloikEir#qdB8aV_(c17|9Yi$#f6CI2(#Y_|E*yJMEwUFIBkHTyoS8 zQQrX4+-$t;XJr8K=AEiA;Bj5VBsRY5nhH#%Mqpzi<7jRYqdy9N?h&ZB5Rq7pA|2@vp67&c_vhAI3Gq(IE! z+=+O}=(mB=O`L@Bv4rOTUMaRrO+FFwr~rIfK?wcxOy;5dfX&0gNPD5f;8dJMGkG&SxQ8boLUQDXNqa|09waO#a6 z4r_I}(&)L*3*-@)W6{D!oXv7zH(yoj^(ur~ht0-Idy5BF6|T5lF`-pOH%Lh?U<69~ zH!*yZAy_>S>Q{w3Y6gA2)H)IWYBdPtH-5qkCnr##f9|O%SoBM_Sg^a6Hj#3U#YU4> zByvTq$^CrD4FTW#4|H24)DMbz4Iwq5c@I<`K$B3pmn##9o(_EVR(ik$)K2VbD4uQ< zHf0MA$i;H7A}`Nrq6In;o8wSH4X*~M!?&HK8PaKhm`AI<=dORfY4nTw3xRq=k1WZy zQ)4j=?$oV#1@=zCd0~XB+G%RG^2loKzYkLu)ufkf^G%MGO@X3tJjoWKBiO}tCifNyEUl`2f6Ye)64 zBA4)$?5_b6|6K!*4`6~PO$)TTpmfHFq%uY)yWHEW1@0?u<=4n-SzsA8sTX zLqpJkgVXl_X-5=%dj7-I5~Ul89XF6{Hy;-(Jwoj}5-p0Bpr6~iB3*Pb^f3NoS2)1T z`ryKdrai;PRHm4kmMh69LQ9>7-dHwzg>qL2G zxF7Kr_@{ktJ;EZH6g}~KE{L;2=1|ggB^9iLQTh3$5BPTMz97&dquv{`7FE{De5$&= zGlu*5=*d+G3Cpj=WXx)&r41og(W8Xu&2ch@(#Ii3xbB+W06-7||IFj73|dpE%Y;VI z0HK-AW!G5IP97|tok-J(Fzcxr6o;mIRN;~2v`iyHJ$`zKA18@*j(UN&A4%V3s7DYR z;w8au3qm7wLKtng*HfFL;daUpsaI7O^IO0MdnV*fryb4jgun1kMgA%i1?{Zj^eux` z2c8yC$T8J0m)%Z)(7}Qwvqw}s;3V7LV8-p$fRD8i6hh_DO#U*oK)t_cTc2uFT_;sM z_19WQOiEq8w$I6@3*;R?X2zYvCs$URL&17g6;9q?rnV5#c}{joR+-tXmnvAXH=c4& z;!0@bQGRd{^u3_n<(c*$=%V=b62;n&3Vi5puU=QO1uVp?tg<v=h2}Mwc z6_W=Yu3i}!$3+Mg8TgVYCH%}}4gb23oV%mxz%u1!r(t0)2mA!})6@naWp{)9SmL|J zeWQv=?wNzH8WhN;dRXqHQwHUmq-phTiSUKG|?GqzS_ACH^9=#Fm^0)4DDHw38gIduQs(NljG z6L}XWDs63dZLmvy3AFt_)msRV_D#`rJkQOPJ0AN|u_!C~ZERwE`ySZI;4M2ztUt5) zob#PX*KUiekwl+8S{N1{H2q)5e6}h?I|nP67MN#dU@7E_hE>g)z`Mjr7jT80`}GJ> zY@Lw*&<=jZO*E%OTwma_0JWKhgaV;c-Y!O(3=mto2=Ag*TS6EHTh8(X>-Y$nlQkI@ zYK!?}M-3u=Nt8t{$ZJs%FMr84(F@2^D0n~qJ_uz(snv?67IGu-Ss@JR>-CR;OqtJA zZg*0Y<2QyB+*EoX-Tsu>rtfy~&E?qr??IhZYqp19L4D zN#Ydya&P~D@=%;eS&_h7pO1NHB4C9V#)5p1kfejB{n^gC5j@%EDiUg3>htY%05TL# zIf6&rhllLj`}+SDmAqH3j=|gG7bHs8V_iDY#RN`~Iv-~EuLzDxx?<%|SF(J2uM!3< z)E0Z;)0cZc*<50G+f=I1ttCQO)$)EObu(M{VXBDAEF+@Y7`7PfmXIkhUfA-UXNs&{ z)-L6et@T&|H}k9%-fQ3>~4=ac!Y986Cg%m6i0)5V6s2tQug8@z6bj9Z2ss5fv6sHHW;tcof ztI5-eS&?B$v=#+#u>Tnkr#2NM)GaA1v&F544q3T{&HjQKb^&tZ<}2vF;(YD-SmY1nh)5iI$=k7^67?0M}0M(VJQHSL^;adGkS`0V!#7&9o> z3A$7^*))qOrSbDIGMkO%t*sYM+g9&cGC7sU0vpr)^vJSbu>|aHVxyy7%HogTjsAE} zo=wg*P<^HIh9fXZ|Hq)ot!5aDyYT1#bP!s$F?@0S&hly01}`$SC^R=_T#uGYLktpNo;XWX_7R{|(h@#U^`37wfM zWp@YHiq!u4OK{v+C@V5PaClBzCa#+hgr2$5fXYi>b+XA5{N||m^$^y>Rs0HMopb`xHh!I!|v`Q-*smAJ-dXY zkiYW0my&A{*gcbY({dl1LVwkM%tTQ_i!?XTasC@_ETyerZF=SCYIZ-e+~o=Q6;8Z= zB&wzFw1pA*!Q%*YXOu+P0Zk{dw6ZXi?6K+pv{opthZ3(fH79pXAR!Z zA*AS*@e-i90)q+Ivn_ zL9(}})Dhe|B_Q|{s`m|wr29-mD*(4!Z+1mnWEX$xqZ%{pk}s8uBw_0Gri}luY5zhS zLB)=pIuZlq$u{fdJq7QmPeB*$eGfyW_XsK0z2Mf72sG7; z+0Px%^CAM=hv-f6`hCPNE#~B(M!_14)LCnw_$!@qc0w|}FCa^VkJz))iliVs|bzhQ*0EI(1{_|A+w=o=L zw|Sqz6aU0>KKb$M7n+tXK}KID?5;Dq9`RlvWI@7+?=sa_>P??;|0F--=$Ct<5C$K6 z&F3*R`fb?;Ka3-9iTE|iLG>fHepqlYJ^Aj0;XFXMUq^j0y_zJ5z=E6W6#m{J_33K2 zw%QmnE3eo-wzLBDfaNZxT3E-Rsgjfq{D19{UGJJLlYqW{DNQOT+N(BY$wMj%AyJ0d zc~h!P4dx7`pi<6MZYkk>l+fM;q`4aeuBk3?sapT#-PIPIJ6Qu!=jyOT^N9C?DFgBE zi?QK=N_l(A&2jT^T}QJiW6JIj!1w`FW|2BO-%UaK0I84-$pe~kv3qfuv)*U6^A$HT zl}pqJ`{jkbqfijz`ipq>)bfZ@FA|9)zW7&`tlWC4%%c2pNE>wLa}G_vKB*CLgR-*%K+e@IaFd7$pTi8NBoh79F}{fx~hR(ukLyuABh z6&H4k+*gH_4Ub=1&+=*;)9xel9In|e!^=gWAq`Vbc#$DGV#=fi312VYYX@0s_M)%6 zc(f=|8$>8M?~JsLLpbT>?Xc^obgiIqB=&qT&e@)siiALWrw4-t_|pwAFTV{v3q@>T~Kw&l6S+9DwP-e74MJeM}K=3NSa2tgs6B9~(=B0M-q%!9e z@dmlrj8ArAk|EwRP@;8z#P~G1N`?y%rY9E5tK%R%2qT?_$o9R}gwp=(P{ zXBtV&|I+u4AcSt!sVr3j)@%W}-D0@;_fW58DhR*i{RKKeh8X?PVbAl#PWFVuJI+#% zfCfd%H4!9$*XB1>(mG`)mMm&K-BagSZHHNt%u{Z`*6#wN6x_RbV!hbljdRt$DECQf zn)o+A^|D<}P!HzJ2rUguZq)xH*^ zcXtIAnp*;W8x4Nk?XENtevnr|8wr2k>U$SCGk+rMjz`_fNdD9ieg638PV@!T{htxAnq!3u$fkMANsMbT34XpdU(%qYC(@>+ck>gF;f z!aM4X3_khBuIRA>u;8@WV2;}Ul9!ory)%bQ_yFV-FWIt~sqnV#3I}HFN_Kn}Rp}^k zoReh%q>B(dqWIj`*=uE6^jgjoCUvZOXrwEHW&h9G;F{}Z+C2t7J&W}$L1yRpp2AjO z$~*}2=hY+P^ONOUX*1E~E+z^nl!LD`F@rC%!Ff6;rlbjpP@4XZSw`#9jh?EM4f-(L zSc^A&Kb9T00{v^pi&T_!K|?>Uei(L%FZx$l5IW*|%~3xFq28LXud|g@%5Ykx3ls@_ zI!td!1LFubi>L?sQ1)2A_F#qIzU>1~bm@+N)bHfTtK|1)ilJ)0O}5T^bcU?iGKtIq z>PbheB2Cdpqvc4zPYx>SYIQHftiBC@lS8Z7JE|f0?(79%4fQ}95}(8o=N&x?YNG$v3G2LQa$=_Kib$hEG_4T3Y%b{ z?B%UKF9G`&sp;?TMqe`Mo)%hOPo)AxKpr-Vprau}vGf9D!3~qKB`RmdK?zVGIQ|b;P<@mGLc1n~lp8}OtM&!2s^u{lV^&fjQI>ndjD zF_KF*_vP=K%LUYJgl|;M%KNO@P>6|*t6-H(chN1~%giEXDbIqe2_<-CZmOjIL=0E)y}WoK5$d z*)g-7^(&kso8(U>9XvUrrDlfZc4B$_aAU;H0VlI=Cqq8$Zn9!`gMJeZb}w_b==PCa z#1J|Ip7pV+qUra1z9zk_A2new3AFqH#E_&CgmY`v?5wm^5R@G;I4?Uvk!tZ^6Y0D2 z4j;z?pjks{5T^TbP@0D-&f&vop9Wle|4+sfsN;z%%vB72ld^0t>gHBnugxheOL*li z_Ag9}s`k{R!Jnk}r`=4DwgXN3S=IErNT+$opT7qLO2J1%{Ti><<;q28IhK_6bb^7_ z?!9W-jN6&GU*xHAk;m3-<`RhClsRDiqoOLT>6#Q2bbw-I-P=Yg;)cifzJ}I zZRXV##<2aOUk{i>aA%ChnVX(FBqdEa$*7@9N%B?MGiDdxcZQ#jdbZ2 z6?fuXd#P3dC;8uOw{fb;hgc_*;N3Mh`e_AthN}+`MY}&Xm>_<(#)Q1w9(HSYMyamc z(Pv^qK2Z!Lrcr#RTEzIg1>GNA3UeH}K%`3KDqjeGwXE9h)Qx``er5h>!clt;>%L~x zj)PjAWQ+?q{xujH&HC^S6qM=}=Yt#CpI#$U7T3b3X|MyyEzq;M zw&?YpAZ_ioIQ{JyZ6QHKk$K$!_o91yNHL#!dNCrD>_7O+ez)x z>XH;9vkuXm-LP@fM94B#O+axNMV(;L9DUuGpIVF%*sn@!Zplu{zeY7#A&zn_Q zk_fpidS)5QZ4r;%F)j^jhYr)-!l1BS#Seo}u5Qb4LP>tIk*=pIi0jV;ouK;i?)5!> z_Eq62lNjGrG6#~#EDwVnuy=0N2SmTw{6l5OE*ck>P$a}SWt>QoD2jmN!^13!R)D-p zQ8nCVzH@&*(q=P((k2Dy0<1(^6v?#3ErLqEiPoG~1i=6j)|LQ9z>Mb}JO6_S|8ysA zJR$FvRfS)}1W;ViFh}=;MNJ^V0x}2onTk!9OK7GoVNDMQu7Nhf)IPdRQ-D+KTp4 z7|53{JTl=j%F`ZTVfC^n z&o{b&=f6alW3W%gO>CYRK=HWDvq`+TWi<4O%zuSv%jhWj40wPnBJT}Py zzzd3LPNn0L=w7mV+I-6SvAkVQjtEAzPcq$307f#3mFt`-TgZ+m+IVUt0e_K-(T)_a zp9Ujj7HJE=Gt~ta>0W)^f0F8`tAJ>EF+mEJPZOY97|x}7sT^G@>DqQ1WSJ0QYi2dD zplS2~66rz`AV+MXe_pRR)9RhC#M3YW!=MG?n1T2^6nmq0&=ig1&EA51W_-kZd?zj= zGV>>46@*0G=2ik<`kWe z-KbP18WI@6GIb!`u?6X#|9_q~V}%cenEFqA7}#_ZDoX7uqu6&U$X2jR;@1*bo)=HS zH6+Okt3ewo=(ux)H>V`H2nnK7FU2b+Js5?2grXwW7cD5}$$}EW0JjuhFCObmZ zoUj#W^n`XN6Jd#9jj38W`*VW*X$Xtv+)h*&SIDKLs_&s^6+?J)ppV{ul!945TxL&9SV-?Y+@SZ=`jv@)ZO z!r)kE=j8|{0%(}n_h4G^9K+lXT?g1+IdqGr5(4_R{ZMmA_v9B~_gk;)ve=xh_v-ux z2Rf_F+xJgN5Ec;DGc0u>1vVL`040Gliqy-qM&H;{4$7}j)^mOwH2v>gE+b5+u)gv- zR&$b%9)>Izr?c19O_WgH@?oJQq7|kmfYU#NksOCOSOz!z-oRxO_)VXSJgiH8pmhod z^mzhQKb{L|gqVIf|HRq1QxldMGZ_l-y5A>^dVI7gr4qMscv15M&T6Yp*1%`Q)GR`4 zk?@Ie5Z1Sft$KDW*3PVGPAQvRt$eMzV^L1o;PETR5z#rfWlt$595HA z1~XIXpx-i&$2l}x>YW%(L(n0avRn__iCdm-b#t>_8ubQY;3@?G6)*o|K_Kz(fE8Y< z%G+Em#B%o-=f7^~XiVGE9#b2{Y6pBR^{s~0T=p~5>2t;h%iYH($pRs=7JZ=bD^iqk zg}kiXG`cca7Lff(w38l!fwT4&-D=xum_n-dd(tBZmyh{4z6V9cV`7R*(kvo}*(RACs$7Bk$#Drs9yFMi|ty+b!wVYLqF;KYT3-;3`wB z5VHAfchsM8F^8>blVGk?d$qW?0I#tAIy8Cog)B;6HrK1{NSg&Y0wE6hjk?f4k6kUT zVbHamRl%f(%<_jyVym{^-%^(?MI(^CP%dnS+LD^nmW-@fm*?_6O=KnKD$Vy^6n$6X zOVQHv3`{+2EUoQMHsY31<44FUlfY1!Ik12c-AbB=WCV*sF4*u+a>=AVwcWZy3%d6Rzv4N4w_Nce!qN7u< zFo(?X`+q7ET{^)YOK9WsHP`5DTQWrX zSHd?$rgjwuWh?p0(Oyyd<3k8vzsSHkZ#w}7niB6ue7*jdz3=vaBg_)O=lm&&2OXN4 zCz&EPXAvfncZ0%+f$NG|F3%p^5?wBgKStah2;3>%+}hN2FY}@5ebX9j)pvpvlhbGL zQ{M~@YEcVisS+2F^S=6@A%I$ZUb&B8ba`rE6_}MCV4tn+aSTx#I-%ph6s%XI%({&kzx*(38>@=s9Vf7@(Dpv;wJpWbH2E%cY(ZD3QB$mBT)>xNg$4khP#*=bpN9C2_0iY`r##A7B4rgf#)FCVhpEqXsGU*rDco?RyY1XX$$6)?oE;=?Yk z<$%vN^Ljx?U`XU$&ybcAyH*V8{_f$7QdMFuj>IeDc~KyoloiriPDn=&;gM6MWoeUZ zvi`!O>%7Se75B=WC1k^ZyW7P>gVZxq3v79J^|EWxLojmlf{teCJmaH!EB=Z-`avfB zl7vwYCKL_LRcy9UxIxf<5-8as<0}y60p^nb-H$$~>>6%`qi1N1c;6u@izpr=dD(0K zjws@v7{4b8?TPZZ$Kdn%0SlVw-HZbQlMtZ>+lo@VHfz>fy`t*|42|s-LcF621o<2e@AvuO6vr zgG}2{x<$ZD4k}pZuLY!cASI((0Uor&K9->qMEn&p=75O^#G$@yhr^uyjRLgp`GlDY zO_P4$rkPs$nz^zK?%0_s+2ALbvXJySx*aVT?Y@0E`#Xnl)Vwr@H3xV%4N@RDuH=Ws z;8t5hX;dqvg0%oT?)Z9ezl^vG?X9NkC>GboU;}q8DCfYdx3*v$%+?ZAkuiDwvNscW zbZ>s*+g{Ki+1DTq(yQa<4a^!zHH7y;E107Ne%|0XBR#s5Pe+@h8oJH0g6(_ zeE8-WNwbbl6SD;c@ha}JD^Wz)S_z@H7x{!SSyVUq`Y(#u~y#wfhsp-98(K~r>Cz)X_*y4FyD2RQRYA=N9b2a1ghwgJ-KZx!ih0%1E#oJ~#Q3r~_V?R6>%9IQ zSmhDkFiSd zriZrcr)JWki>2+lFXcc=MK)JsHmql4#sr@gjH3_yzRCwf6Elvn8W)7}6H9ofRmFZK zzw}YAjDF1+S+;;@WSjC)26pOljtz%$P8#+e)rPImN?1&oezF9>4j?7O+!QXS_l`V(Y-K7xGQ;|jG>)(VURHVr#`jB(-x3@C( zwtM!JL_6OppaI@7jw|5ZceFZCrR2fzPbA=psJ+TM`MF2^n>8GaX#!Cc`*FaiOb=$L zH?z|+I1_=r4j5Ltp(*Hsxx{w_b~N?{r!gQ5eKQx7W%goG9YANt_H&_AhC|vK<@&5t z>8pOb=fAaud2amEMk_m99w;FW z+nL}DX%O)OCKg&*mruM2_h-aJ`s&o#V1hR64rBP}-|iV5+(F>gJJWqC$i7j=2G$MXd!4&{XPr*~nvHfipnC9(1!=U)AL(R^(in0tnKv=$DDqy2|I` z`+jjO%C5ymeM4rXD*g$FruvNQ4|#s#>;?9-H^qOMUHb?uQ+tlwk|?j?BQCe|U2pVw zX@hb$b<_@>;=f(NmpYy3abNQk=>H+Db!;%Vgv}%&OzW)nb^&5)2mBUVeB2AVRegM( zfQ${PR!yW>si`g3m_1ZDjUNK+5;}5SUM_c~i>~=Gx`Id{lH%EF=ob4&8zUT~$vHsY zsn`g*-UXcH|J^e=P2g1@7%WrDap}2)kN8Ft$JJuH-JVCdF7`R_G8S&0$zf7t{sqt7 zu{(i)s_F6YC^z(Z83uVbW=YzM`V23cQNSvGaRw3d&k;N)>LS1X0t-F2nj*0qa->=m zGsv6{Zd`v~sJva|x0@!^~>lL2B8r=ogFSsgzL*0&9mpf`a8Cf?3+x-s_R7eoiVD zJRTw!r*3mg2iVS+tIbur%94;sCb%!nvJiGZ+``*o{>2FUmEyZJ$eZHJRC)Y+zzv6^ z`gHGY_?$qd$XzeLL)KKUVHdu(F#AFCAYgsBdnCb_I82v7ZEAG2kOBi`dLp;O z4;zW%h2jpZtfrXp0&jk=*k)<)v@qp5EV+Y01z=;3LQzN4f0Syjmx8A_4p2$rdF@Y; z^3%|yL>0A0E+n#(G;X!TgRoJpqcXbcM>jbe3v-~`Ee2O&Z*eQC;EH<>Qk9Px^kl0W zMNYq?&}&vf;mJ)$PdW-wes|?3rS->|^ z*@27sLFqyG+6UjK9t9=~4I0jzRh%XGnp-5Mf|Wx-tIvt3wTTR*@a4c9Oan-D=9%Nu zvc)71LYN0*)UL#5?WpkaR-izmvq*UxGy+*G=(W*n1PyMdoPE=?Ms*~;64~KAwTr{V z`zKNbhr|)Aw04fq-rRIl5a-YUYJwK`-44Zj4EqwoZQaCZk0w(`kF#<7+H2;_#I$DnDmGz2=*gi!Ax+F>t+fkpMMY&6NQY; zE;I`?J%;Y3GshOU4_Op7q3hdGGuwVfp-!S?)O($0-(Sf2gW-%#XnB_e^EeuD1vIi` z9i<_Mmn%4Ux2ad`@0hsOwy|wp7z6z*Sy9g_mS$Im%OXRtkRO-Kc1@rq;e>8ZN>%*N zLJsWXqS|7gyM7_)5`2X!dKHjjPJ@fa?=UPG}PyVUXjmUhS$z??lu zGR!_m2*jonH$I)mBm5Ffz*kr3Ni}IcOyqGC-bwe+DOe2Kb{huf=kdX~dC8N@uz8ir zO(=oqF-d%DvSvni{1{;d3)vFSMrc}CV`^9j-rIuIJM#hZ{NNUc27>&drA zKZ{U!1v8uBt5QhM_h?^4sc~UpTCCYg>o2I#S}9`Ted4ZN0GZcU^B$fyJ#|N>2~oU> zMY_B;5K-~JPT!Go7DTA=msx|sSu--sCrX>CrfD(zz-HF^Ea!7<(>vDXd3vR7m0cyn zS{MowK@Y4QgniFouGUa5pF6Fvc&*;rb>Mjnz}{pUgDwxXx|AJ6cl{-oR%`)s(%{h! z0j6vza3I=mcMaVmXdsbSUDehE{mb9vQDxs_CR7UI9ydT&X{ob~RC%z7FXFonM?c41 zpPJMgHt{dT)PzJUrM&kDSK3^r(B$GOGlp3HLFU80g1@MWYWXV&xDhl;yt+Kqvp9}d znix1^E^F7gk;HElngoy8!v98PcDF2qv3lbdSYg!GR$m5Hmlkc-Q^Fqo?Q`G?yg+*3 z-r%G19aSV&^tAR3wY5-;%BODSPK1gEkCYTOQKyr^6B^&-Z)|SNo6(J0IzJ_cNx~y~ zS-S|L3cp>H1i1Llg7+aG$R9U@OLRjla#viwLF#7nK>b6ezA*qorpfN1Eb4?HG~nWQ zT8e3B&VW&7X*~6>fjr{)fKWs~(Sk*|Q34QSG<k@KG0AWMPFXWJSiO2!@i;<)WeVatV_c3(CJzeOK_cpDp0C-3?f9R?W z=bFQO1_ewUPtov|*kkc^{WJMJBSAC|O$eOkYTsoUe!E@{gUXqn9j)7zAt*CWg^K)2 z(Ty7GAmw|;=e$aFzX8^ZG}5_r>k@9lJoG!T1dz>L!Qy6|whmOrN=z9ib6V&>M8%Vb zY}D$na!xL{hwK*^Pq^|8CBeGgPOX=V>?ED^beE<>`eGIRL$h$Xe%kboB*Cr&->Yyc zO&-=;mHit~Prf1u2%RlgF!!SU5E~vn_1V&{`qptPoUYNoGhN`0fqDOd%p0`8Z=#P> zL{Bwu=GL*%&#mRU$Wkp?H;lzy1iK6GSk^V@Ly~fS4ciJtpbGPuvH>KT~Dli zlbHxhCnH(N=WK?p;mHrwh3L5o)3@Yrv zkAv`83iu-xWBvZ@Q(;)CUPR`U+eg?pqK!o;4&;CcKQ$Hj`z!S9IKf-mlzo+8QjobS@bAnV9_z(u%N|V1um=Z;C zzt;*|&^*`B@NX627HeH`hU7EYoQHg|oBTfufY^)|2`p~I$mRS*4SWBCQR_0bP@nl1 z>6{M0s4g~m?!wrj�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 YsKucDTR*UVFL5>3j; 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 EF^?_;R{#J2 literal 114384 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 YzL6%1ni#KQq68%R^WF2=>-cUHPzhnK=Kufz diff --git a/worlds/wargroove/docs/en_Wargroove.md b/worlds/wargroove/docs/en_Wargroove.md index 31fd8c8130..b8dcc7aca8 100644 --- a/worlds/wargroove/docs/en_Wargroove.md +++ b/worlds/wargroove/docs/en_Wargroove.md @@ -1,4 +1,4 @@ -# Wargroove (Steam, Windows) +# Wargroove (Steam, Windows, Linux) ## Where is the options page? @@ -39,3 +39,5 @@ The following commands are only available when using the WargrooveClient to play - `/resync` Manually trigger a resync. - `/commander` Set the current commander to the given commander. +- `/deathlink` Toggle deathlink between On and Off. +- `/sacrifice_summon` Toggle sacrificing and summoning units between On and Off. diff --git a/worlds/wargroove/docs/wargroove_en.md b/worlds/wargroove/docs/wargroove_en.md index 9c2645178a..e4a6b0e393 100644 --- a/worlds/wargroove/docs/wargroove_en.md +++ b/worlds/wargroove/docs/wargroove_en.md @@ -2,8 +2,8 @@ ## Required Files -- Wargroove with the Double Trouble DLC installed through Steam on Windows - - Only the Steam Windows version is supported. MAC, Switch, Xbox, and Playstation are not supported. +- Wargroove with the Double Trouble DLC installed through Steam on Windows and Linux + - Only the Steam versions on Windows and Linux are supported. MAC, Switch, Xbox, and Playstation are not supported. - [The most recent Archipelago release](https://github.com/ArchipelagoMW/Archipelago/releases) ## Backup playerProgress files @@ -23,6 +23,16 @@ is strongly recommended in case they become corrupted. - You may have to replace all single \\ with \\\\. 4. Start the Wargroove client. +## Linux Only: Select AppData equivalent when starting the client +1. Shut down Wargroove if it is open. +2. Start the ArchipelagoWargrooveClient from the Archipelago installation. +3. A file select dialogue will appear, claiming it cannot detect a path to the AppData folder. +4. Navigate to your Steam install directory and select . +`/steamapps/compatdata/607050/pfx/drive_c/users/steamuser/AppData/Roaming` as the save directory. +5. Using a default Steam install path, the full AppData path is +`~/.steam/steam/steamapps/compatdata/607050/pfx/drive_c/users/steamuser/AppData/Roaming`. +6. The client should start. + ## Installing the Archipelago Wargroove Mod and Campaign files 1. Shut down Wargroove if it is open. From 3b8450036abf1861cf20129978e291f0e2baf9a3 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 21 May 2025 23:22:55 +0000 Subject: [PATCH 159/199] core: don't reconfigure stdout if it's fake (#5020) --- Utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utils.py b/Utils.py index f4752448e2..b38809ba1b 100644 --- a/Utils.py +++ b/Utils.py @@ -540,7 +540,8 @@ def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, if add_timestamp: stream_handler.setFormatter(formatter) root_logger.addHandler(stream_handler) - sys.stdout.reconfigure(encoding="utf-8", errors="replace") + if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8", errors="replace") # Relay unhandled exceptions to logger. if not getattr(sys.excepthook, "_wrapped", False): # skip if already modified From 7079c17a0f761935b464e4949b0f08aab2535e00 Mon Sep 17 00:00:00 2001 From: Fly Hyping Date: Thu, 22 May 2025 03:11:34 -0400 Subject: [PATCH 160/199] Wargroove: apworld doc fixes (#5023) --- worlds/wargroove/docs/wargroove_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/wargroove/docs/wargroove_en.md b/worlds/wargroove/docs/wargroove_en.md index e4a6b0e393..d23f58309b 100644 --- a/worlds/wargroove/docs/wargroove_en.md +++ b/worlds/wargroove/docs/wargroove_en.md @@ -25,7 +25,7 @@ is strongly recommended in case they become corrupted. ## Linux Only: Select AppData equivalent when starting the client 1. Shut down Wargroove if it is open. -2. Start the ArchipelagoWargrooveClient from the Archipelago installation. +2. Start the Archipelago Wargroove Client from the Archipelago Launcher. 3. A file select dialogue will appear, claiming it cannot detect a path to the AppData folder. 4. Navigate to your Steam install directory and select . `/steamapps/compatdata/607050/pfx/drive_c/users/steamuser/AppData/Roaming` as the save directory. @@ -36,7 +36,7 @@ is strongly recommended in case they become corrupted. ## Installing the Archipelago Wargroove Mod and Campaign files 1. Shut down Wargroove if it is open. -2. Start the ArchipelagoWargrooveClient.exe from the Archipelago installation. +2. Start the Archipelago Wargroove Client from the Archipelago Launcher. This should install the mod and campaign for you. 3. Start Wargroove. From e3219ba45253132b932c1bad93d9d567d85e91c6 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 22 May 2025 02:47:48 -0500 Subject: [PATCH 161/199] WebHost: allow APPlayerContainers from "custom" worlds to be displayed in rooms (#4981) Gives WebHost the ability to verify that a patch file is an APPlayerContainer (defined by #4331 as a APContainer containing the "player" field), and allowed it to display any patch file that it can verify is an APPlayerContainer. --- WebHostLib/__init__.py | 4 +--- WebHostLib/templates/hostGame.html | 4 +--- WebHostLib/templates/macros.html | 14 +------------- worlds/Files.py | 13 +++++++++++++ 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py index 9c713419c9..934cc2498d 100644 --- a/WebHostLib/__init__.py +++ b/WebHostLib/__init__.py @@ -80,10 +80,8 @@ def register(): """Import submodules, triggering their registering on flask routing. Note: initializes worlds subsystem.""" # has automatic patch integration - import worlds.AutoWorld import worlds.Files - app.jinja_env.filters['supports_apdeltapatch'] = lambda game_name: \ - game_name in worlds.Files.AutoPatchRegister.patch_types + app.jinja_env.filters['is_applayercontainer'] = worlds.Files.is_ap_player_container from WebHostLib.customserver import run_server_process # to trigger app routing picking up on it diff --git a/WebHostLib/templates/hostGame.html b/WebHostLib/templates/hostGame.html index 3840635153..d7d0a96331 100644 --- a/WebHostLib/templates/hostGame.html +++ b/WebHostLib/templates/hostGame.html @@ -17,9 +17,7 @@ This page allows you to host a game which was not generated by the website. For example, if you have generated a game on your own computer, you may upload the zip file created by the generator to host the game here. This will also provide a tracker, and the ability for your players to download - their patch files if the game is core-verified. For Custom Games, you can find the patch files in - the output .zip file you are uploading here. You need to manually distribute those patch files to - your players. + their patch files.

    In addition to the zip file created by the generator, you may upload a multidata file here as well.

    diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html index b95b8820a7..0416658dde 100644 --- a/WebHostLib/templates/macros.html +++ b/WebHostLib/templates/macros.html @@ -29,27 +29,15 @@ {% if patch.game == "Minecraft" %} Download APMC File... - {% elif patch.game == "Factorio" %} - - Download Factorio Mod... - {% elif patch.game == "Kingdom Hearts 2" %} - - Download Kingdom Hearts 2 Mod... - {% elif patch.game == "Ocarina of Time" %} - - Download APZ5 File... {% elif patch.game == "VVVVVV" and room.seed.slots|length == 1 %} Download APV6 File... {% elif patch.game == "Super Mario 64" and room.seed.slots|length == 1 %} Download APSM64EX File... - {% elif patch.game | supports_apdeltapatch %} + {% elif patch.game | is_applayercontainer(patch.data, patch.player_id) %} Download Patch File... - {% elif patch.game == "Final Fantasy Mystic Quest" %} - - Download APMQ File... {% else %} No file to download for this game. {% endif %} diff --git a/worlds/Files.py b/worlds/Files.py index e451d08cd9..447219bd19 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -6,6 +6,7 @@ import zipfile from enum import IntEnum import os import threading +from io import BytesIO from typing import ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO, overload, Sequence @@ -70,6 +71,18 @@ class AutoPatchExtensionRegister(abc.ABCMeta): container_version: int = 6 +def is_ap_player_container(game: str, data: bytes, player: int): + if not zipfile.is_zipfile(BytesIO(data)): + return False + with zipfile.ZipFile(BytesIO(data), mode='r') as zf: + if "archipelago.json" in zf.namelist(): + manifest = json.loads(zf.read("archipelago.json")) + if "game" in manifest and "player" in manifest: + if game == manifest["game"] and player == manifest["player"]: + return True + return False + + class InvalidDataError(Exception): """ Since games can override `read_contents` in APContainer, From b52310f641a07a579169ce0ce3b07e7f26f946cb Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 22 May 2025 08:12:28 -0500 Subject: [PATCH 162/199] Wargroove: Cleanup `script_name` Component in `LauncherComponents` (#5021) --- worlds/LauncherComponents.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index d587e65d33..b3e3d90060 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -232,8 +232,6 @@ components: List[Component] = [ Component('ChecksFinder Client', 'ChecksFinderClient'), # Starcraft 2 Component('Starcraft 2 Client', 'Starcraft2Client'), - # Wargroove - Component('Wargroove Client', 'WargrooveClient'), # Zillion Component('Zillion Client', 'ZillionClient', file_identifier=SuffixIdentifier('.apzl')), From e0918a7a89513fc13ad648b20c1cdf9a2502fd19 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Thu, 22 May 2025 09:24:50 -0400 Subject: [PATCH 163/199] TUNIC: Move some UT stuff out of init, put in UT poptracker integration support (#4967) --- worlds/tunic/__init__.py | 44 +---- worlds/tunic/ut_stuff.py | 383 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 393 insertions(+), 34 deletions(-) create mode 100644 worlds/tunic/ut_stuff.py diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index cdc8f05cb9..84f1338ad5 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -16,9 +16,10 @@ from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_op get_hexagons_in_pool, HexagonQuestAbilityUnlockType, EntranceLayout) from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table from .combat_logic import area_data, CombatState +from . import ut_stuff from worlds.AutoWorld import WebWorld, World from Options import PlandoConnection, OptionError, PerGameCommonOptions, Removed, Range -from settings import Group, Bool +from settings import Group, Bool, FilePath class TunicSettings(Group): @@ -27,9 +28,15 @@ class TunicSettings(Group): class LimitGrassRando(Bool): """Limits the impact of Grass Randomizer on the multiworld by disallowing local_fill percentages below 95.""" + + class UTPoptrackerPath(FilePath): + """Path to the user's TUNIC Poptracker Pack.""" + description = "TUNIC Poptracker Pack zip file" + required = False disable_local_spoiler: Union[DisableLocalSpoiler, bool] = False limit_grass_rando: Union[LimitGrassRando, bool] = True + ut_poptracker_path: Union[UTPoptrackerPath, str] = UTPoptrackerPath() class TunicWeb(WebWorld): @@ -113,6 +120,7 @@ class TunicWorld(World): using_ut: bool # so we can check if we're using UT only once passthrough: Dict[str, Any] ut_can_gen_without_yaml = True # class var that tells it to ignore the player yaml + tracker_world: ClassVar = ut_stuff.tracker_world def generate_early(self) -> None: try: @@ -168,39 +176,7 @@ class TunicWorld(World): f"They have Direction Pairs enabled and the connection " f"{cxn.entrance} --> {cxn.exit} does not abide by this option.") - # Universal tracker stuff, shouldn't do anything in standard gen - if hasattr(self.multiworld, "re_gen_passthrough"): - if "TUNIC" in self.multiworld.re_gen_passthrough: - self.using_ut = True - self.passthrough = self.multiworld.re_gen_passthrough["TUNIC"] - self.options.start_with_sword.value = self.passthrough["start_with_sword"] - self.options.keys_behind_bosses.value = self.passthrough["keys_behind_bosses"] - self.options.sword_progression.value = self.passthrough["sword_progression"] - self.options.ability_shuffling.value = self.passthrough["ability_shuffling"] - self.options.laurels_zips.value = self.passthrough["laurels_zips"] - self.options.ice_grappling.value = self.passthrough["ice_grappling"] - self.options.ladder_storage.value = self.passthrough["ladder_storage"] - self.options.ladder_storage_without_items = self.passthrough["ladder_storage_without_items"] - self.options.lanternless.value = self.passthrough["lanternless"] - self.options.maskless.value = self.passthrough["maskless"] - self.options.hexagon_quest.value = self.passthrough["hexagon_quest"] - self.options.hexagon_quest_ability_type.value = self.passthrough.get("hexagon_quest_ability_type", 0) - self.options.entrance_rando.value = self.passthrough["entrance_rando"] - self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] - self.options.entrance_layout.value = EntranceLayout.option_standard - if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].keys() - or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].values()): - self.options.entrance_layout.value = EntranceLayout.option_fixed_shop - self.options.decoupled = self.passthrough.get("decoupled", 0) - self.options.laurels_location.value = LaurelsLocation.option_anywhere - self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) - self.options.breakable_shuffle.value = self.passthrough.get("breakable_shuffle", 0) - self.options.laurels_location.value = self.options.laurels_location.option_anywhere - self.options.combat_logic.value = self.passthrough.get("combat_logic", 0) - else: - self.using_ut = False - else: - self.using_ut = False + ut_stuff.setup_options_from_slot_data(self) self.player_location_table = standard_location_name_to_id.copy() diff --git a/worlds/tunic/ut_stuff.py b/worlds/tunic/ut_stuff.py new file mode 100644 index 0000000000..8296452c73 --- /dev/null +++ b/worlds/tunic/ut_stuff.py @@ -0,0 +1,383 @@ +from typing import Any, TYPE_CHECKING + +from .options import EntranceLayout, LaurelsLocation + +if TYPE_CHECKING: + from . import TunicWorld + + +def setup_options_from_slot_data(world: "TunicWorld") -> None: + if hasattr(world.multiworld, "re_gen_passthrough"): + if "TUNIC" in world.multiworld.re_gen_passthrough: + world.using_ut = True + world.passthrough = world.multiworld.re_gen_passthrough["TUNIC"] + world.options.start_with_sword.value = world.passthrough["start_with_sword"] + world.options.keys_behind_bosses.value = world.passthrough["keys_behind_bosses"] + world.options.sword_progression.value = world.passthrough["sword_progression"] + world.options.ability_shuffling.value = world.passthrough["ability_shuffling"] + world.options.laurels_zips.value = world.passthrough["laurels_zips"] + world.options.ice_grappling.value = world.passthrough["ice_grappling"] + world.options.ladder_storage.value = world.passthrough["ladder_storage"] + world.options.ladder_storage_without_items = world.passthrough["ladder_storage_without_items"] + world.options.lanternless.value = world.passthrough["lanternless"] + world.options.maskless.value = world.passthrough["maskless"] + world.options.hexagon_quest.value = world.passthrough["hexagon_quest"] + world.options.hexagon_quest_ability_type.value = world.passthrough.get("hexagon_quest_ability_type", 0) + world.options.entrance_rando.value = world.passthrough["entrance_rando"] + world.options.shuffle_ladders.value = world.passthrough["shuffle_ladders"] + # world.options.shuffle_fuses.value = world.passthrough.get("shuffle_fuses", 0) + # world.options.shuffle_bells.value = world.passthrough.get("shuffle_bells", 0) + world.options.grass_randomizer.value = world.passthrough.get("grass_randomizer", 0) + world.options.breakable_shuffle.value = world.passthrough.get("breakable_shuffle", 0) + world.options.entrance_layout.value = EntranceLayout.option_standard + if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in world.passthrough["Entrance Rando"].keys() + or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in world.passthrough["Entrance Rando"].values()): + world.options.entrance_layout.value = EntranceLayout.option_fixed_shop + world.options.decoupled = world.passthrough.get("decoupled", 0) + world.options.laurels_location.value = LaurelsLocation.option_anywhere + world.options.combat_logic.value = world.passthrough.get("combat_logic", 0) + else: + world.using_ut = False + else: + world.using_ut = False + + +# for UT poptracker integration map tab switching +def map_page_index(data: Any) -> int: + mapping: dict[str, int] = { + "Beneath the Earth": 1, + "Beneath the Well": 2, + "The Cathedral": 3, + "Dark Tomb": 4, + "Eastern Vault": 5, + "Frog's Domain": 6, + "Swamp": 7, + "Overworld": 8, + "The Quarry": 9, + "Ruined Atoll": 10, + "West Gardens": 11, + "The Grand Library": 12, + "East Forest": 13, + "The Far Shore": 14, + "The Rooted Ziggurat": 15, + } + return mapping.get(data, 0) + + +# mapping of everything after the second to last slash and the location id +# lua used for the name: string.match(full_name, "[^/]*/[^/]*$") +poptracker_data: dict[str, int] = { + "[Powered Secret Room] Chest/Follow the Purple Energy Road": 509342400, + "[Entryway] Chest/Mind the Slorms": 509342401, + "[Third Room] Beneath Platform Chest/Run from the tentacles!": 509342402, + "[Third Room] Tentacle Chest/Water Sucks": 509342403, + "[Entryway] Obscured Behind Waterfall/You can just go in there": 509342404, + "[Save Room] Upper Floor Chest 1/Through the Power of Prayer": 509342405, + "[Save Room] Upper Floor Chest 2/Above the Fox Shrine": 509342406, + "[Second Room] Underwater Chest/Hidden Passage": 509342407, + "[Back Corridor] Right Secret/Hidden Path": 509342408, + "[Back Corridor] Left Secret/Behind the Slorms": 509342409, + "[Second Room] Obscured Behind Waterfall/Just go in there": 509342410, + "[Side Room] Chest By Pots/Just Climb up There": 509342411, + "[Side Room] Chest By Phrends/So Many Phrends!": 509342412, + "[Second Room] Page/Ruined Atoll Map": 509342413, + "[Passage To Dark Tomb] Page Pickup/Siege Engine": 509342414, + "[1F] Guarded By Lasers/Beside 3 Miasma Seekers": 509342415, + "[1F] Near Spikes/Mind the Miasma Seeker": 509342416, + "Birdcage Room/[2F] Bird Room": 509342417, + "[2F] Entryway Upper Walkway/Overlooking Miasma": 509342418, + "[1F] Library/By the Books": 509342419, + "[2F] Library/Behind the Ladder": 509342420, + "[2F] Guarded By Lasers/Before the big reveal...": 509342421, + "Birdcage Room/[2F] Bird Room Secret": 509342422, + "[1F] Library Secret/Pray to the Wallman": 509342423, + "Spike Maze Near Exit/Watch out!": 509342424, + "2nd Laser Room/Can you roll?": 509342425, + "1st Laser Room/Use a bomb?": 509342426, + "Spike Maze Upper Walkway/Just walk right!": 509342427, + "Skulls Chest/Move the Grave": 509342428, + "Spike Maze Near Stairs/In the Corner": 509342429, + "1st Laser Room Obscured/Follow the red laser of death": 509342430, + "Guardhouse 2 - Upper Floor/In the Mound": 509342431, + "Guardhouse 2 - Bottom Floor Secret/Hidden Hallway": 509342432, + "Guardhouse 1 Obscured/Upper Floor Obscured": 509342433, + "Guardhouse 1/Upper Floor": 509342434, + "Guardhouse 1 Ledge HC/Dancing Fox Spirit Holy Cross": 509342435, + "Golden Obelisk Holy Cross/Use the Holy Cross": 509342436, + "Ice Rod Grapple Chest/Freeze the Blob and ascend With Orb": 509342437, + "Above Save Point/Chest": 509342438, + "Above Save Point Obscured/Hidden Path": 509342439, + "Guardhouse 1 Ledge/From Guardhouse 1 Chest": 509342440, + "Near Save Point/Chest": 509342441, + "Ambushed by Spiders/Beneath Spider Chest": 509342442, + "Near Telescope/Up on the Wall": 509342443, + "Ambushed by Spiders/Spider Chest": 509342444, + "Lower Dash Chest/Dash Across": 509342445, + "Lower Grapple Chest/Grapple Across": 509342446, + "Bombable Wall/Follow the Flowers": 509342447, + "Page On Teleporter/Page": 509342448, + "Forest Belltower Save Point/Near Save Point": 509342449, + "Forest Belltower - After Guard Captain/Chest": 509342450, + "East Bell/Forest Belltower - Obscured Near Bell Top Floor": 509342451, + "Forest Belltower Obscured/Obscured Beneath Bell Bottom Floor": 509342452, + "Forest Belltower Page/Page Pickup": 509342453, + "Forest Grave Path - Holy Cross Code by Grave/Single Money Chest": 509342454, + "Forest Grave Path - Above Gate/Chest": 509342455, + "Forest Grave Path - Obscured Chest/Behind the Trees": 509342456, + "Forest Grave Path - Upper Walkway/From the top of the Guardhouse": 509342457, + "The Hero's Sword/Forest Grave Path - Sword Pickup": 509342458, + "The Hero's Sword/Hero's Grave - Tooth Relic": 509342459, + "Fortress Courtyard - From East Belltower/Crack in the Wall": 509342460, + "Fortress Leaf Piles - Secret Chest/Dusty": 509342461, + "Fortress Arena/Hexagon Red": 509342462, + "Fortress Arena/Siege Engine|Vault Key Pickup": 509342463, + "Fortress East Shortcut - Chest Near Slimes/Mind the Custodians": 509342464, + "[West Wing] Candles Holy Cross/Use the Holy Cross": 509342465, + "Westmost Upper Room/[West Wing] Dark Room Chest 1": 509342466, + "Westmost Upper Room/[West Wing] Dark Room Chest 2": 509342467, + "[East Wing] Bombable Wall/Bomb the Wall": 509342468, + "[West Wing] Page Pickup/He will never visit the Far Shore": 509342469, + "Fortress Grave Path - Upper Walkway/Go Around the East Wing": 509342470, + "Vault Hero's Grave/Fortress Grave Path - Chest Right of Grave": 509342471, + "Vault Hero's Grave/Fortress Grave Path - Obscured Chest Left of Grave": 509342472, + "Vault Hero's Grave/Hero's Grave - Flowers Relic": 509342473, + "Bridge/Chest": 509342474, + "Cell Chest 1/Drop the Shortcut Rope": 509342475, + "Obscured Behind Waterfall/Muffling Bell": 509342476, + "Back Room Chest/Lose the Lure or take 2 Damage": 509342477, + "Cell Chest 2/Mind the Custodian": 509342478, + "Near Vault/Already Stolen": 509342479, + "Slorm Room/Tobias was Trapped Here Once...": 509342480, + "Escape Chest/Don't Kick Fimbleton!": 509342481, + "Grapple Above Hot Tub/Look Up": 509342482, + "Above Vault/Obscured Doorway Ledge": 509342483, + "Main Room Top Floor/Mind the Adult Frog": 509342484, + "Main Room Bottom Floor/Altar Chest": 509342485, + "Side Room Secret Passage/Upper Right Corner": 509342486, + "Side Room Chest/Oh No! Our Frogs! They're Dead!": 509342487, + "Side Room Grapple Secret/Grapple on Over": 509342488, + "Magic Orb Pickup/Frult Meeting": 509342489, + "The Librarian/Hexagon Green": 509342490, + "Library Hall/Holy Cross Chest": 509342491, + "Library Lab Chest by Shrine 2/Chest": 509342492, + "Library Lab Chest by Shrine 1/Chest": 509342493, + "Library Lab Chest by Shrine 3/Chest": 509342494, + "Library Lab by Fuse/Behind Chalkboard": 509342495, + "Library Lab Page 3/Page": 509342496, + "Library Lab Page 1/Page": 509342497, + "Library Lab Page 2/Page": 509342498, + "Hero's Grave/Mushroom Relic": 509342499, + "Mountain Door/Lower Mountain - Page Before Door": 509342500, + "Changing Room/Normal Chest": 509342501, + "Fortress Courtyard - Chest Near Cave/Next to the Obelisk": 509342502, + "Fortress Courtyard - Near Fuse/Pray": 509342503, + "Fortress Courtyard - Below Walkway/Under the Stairs": 509342504, + "Fortress Courtyard - Page Near Cave/Heir-To-The-Heir": 509342505, + "West Furnace/Lantern Pickup": 509342506, + "Maze Cave/Maze Room Chest": 509342507, + "Inside the Old House/Normal Chest": 509342508, + "Inside the Old House/Shield Pickup": 509342509, + "[West] Obscured Behind Windmill/Behind the Trees": 509342510, + "[South] Beach Chest/Beside the Bridge": 509342511, + "[West] Obscured Near Well/Hidden by Trees": 509342512, + "[Central] Bombable Wall/Let the flowers guide you": 509342513, + "[Northwest] Chest Near Turret/Mind the Autobolt...": 509342514, + "[East] Chest Near Pots/Chest": 509342515, + "[Northwest] Chest Near Golden Obelisk/Underneath the Staff": 509342516, + "[Southwest] South Chest Near Guard/End of the Bridge": 509342517, + "[Southwest] West Beach Guarded By Turret/Chest": 509342518, + "[Southwest] Chest Guarded By Turret/Behind the Trees": 509342519, + "[Northwest] Shadowy Corner Chest/Dark Ramps Chest": 509342520, + "[Southwest] Obscured In Tunnel To Beach/Deep in the Wall": 509342521, + "[Southwest] Grapple Chest Over Walkway/Jeffry": 509342522, + "[Northwest] Chest Beneath Quarry Gate/Across the Bridge": 509342523, + "[Southeast] Chest Near Swamp/Under the Bridge": 509342524, + "[Southwest] From West Garden/Dash Across": 509342525, + "[East] Grapple Chest/Grapple Across": 509342526, + "[Southwest] West Beach Guarded By Turret 2/Get Across": 509342527, + "Sand Hook/[Southwest] Beach Chest Near Flowers": 509342528, + "[Southwest] Bombable Wall Near Fountain/Let the flowers guide you": 509342529, + "[West] Chest After Bell/Post-Dong!": 509342530, + "[Southwest] Tunnel Guarded By Turret/Below Jeffry": 509342531, + "[East] Between ladders near Ruined Passage/Chest": 509342532, + "[Northeast] Chest Above Patrol Cave/Behind Blue Rudelings": 509342533, + "[Southwest] Beach Chest Beneath Guard/Under Bridge": 509342534, + "[Central] Chest Across From Well/Across the Bridge": 509342535, + "[Northwest] Chest Near Quarry Gate/Rudeling Camp": 509342536, + "[East] Chest In Trees/Above Locked House": 509342537, + "[West] Chest Behind Moss Wall/Around the Corner": 509342538, + "[South] Beach Page/Page": 509342539, + "[Southeast] Page on Pillar by Swamp/Dash Across": 509342540, + "[Southwest] Key Pickup/Old House Key": 509342541, + "[West] Key Pickup/Hero's Path Key": 509342542, + "[East] Page Near Secret Shop/Page": 509342543, + "Fountain/[Southwest] Fountain Page": 509342544, + "[Northwest] Page on Pillar by Dark Tomb/A Terrible Power Rises": 509342545, + "Magic Staff/[Northwest] Fire Wand Pickup": 509342546, + "[West] Page on Teleporter/Treasures and Tools": 509342547, + "[Northwest] Page By Well/If you seek to increase your power...": 509342548, + "Patrol Cave/Normal Chest": 509342549, + "Ruined Shop/Chest 1": 509342550, + "Ruined Shop/Chest 2": 509342551, + "Ruined Shop/Chest 3": 509342552, + "Ruined Passage/Page Pickup": 509342553, + "Shop/Potion 1": 509342554, + "Shop/Potion 2": 509342555, + "Shop/Coin 1": 509342556, + "Shop/Coin 2": 509342557, + "Special Shop/Secret Page Pickup": 509342558, + "Stick House/Stick Chest": 509342559, + "Sealed Temple/Page Pickup": 509342560, + "Inside Hourglass Cave/Hourglass Chest": 509342561, + "Secret Chest/Dash Across": 509342562, + "Page Pickup/A Long, Long Time Ago...": 509342563, + "Coins in the Well/10 Coins": 509342564, + "Coins in the Well/15 Coins": 509342565, + "Coins in the Well/3 Coins": 509342566, + "Coins in the Well/6 Coins": 509342567, + "Secret Gathering Place/20 Fairy Reward": 509342568, + "Secret Gathering Place/10 Fairy Reward": 509342569, + "[West] Moss Wall Holy Cross/Use the Holy Cross": 509342570, + "[Southwest] Flowers Holy Cross/Use the Holy Cross": 509342571, + "Fountain/[Southwest] Fountain Holy Cross": 509342572, + "[Northeast] Flowers Holy Cross/Use the Holy Cross": 509342573, + "[East] Weathervane Holy Cross/Use the Holy Cross": 509342574, + "[West] Windmill Holy Cross/Sacred Geometry": 509342575, + "Sand Hook/[Southwest] Haiku Holy Cross": 509342576, + "[West] Windchimes Holy Cross/Power Up!": 509342577, + "[South] Starting Platform Holy Cross/Back to Work": 509342578, + "Magic Staff/[Northwest] Golden Obelisk Page": 509342579, + "Inside the Old House/Holy Cross Door Page": 509342580, + "Cube Cave/Holy Cross Chest": 509342581, + "Southeast Cross Door/Chest 3": 509342582, + "Southeast Cross Door/Chest 2": 509342583, + "Southeast Cross Door/Chest 1": 509342584, + "Maze Cave/Maze Room Holy Cross": 509342585, + "Caustic Light Cave/Holy Cross Chest": 509342586, + "Inside the Old House/Holy Cross Chest": 509342587, + "Patrol Cave/Holy Cross Chest": 509342588, + "Ruined Passage/Holy Cross Chest": 509342589, + "Inside Hourglass Cave/Holy Cross Chest": 509342590, + "Sealed Temple/Holy Cross Chest": 509342591, + "Fountain Cross Door/Page Pickup": 509342592, + "Secret Gathering Place/Holy Cross Chest": 509342593, + "Mountain Door/Top of the Mountain - Page At The Peak": 509342594, + "Monastery/Monastery Chest": 509342595, + "[Back Entrance] Bushes Holy Cross/Use the Holy Cross": 509342596, + "[Back Entrance] Chest/Peaceful Chest": 509342597, + "[Central] Near Shortcut Ladder/By the Boxes": 509342598, + "[East] Near Telescope/Spoopy": 509342599, + "[East] Upper Floor/Reminds me of Blighttown": 509342600, + "[Central] Below Entry Walkway/Even more Stairs!": 509342601, + "[East] Obscured Near Winding Staircase/At the Bottom": 509342602, + "[East] Obscured Beneath Scaffolding/In the Miasma Mound": 509342603, + "[East] Obscured Near Telescope/Weird path?": 509342604, + "[Back Entrance] Obscured Behind Wall/Happy Water!": 509342605, + "[Central] Obscured Below Entry Walkway/Down the Stairs": 509342606, + "[Central] Top Floor Overhang/End of the ruined bridge": 509342607, + "[East] Near Bridge/Drop that Bridge!": 509342608, + "[Central] Above Ladder/Climb Ladder": 509342609, + "[Central] Obscured Behind Staircase/At the Bottom": 509342610, + "[Central] Above Ladder Dash Chest/Dash Across": 509342611, + "[West] Upper Area Bombable Wall/Boomy": 509342612, + "[East] Bombable Wall/Flowers Guide Thee": 509342613, + "Monastery/Hero's Grave - Ash Relic": 509342614, + "[West] Shooting Range Secret Path/Obscured Path": 509342615, + "[West] Near Shooting Range/End of bridge": 509342616, + "[West] Below Shooting Range/Clever little sneak!": 509342617, + "[Lowlands] Below Broken Ladder/Miasma Pits": 509342618, + "[West] Upper Area Near Waterfall/Yummy Polygons": 509342619, + "[Lowlands] Upper Walkway/Hate them Snipers": 509342620, + "[West] Lower Area Below Bridge/Go Around": 509342621, + "[West] Lower Area Isolated Chest/Burn Pots": 509342622, + "[Lowlands] Near Elevator/End of the Tracks": 509342623, + "[West] Lower Area After Bridge/Drop that Bridge!": 509342624, + "Upper - Near Bridge Switch/You can shoot it": 509342625, + "Upper - Beneath Bridge To Administrator/End of the First Floor": 509342626, + "Tower - Inside Tower/I'm Scared": 509342627, + "Lower - Near Corpses/They are Dead": 509342628, + "Lower - Spider Ambush/Use the Gun": 509342629, + "Lower - Left Of Checkpoint Before Fuse/Moment of Reprieve": 509342630, + "Lower - After Guarded Fuse/Defeat those Mechs": 509342631, + "Lower - Guarded By Double Turrets/Help": 509342632, + "Lower - After 2nd Double Turret Chest/Haircut Time!": 509342633, + "Lower - Guarded By Double Turrets 2/Oh god they're everywhere": 509342634, + "Lower - Hexagon Blue/Scavenger Queen": 509342635, + "[West] Near Kevin Block/Phonomath": 509342636, + "[South] Upper Floor On Power Line/Hidden Ladder Chest": 509342637, + "[South] Chest Near Big Crabs/His Name is Tom": 509342638, + "[North] Guarded By Bird/Skraw!": 509342639, + "[Northeast] Chest Beneath Brick Walkway/Mind the Crabbits": 509342640, + "[Northwest] Bombable Wall/Flowers Guide Thee": 509342641, + "[North] Obscured Beneath Bridge/In the shallow water": 509342642, + "[South] Upper Floor On Bricks/Up the Ladder": 509342643, + "[South] Near Birds/Danlarry and Thranmire ate Jerry!": 509342644, + "[Northwest] Behind Envoy/Mind the Fairies": 509342645, + "[Southwest] Obscured Behind Fuse/Saved by the Prayer": 509342646, + "Locked Brick House/[East] Locked Room Upper Chest": 509342647, + "[North] From Lower Overworld Entrance/Come from the Overworld": 509342648, + "Locked Brick House/[East] Locked Room Lower Chest": 509342649, + "[Northeast] Chest On Brick Walkway/Near Domain": 509342650, + "[Southeast] Chest Near Fuse/Around the Tower": 509342651, + "[Northeast] Key Pickup/Around the Hill": 509342652, + "Cathedral Gauntlet/Gauntlet Reward": 509342653, + "Secret Legend Trophy Chest/You can use the Holy Cross from the outside": 509342654, + "[Upper Graveyard] Obscured Behind Hill/Between Two Hills": 509342655, + "[South Graveyard] 4 Orange Skulls/DJ Khaled - Let's go Golfing!": 509342656, + "[Central] Near Ramps Up/Up them Ramps": 509342657, + "[Upper Graveyard] Near Shield Fleemers/Alternatively, Before the Cathedral": 509342658, + "[South Graveyard] Obscured Behind Ridge/Hidden passage by ladder": 509342659, + "[South Graveyard] Obscured Beneath Telescope/Through the Nook": 509342660, + "[Entrance] Above Entryway/Dash Across": 509342661, + "[Central] South Secret Passage/Wall Man Approves these Vibes": 509342662, + "[South Graveyard] Upper Walkway On Pedestal/Gazing out over the Graves": 509342663, + "[South Graveyard] Guarded By Tentacles/Isolated Island": 509342664, + "[Upper Graveyard] Near Telescope/Overlooking the Graves": 509342665, + "[Outside Cathedral] Near Moonlight Bridge Door/Down the Hidden Ladder": 509342666, + "[Entrance] Obscured Inside Watchtower/Go Inside": 509342667, + "[Entrance] South Near Fence/DAGGER STRAP!!!!!": 509342668, + "[South Graveyard] Guarded By Big Skeleton/Super Clipping": 509342669, + "[South Graveyard] Chest Near Graves/The Rest of Our Entire Life is Death": 509342670, + "[Entrance] North Small Island/Mildly Hidden": 509342671, + "First Hero's Grave/[Outside Cathedral] Obscured Behind Memorial": 509342672, + "[Central] Obscured Behind Northern Mountain/Hug the Wall": 509342673, + "[South Graveyard] Upper Walkway Dash Chest/Around the Hill": 509342674, + "[South Graveyard] Above Big Skeleton/End of Ledge": 509342675, + "[Central] Beneath Memorial/Do You Even Live?": 509342676, + "First Hero's Grave/Hero's Grave - Feathers Relic": 509342677, + "West Furnace/Chest": 509342678, + "[West] Near Gardens Entrance/Effigy Skip": 509342679, + "[Central Highlands] Holy Cross (Blue Lines)/Use the Holy Cross": 509342680, + "[West Lowlands] Tree Holy Cross Chest/Use the Holy Cross": 509342681, + "[Southeast Lowlands] Outside Cave/Mind the Chompignoms!": 509342682, + "[Central Lowlands] Chest Beneath Faeries/As you walk by": 509342683, + "[North] Behind Holy Cross Door/Extra Sword!": 509342684, + "[Central Highlands] Top of Ladder Before Boss/Try to be This Strong": 509342685, + "[Central Lowlands] Passage Beneath Bridge/Take the lower path": 509342686, + "[North] Across From Page Pickup/I Love Fish!": 509342687, + "[Central Lowlands] Below Left Walkway/Dash Across": 509342688, + "[West] In Flooded Walkway/Dash through the water": 509342689, + "[West] Past Flooded Walkway/Through the Shallow Water": 509342690, + "[North] Obscured Beneath Hero's Memorial/Take the Long Way Around": 509342691, + "[Central Lowlands] Chest Near Shortcut Bridge/Between a Rope and a Bridge Place": 509342692, + "[West Highlands] Upper Left Walkway/By the Rudeling": 509342693, + "[Central Lowlands] Chest Beneath Save Point/Behind the Way": 509342694, + "[Central Highlands] Behind Guard Captain/Under Boss Ladder": 509342695, + "[Central Highlands] After Garden Knight/Did Not Kill You": 509342696, + "[South Highlands] Secret Chest Beneath Fuse/Pray to the Wall Man": 509342697, + "[East Lowlands] Page Behind Ice Dagger House/Come from the Far Shore": 509342698, + "[North] Page Pickup/Survival Tips": 509342699, + "[Southeast Lowlands] Ice Dagger Pickup/Ice Dagger Cave": 509342700, + "Hero's Grave/Effigy Relic": 509342701, +} + + +# for setting up the poptracker integration +tracker_world = { + "map_page_maps": ["maps/maps_pop.json"], + "map_page_locations": ["locations/locations_pop_er.json"], + "map_page_setting_key": "Slot:{player}:Current Map", + "map_page_index": map_page_index, + "external_pack_key": "ut_poptracker_path", + "poptracker_name_mapping": poptracker_data +} From 44a78cc821002a4b59feb3ffc9a195a8e28d5143 Mon Sep 17 00:00:00 2001 From: josephwhite <22449090+josephwhite@users.noreply.github.com> Date: Thu, 22 May 2025 09:26:28 -0400 Subject: [PATCH 164/199] OoT: Stop Using Utils.get_options (#4957) --- OoTClient.py | 5 +++-- worlds/oot/__init__.py | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/OoTClient.py b/OoTClient.py index 6a87b9e722..571300ed36 100644 --- a/OoTClient.py +++ b/OoTClient.py @@ -12,6 +12,7 @@ from CommonClient import CommonContext, server_loop, gui_enabled, \ import Utils from Utils import async_start from worlds import network_data_package +from worlds.oot import OOTWorld from worlds.oot.Rom import Rom, compress_rom_file from worlds.oot.N64Patch import apply_patch_file from worlds.oot.Utils import data_path @@ -280,7 +281,7 @@ async def n64_sync_task(ctx: OoTContext): async def run_game(romfile): - auto_start = Utils.get_options()["oot_options"].get("rom_start", True) + auto_start = OOTWorld.settings.rom_start if auto_start is True: import webbrowser webbrowser.open(romfile) @@ -295,7 +296,7 @@ async def patch_and_run_game(apz5_file): decomp_path = base_name + '-decomp.z64' comp_path = base_name + '.z64' # Load vanilla ROM, patch file, compress ROM - rom_file_name = Utils.get_options()["oot_options"]["rom_file"] + rom_file_name = OOTWorld.settings.rom_file rom = Rom(rom_file_name) sub_file = None diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index 401c387d5e..ed025f4971 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -30,7 +30,6 @@ from .Patches import OoTContainer, patch_rom from .N64Patch import create_patch_file from .Cosmetics import patch_cosmetics -from settings import get_settings from BaseClasses import MultiWorld, CollectionState, Tutorial, LocationProgressType from Options import Range, Toggle, VerifyKeys, Accessibility, PlandoConnections, PlandoItems from Fill import fill_restrictive, fast_fill, FillError @@ -203,7 +202,8 @@ class OOTWorld(World): @classmethod def stage_assert_generate(cls, multiworld: MultiWorld): - rom = Rom(file=get_settings()['oot_options']['rom_file']) + oot_settings = OOTWorld.settings + rom = Rom(file=oot_settings.rom_file) # Option parsing, handling incompatible options, building useful-item table @@ -1089,7 +1089,8 @@ class OOTWorld(World): self.hint_rng = self.random outfile_name = self.multiworld.get_out_file_name_base(self.player) - rom = Rom(file=get_settings()['oot_options']['rom_file']) + oot_settings = OOTWorld.settings + rom = Rom(file=oot_settings.rom_file) try: if self.hints != 'none': buildWorldGossipHints(self) From 95efcf6803c7d60e0994e15dd18d1f00e9ff31a7 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 22 May 2025 08:27:18 -0500 Subject: [PATCH 165/199] Tests: Create CollectionState after MultiWorld.worlds (#4949) --- BaseClasses.py | 1 + test/bases.py | 2 +- test/benchmark/locations.py | 2 +- test/general/__init__.py | 2 +- worlds/alttp/test/__init__.py | 2 +- worlds/kdl3/test/__init__.py | 2 +- worlds/stardew_valley/test/bases.py | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index f480cbbda3..9e1a0a0d7a 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -736,6 +736,7 @@ class CollectionState(): additional_copy_functions: List[Callable[[CollectionState, CollectionState], CollectionState]] = [] def __init__(self, parent: MultiWorld, allow_partial_entrances: bool = False): + assert parent.worlds, "CollectionState created without worlds initialized in parent" self.prog_items = {player: Counter() for player in parent.get_all_ids()} self.multiworld = parent self.reachable_regions = {player: set() for player in parent.get_all_ids()} diff --git a/test/bases.py b/test/bases.py index a3ea233174..c9610c862d 100644 --- a/test/bases.py +++ b/test/bases.py @@ -159,7 +159,6 @@ class WorldTestBase(unittest.TestCase): self.multiworld.game[self.player] = self.game self.multiworld.player_name = {self.player: "Tester"} self.multiworld.set_seed(seed) - self.multiworld.state = CollectionState(self.multiworld) random.seed(self.multiworld.seed) self.multiworld.seed_name = get_seed_name(random) # only called to get same RNG progression as Generate.py args = Namespace() @@ -168,6 +167,7 @@ class WorldTestBase(unittest.TestCase): 1: option.from_any(self.options.get(name, option.default)) }) self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) self.world = self.multiworld.worlds[self.player] for step in gen_steps: call_all(self.multiworld, step) diff --git a/test/benchmark/locations.py b/test/benchmark/locations.py index 857e188236..16667a17b9 100644 --- a/test/benchmark/locations.py +++ b/test/benchmark/locations.py @@ -59,13 +59,13 @@ def run_locations_benchmark(): multiworld.game[1] = game multiworld.player_name = {1: "Tester"} multiworld.set_seed(0) - multiworld.state = CollectionState(multiworld) args = argparse.Namespace() for name, option in AutoWorld.AutoWorldRegister.world_types[game].options_dataclass.type_hints.items(): setattr(args, name, { 1: option.from_any(getattr(option, "default")) }) multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) gc.collect() for step in self.gen_steps: diff --git a/test/general/__init__.py b/test/general/__init__.py index 6c4d5092cf..34df741a8c 100644 --- a/test/general/__init__.py +++ b/test/general/__init__.py @@ -49,7 +49,6 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple multiworld.game = {player: world_type.game for player, world_type in enumerate(worlds, 1)} multiworld.player_name = {player: f"Tester{player}" for player in multiworld.player_ids} multiworld.set_seed(seed) - multiworld.state = CollectionState(multiworld) args = Namespace() for player, world_type in enumerate(worlds, 1): for key, option in world_type.options_dataclass.type_hints.items(): @@ -57,6 +56,7 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple updated_options[player] = option.from_any(option.default) setattr(args, key, updated_options) multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) for step in steps: call_all(multiworld, step) return multiworld diff --git a/worlds/alttp/test/__init__.py b/worlds/alttp/test/__init__.py index 307e75381d..031d508604 100644 --- a/worlds/alttp/test/__init__.py +++ b/worlds/alttp/test/__init__.py @@ -10,12 +10,12 @@ class LTTPTestBase(unittest.TestCase): from worlds.alttp.Options import Medallion self.multiworld = MultiWorld(1) self.multiworld.game[1] = "A Link to the Past" - self.multiworld.state = CollectionState(self.multiworld) self.multiworld.set_seed(None) args = Namespace() for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): setattr(args, name, {1: option.from_any(getattr(option, "default"))}) self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) self.world = self.multiworld.worlds[1] # by default medallion access is randomized, for unittests we set it to vanilla self.world.options.misery_mire_medallion.value = Medallion.option_ether diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index 92f1d7261f..46f78aadaa 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -26,13 +26,13 @@ class KDL3TestBase(WorldTestBase): self.multiworld.game[1] = self.game self.multiworld.player_name = {1: "Tester"} self.multiworld.set_seed(seed) - self.multiworld.state = CollectionState(self.multiworld) args = Namespace() for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].options_dataclass.type_hints.items(): setattr(args, name, { 1: option.from_any(self.options.get(name, getattr(option, "default"))) }) self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) self.multiworld.plando_options = PlandoOptions.connections for step in gen_steps: call_all(self.multiworld, step) diff --git a/worlds/stardew_valley/test/bases.py b/worlds/stardew_valley/test/bases.py index 64ada39568..affc20cde1 100644 --- a/worlds/stardew_valley/test/bases.py +++ b/worlds/stardew_valley/test/bases.py @@ -293,12 +293,12 @@ def setup_multiworld(test_options: Iterable[Dict[str, int]] = None, seed=None) - multiworld = MultiWorld(len(test_options)) multiworld.player_name = {} multiworld.set_seed(seed) - multiworld.state = CollectionState(multiworld) for i in range(1, len(test_options) + 1): multiworld.game[i] = StardewValleyWorld.game multiworld.player_name.update({i: f"Tester{i}"}) args = fill_namespace_with_default(test_options) multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) for step in gen_steps: call_all(multiworld, step) From aeac83d643aaa91c2ab310414c959447d2be5cda Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 22 May 2025 08:29:24 -0500 Subject: [PATCH 166/199] Generate: Don't Force Player Name for Weights Files (#4943) --- Generate.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Generate.py b/Generate.py index 9bc8d1066f..f9607e328b 100644 --- a/Generate.py +++ b/Generate.py @@ -224,10 +224,14 @@ def main(args=None) -> tuple[argparse.Namespace, int]: except Exception as e: raise Exception(f"Error setting {k} to {v} for player {player}") from e - if path == args.weights_file_path: # if name came from the weights file, just use base player name - erargs.name[player] = f"Player{player}" - elif player not in erargs.name: # if name was not specified, generate it from filename - erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] + # name was not specified + if player not in erargs.name: + if path == args.weights_file_path: + # weights file, so we need to make the name unique + erargs.name[player] = f"Player{player}" + else: + # use the filename + erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] erargs.name[player] = handle_name(erargs.name[player], player, name_counter) player += 1 From 8cc6f1063475433e80f62107b95bb58769e3ed6b Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 22 May 2025 08:40:50 -0500 Subject: [PATCH 167/199] The Messenger: Swap Options Docstrings to use rst, Add Option Groups (#4913) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/messenger/__init__.py | 4 +- worlds/messenger/options.py | 78 +++++++++++++++++++++++++++++------- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 09911fd531..4e2c870dae 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -11,7 +11,7 @@ from .client_setup import launch_game from .connections import CONNECTIONS, RANDOMIZED_CONNECTIONS, TRANSITIONS from .constants import ALL_ITEMS, ALWAYS_LOCATIONS, BOSS_LOCATIONS, FILLER, NOTES, PHOBEKINS, PROG_ITEMS, TRAPS, \ USEFUL_ITEMS -from .options import AvailablePortals, Goal, Logic, MessengerOptions, NotesNeeded, ShuffleTransitions +from .options import AvailablePortals, Goal, Logic, MessengerOptions, NotesNeeded, option_groups, ShuffleTransitions from .portals import PORTALS, add_closed_portal_reqs, disconnect_portals, shuffle_portals, validate_portals from .regions import LEVELS, MEGA_SHARDS, LOCATIONS, REGION_CONNECTIONS from .rules import MessengerHardRules, MessengerOOBRules, MessengerRules @@ -35,6 +35,7 @@ class MessengerSettings(Group): class MessengerWeb(WebWorld): theme = "ocean" + rich_text_options_doc = True bug_report_page = "https://github.com/alwaysintreble/TheMessengerRandomizerModAP/issues" @@ -56,6 +57,7 @@ class MessengerWeb(WebWorld): ) tutorials = [tut_en, plando_en] + option_groups = option_groups class MessengerWorld(World): diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index 6b04118893..5010f40b4b 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -2,8 +2,11 @@ from dataclasses import dataclass from schema import And, Optional, Or, Schema -from Options import Choice, DeathLinkMixin, DefaultOnToggle, ItemsAccessibility, OptionDict, PerGameCommonOptions, \ - PlandoConnections, Range, StartInventoryPool, Toggle +from Options import ( + Choice, DeathLinkMixin, DefaultOnToggle, ItemsAccessibility, OptionDict, OptionGroup, + PerGameCommonOptions, + PlandoConnections, Range, StartInventoryPool, Toggle, +) from . import RANDOMIZED_CONNECTIONS from .portals import CHECKPOINTS, PORTALS, SHOP_POINTS @@ -48,8 +51,10 @@ class Logic(Choice): """ The level of logic to use when determining what locations in your world are accessible. - Normal: Can require damage boosts, but otherwise approachable for someone who has beaten the game. - Hard: Expects more knowledge and tighter execution. Has leashing, normal clips and much tighter d-boosting in logic. + **Normal:** Can require damage boosts, but otherwise approachable for someone who has beaten the game. + + **Hard:** Expects more knowledge and tighter execution. + Has leashing, normal clips and much tighter d-boosting in logic. """ display_name = "Logic Level" option_normal = 0 @@ -76,7 +81,10 @@ class EarlyMed(Toggle): class AvailablePortals(Range): - """Number of portals that are available from the start. Autumn Hills, Howling Grotto, and Glacial Peak are always available. If portal outputs are not randomized, Searing Crags will also be available.""" + """ + Number of portals that are available from the start. Autumn Hills, Howling Grotto, and Glacial Peak are always + available. If portal outputs are not randomized, Searing Crags will also be available. + """ display_name = "Available Starting Portals" range_start = 3 range_end = 6 @@ -89,10 +97,14 @@ class ShufflePortals(Choice): Entering a portal from its vanilla area will always lead to HQ, and will unlock it if relevant. Supports plando. - None: Portals will take you where they're supposed to. - Shops: Portals can lead to any area except Music Box and Elemental Skylands, with each portal output guaranteed to not overlap with another portal's. Will only put you at a portal or a shop. - Checkpoints: Like Shops except checkpoints without shops are also valid drop points. - Anywhere: Like Checkpoints except it's possible for multiple portals to output to the same map. + **None:** Portals will take you where they're supposed to. + + **Shops:** Portals can lead to any area except Music Box and Elemental Skylands, with each portal output guaranteed + to not overlap with another portal's. Will only put you at a portal or a shop. + + **Checkpoints:** Like Shops except checkpoints without shops are also valid drop points. + + **Anywhere:** Like Checkpoints except it's possible for multiple portals to output to the same map. """ display_name = "Shuffle Portal Outputs" option_none = 0 @@ -107,9 +119,11 @@ class ShuffleTransitions(Choice): Whether the transitions between the levels should be randomized. Supports plando. - None: Level transitions lead where they should. - Coupled: Returning through a transition will take you from whence you came. - Decoupled: Any level transition can take you to any other level transition. + **None:** Level transitions lead where they should. + + **Coupled:** Returning through a transition will take you from whence you came. + + **Decoupled:** Any level transition can take you to any other level transition. """ display_name = "Shuffle Level Transitions" option_none = 0 @@ -119,7 +133,10 @@ class ShuffleTransitions(Choice): class Goal(Choice): - """Requirement to finish the game. To win with the power seal hunt goal, you must enter the Music Box through the shop chest.""" + """ + Requirement to finish the game. + To win with the power seal hunt goal, you must enter the Music Box through the shop chest. + """ display_name = "Goal" option_open_music_box = 0 option_power_seal_hunt = 1 @@ -132,7 +149,8 @@ class MusicBox(DefaultOnToggle): class NotesNeeded(Range): """ - How many notes need to be found in order to access the Music Box. 6 are always needed to enter, so this places the others in your start inventory. + How many notes need to be found in order to access the Music Box. + 6 are always needed to enter, so this places the others in your start inventory. """ display_name = "Notes Needed" range_start = 1 @@ -240,3 +258,35 @@ class MessengerOptions(DeathLinkMixin, PerGameCommonOptions): shop_price_plan: PlannedShopPrices portal_plando: PortalPlando plando_connections: TransitionPlando + + +option_groups = [ + OptionGroup( + "Difficulty", + [ + EarlyMed, + Logic, + LimitedMovement, + ], + ), + OptionGroup( + "Goal", + [ + Goal, + MusicBox, + NotesNeeded, + AmountSeals, + RequiredSeals, + ], + ), + OptionGroup( + "Entrances", + [ + AvailablePortals, + ShufflePortals, + ShuffleTransitions, + PortalPlando, + TransitionPlando, + ], + ), +] From c5e768ffe32fcea48ecfc81adca330e4a0b11d38 Mon Sep 17 00:00:00 2001 From: FlitPix <8645405+FlitPix@users.noreply.github.com> Date: Thu, 22 May 2025 09:42:54 -0400 Subject: [PATCH 168/199] Minecraft: Stop Using Utils.get_options (#4879) --- MinecraftClient.py | 15 +++++++++------ worlds/minecraft/__init__.py | 8 +++++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/MinecraftClient.py b/MinecraftClient.py index 93385ec538..3047dc540e 100644 --- a/MinecraftClient.py +++ b/MinecraftClient.py @@ -14,6 +14,7 @@ import requests import Utils from Utils import is_windows +from settings import get_settings atexit.register(input, "Press enter to exit.") @@ -147,9 +148,11 @@ def find_jdk(version: str) -> str: if os.path.isfile(jdk_exe): return jdk_exe else: - jdk_exe = shutil.which(options["minecraft_options"].get("java", "java")) + jdk_exe = shutil.which(options.java) if not jdk_exe: - raise Exception("Could not find Java. Is Java installed on the system?") + jdk_exe = shutil.which("java") # try to fall back to system java + if not jdk_exe: + raise Exception("Could not find Java. Is Java installed on the system?") return jdk_exe @@ -285,8 +288,8 @@ if __name__ == '__main__': # Change to executable's working directory os.chdir(os.path.abspath(os.path.dirname(sys.argv[0]))) - options = Utils.get_options() - channel = args.channel or options["minecraft_options"]["release_channel"] + options = get_settings().minecraft_options + channel = args.channel or options.release_channel apmc_data = None data_version = args.data_version or None @@ -299,8 +302,8 @@ if __name__ == '__main__': versions = get_minecraft_versions(data_version, channel) - forge_dir = options["minecraft_options"]["forge_directory"] - max_heap = options["minecraft_options"]["max_heap_size"] + forge_dir = options.forge_directory + max_heap = options.max_heap_size forge_version = args.forge or versions["forge"] java_version = args.java or versions["java"] mod_url = versions["url"] diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 75539fcf2e..7ec9b4b2b8 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -27,9 +27,15 @@ class MinecraftSettings(settings.Group): any games played on the "beta" channel have a high likelihood of no longer working on the "release" channel. """ - forge_directory: ForgeDirectory = ForgeDirectory("Minecraft Forge server") + class JavaExecutable(settings.OptionalUserFilePath): + """ + Path to Java executable. If not set, will attempt to fall back to Java system installation. + """ + + forge_directory: ForgeDirectory = ForgeDirectory("Minecraft NeoForge server") max_heap_size: str = "2G" release_channel: ReleaseChannel = ReleaseChannel("release") + java: JavaExecutable = JavaExecutable("") class MinecraftWebWorld(WebWorld): From 1d655a07cdffb6c58715ec1b97837a8be5bf8fab Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 22 May 2025 08:46:33 -0500 Subject: [PATCH 169/199] Core: Add State add/remove/set Helpers (#4845) --- BaseClasses.py | 38 ++++++++++++++++++++++++++++++++++++ worlds/AutoWorld.py | 6 ++---- worlds/messenger/__init__.py | 4 ++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 9e1a0a0d7a..377dee7d63 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1013,6 +1013,17 @@ class CollectionState(): return changed + def add_item(self, item: str, player: int, count: int = 1) -> None: + """ + Adds the item to state. + + :param item: The item to be added. + :param player: The player the item is for. + :param count: How many of the item to add. + """ + assert count > 0 + self.prog_items[player][item] += count + def remove(self, item: Item): changed = self.multiworld.worlds[item.player].remove(self, item) if changed: @@ -1021,6 +1032,33 @@ class CollectionState(): self.blocked_connections[item.player] = set() self.stale[item.player] = True + def remove_item(self, item: str, player: int, count: int = 1) -> None: + """ + Removes the item from state. + + :param item: The item to be removed. + :param player: The player the item is for. + :param count: How many of the item to remove. + """ + assert count > 0 + self.prog_items[player][item] -= count + if self.prog_items[player][item] < 1: + del (self.prog_items[player][item]) + + def set_item(self, item: str, player: int, count: int) -> None: + """ + Sets the item in state equal to the provided count. + + :param item: The item to modify. + :param player: The player the item is for. + :param count: How many of the item to now have. + """ + assert count >= 0 + if count == 0: + del (self.prog_items[player][item]) + else: + self.prog_items[player][item] = count + class EntranceType(IntEnum): ONE_WAY = 1 diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index f0004a9f1b..6ea6c237d9 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -528,7 +528,7 @@ class World(metaclass=AutoWorldRegister): """Called when an item is collected in to state. Useful for things such as progressive items or currency.""" name = self.collect_item(state, item) if name: - state.prog_items[self.player][name] += 1 + state.add_item(name, self.player) return True return False @@ -536,9 +536,7 @@ class World(metaclass=AutoWorldRegister): """Called when an item is removed from to state. Useful for things such as progressive items or currency.""" name = self.collect_item(state, item, True) if name: - state.prog_items[self.player][name] -= 1 - if state.prog_items[self.player][name] < 1: - del (state.prog_items[self.player][name]) + state.remove_item(name, self.player) return True return False diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 4e2c870dae..8df59d9b29 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -428,13 +428,13 @@ class MessengerWorld(World): def collect(self, state: "CollectionState", item: "Item") -> bool: change = super().collect(state, item) if change and "Time Shard" in item.name: - state.prog_items[self.player]["Shards"] += int(item.name.strip("Time Shard ()")) + state.add_item("Shards", self.player, int(item.name.strip("Time Shard ()"))) return change def remove(self, state: "CollectionState", item: "Item") -> bool: change = super().remove(state, item) if change and "Time Shard" in item.name: - state.prog_items[self.player]["Shards"] -= int(item.name.strip("Time Shard ()")) + state.remove_item("Shards", self.player, int(item.name.strip("Time Shard ()"))) return change @classmethod From 45e3027f81fc0eba4ccd06b5e1ed1f3a1597a38d Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 22 May 2025 09:06:44 -0500 Subject: [PATCH 170/199] The Messenger: Add a Component Icon and Description (#4850) Co-authored-by: qwint Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/messenger/__init__.py | 13 +++++++++++-- worlds/messenger/assets/component_icon.png | Bin 0 -> 19691 bytes 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 worlds/messenger/assets/component_icon.png diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 8df59d9b29..e403ff59d8 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -6,7 +6,7 @@ from Options import Accessibility from Utils import output_path from settings import FilePath, Group from worlds.AutoWorld import WebWorld, World -from worlds.LauncherComponents import Component, Type, components +from worlds.LauncherComponents import Component, Type, components, icon_paths from .client_setup import launch_game from .connections import CONNECTIONS, RANDOMIZED_CONNECTIONS, TRANSITIONS from .constants import ALL_ITEMS, ALWAYS_LOCATIONS, BOSS_LOCATIONS, FILLER, NOTES, PHOBEKINS, PROG_ITEMS, TRAPS, \ @@ -20,9 +20,18 @@ from .subclasses import MessengerItem, MessengerRegion, MessengerShopLocation from .transitions import disconnect_entrances, shuffle_transitions components.append( - Component("The Messenger", component_type=Type.CLIENT, func=launch_game, game_name="The Messenger", supports_uri=True) + Component( + "The Messenger", + component_type=Type.CLIENT, + func=launch_game, + game_name="The Messenger", + supports_uri=True, + icon="The Messenger", + description="Launch The Messenger.\nInstalls and checks for updates for the randomizer.") ) +icon_paths["The Messenger"] = f"ap:{__name__}/assets/component_icon.png" + class MessengerSettings(Group): class GamePath(FilePath): diff --git a/worlds/messenger/assets/component_icon.png b/worlds/messenger/assets/component_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee91224ca069e806a7b976a3dbdcc55026390ae GIT binary patch literal 19691 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 Date: Thu, 22 May 2025 15:16:16 +0100 Subject: [PATCH 171/199] AHiT: Add Dweller Mask Requirement to Normal Logic Rush Hour (#4499) --- worlds/ahit/Locations.py | 2 +- worlds/ahit/Rules.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/ahit/Locations.py b/worlds/ahit/Locations.py index 713113e691..9937c774d1 100644 --- a/worlds/ahit/Locations.py +++ b/worlds/ahit/Locations.py @@ -477,7 +477,7 @@ act_completions = { "Act Completion (Rush Hour)": LocData(2000311210, "Rush Hour", dlc_flags=HatDLC.dlc2, hookshot=True, - required_hats=[HatType.ICE, HatType.BREWING]), + required_hats=[HatType.ICE, HatType.BREWING, HatType.DWELLER]), "Act Completion (Time Rift - Rumbi Factory)": LocData(2000312736, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), diff --git a/worlds/ahit/Rules.py b/worlds/ahit/Rules.py index 2ca0628a68..1c2c5845db 100644 --- a/worlds/ahit/Rules.py +++ b/worlds/ahit/Rules.py @@ -455,7 +455,7 @@ def set_moderate_rules(world: "HatInTimeWorld"): if "Pink Paw Station Thug" in key and is_location_valid(world, key): set_rule(world.multiworld.get_location(key, world.player), lambda state: True) - # Moderate: clear Rush Hour without Hookshot + # Moderate: clear Rush Hour without Hookshot or Dweller Mask set_rule(world.multiworld.get_location("Act Completion (Rush Hour)", world.player), lambda state: state.has("Metro Ticket - Pink", world.player) and state.has("Metro Ticket - Yellow", world.player) From 984df75f837044aa55168816109ea284efba52f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 22 May 2025 10:24:04 -0400 Subject: [PATCH 172/199] Stardew Valley: Move and Rework Monstersanity Tests (#4911) --- worlds/stardew_valley/test/TestGeneration.py | 159 ------------------ .../stardew_valley/test/TestMonstersanity.py | 132 +++++++++++++++ 2 files changed, 132 insertions(+), 159 deletions(-) create mode 100644 worlds/stardew_valley/test/TestMonstersanity.py diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 1e843ea690..5e60f8e80a 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -120,165 +120,6 @@ class TestNoGingerIslandItemGeneration(SVTestBase): self.assertTrue(count == 0 or count == 2) -class TestMonstersanityNone(SVTestBase): - options = { - options.Monstersanity.internal_name: options.Monstersanity.option_none, - # Not really necessary, but it adds more locations, so we don't have to remove useful items. - options.Fishsanity.internal_name: options.Fishsanity.option_all - } - - @property - def run_default_tests(self) -> bool: - # None is default - return False - - def test_when_generate_world_then_5_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 5) - - def test_when_generate_world_then_zero_specific_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 0) - self.assertEqual(item_pool.count("Progressive Club"), 0) - self.assertEqual(item_pool.count("Progressive Dagger"), 0) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_3_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 3) - - -class TestMonstersanityGoals(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanityOnePerCategory(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_one_per_category} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanityProgressive(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_progressive_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_many_rings_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertIn("Hot Java Ring", item_pool) - self.assertIn("Wedding Ring", item_pool) - self.assertIn("Slime Charmer Ring", item_pool) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanitySplit(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_split_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_many_rings_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertIn("Hot Java Ring", item_pool) - self.assertIn("Wedding Ring", item_pool) - self.assertIn("Slime Charmer Ring", item_pool) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - class TestProgressiveElevator(SVTestBase): options = { options.ElevatorProgression.internal_name: options.ElevatorProgression.option_progressive, diff --git a/worlds/stardew_valley/test/TestMonstersanity.py b/worlds/stardew_valley/test/TestMonstersanity.py new file mode 100644 index 0000000000..8393715474 --- /dev/null +++ b/worlds/stardew_valley/test/TestMonstersanity.py @@ -0,0 +1,132 @@ +import unittest +from typing import ClassVar + +from . import SVTestBase +from .. import options +from ..locations import LocationTags, location_table +from ..mods.mod_data import ModNames + + +class SVMonstersanityTestBase(SVTestBase): + expected_progressive_generic_weapon: ClassVar[int] = 0 + expected_progressive_specific_weapon: ClassVar[int] = 0 + expected_progressive_slingshot: ClassVar[int] = 0 + expected_progressive_footwear: ClassVar[int] = 0 + expected_rings: ClassVar[list[str]] = [] + + @classmethod + def setUpClass(cls) -> None: + if cls is SVMonstersanityTestBase: + raise unittest.SkipTest("Base tests disabled") + + super().setUpClass() + + def test_when_generate_world_then_expected_generic_weapons_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Weapon"), self.expected_progressive_generic_weapon) + + def test_when_generate_world_then_expected_specific_weapons_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Sword"), self.expected_progressive_specific_weapon) + self.assertEqual(item_pool.count("Progressive Club"), self.expected_progressive_specific_weapon) + self.assertEqual(item_pool.count("Progressive Dagger"), self.expected_progressive_specific_weapon) + + def test_when_generate_world_then_expected_slingshots_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Slingshot"), self.expected_progressive_slingshot) + + def test_when_generate_world_then_expected_shoes_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Footwear"), self.expected_progressive_footwear) + + def test_when_generate_world_then_many_rings_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + for expected_ring in self.expected_rings: + self.assertIn(expected_ring, item_pool) + + def test_when_generate_world_then_all_monster_checks_are_inaccessible_with_empty_inventory(self): + for location in self.get_real_locations(): + if LocationTags.MONSTERSANITY not in location_table[location.name].tags: + continue + with self.subTest(location.name): + self.assert_cannot_reach_location(location.name) + + +class TestMonstersanityNone(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_none, + # Not really necessary, but it adds more locations, so we don't have to remove useful items. + options.Fishsanity: options.Fishsanity.option_all, + } + expected_progressive_generic_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 3 + + @property + def run_default_tests(self) -> bool: + # None is default + return False + + +class TestMonstersanityNoneWithSVE(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_none, + options.Mods: ModNames.sve, + } + expected_progressive_generic_weapon = 6 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 3 + + @property + def run_default_tests(self) -> bool: + # None is default + return False + + +class TestMonstersanityGoals(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + + +class TestMonstersanityOnePerCategory(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_one_per_category, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + + +class TestMonstersanityProgressive(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_progressive_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] + + +class TestMonstersanitySplit(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_split_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] + + +class TestMonstersanitySplitWithSVE(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_split_goals, + options.Mods: ModNames.sve, + } + expected_progressive_specific_weapon = 6 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] From 0351698ef71f3aa7b8fe178a6517c69e93e49053 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Thu, 22 May 2025 11:07:57 -0400 Subject: [PATCH 173/199] SDV: Fixed Import bases (#5025) --- worlds/stardew_valley/test/TestMonstersanity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/stardew_valley/test/TestMonstersanity.py b/worlds/stardew_valley/test/TestMonstersanity.py index 8393715474..dd05827432 100644 --- a/worlds/stardew_valley/test/TestMonstersanity.py +++ b/worlds/stardew_valley/test/TestMonstersanity.py @@ -1,7 +1,7 @@ import unittest from typing import ClassVar -from . import SVTestBase +from .bases import SVTestBase from .. import options from ..locations import LocationTags, location_table from ..mods.mod_data import ModNames From 88b529593f655084b64040b731ad57a93a243e5a Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 22 May 2025 10:08:15 -0500 Subject: [PATCH 174/199] CommonClient: Add docs for Attributes (#5003) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- CommonClient.py | 75 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index 94c558bf8a..3a5f51aeee 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -266,38 +266,71 @@ class CommonContext: last_death_link: float = time.time() # last send/received death link on AP layer # remaining type info - slot_info: typing.Dict[int, NetworkSlot] - server_address: typing.Optional[str] - password: typing.Optional[str] - hint_cost: typing.Optional[int] - hint_points: typing.Optional[int] - player_names: typing.Dict[int, str] + slot_info: dict[int, NetworkSlot] + """Slot Info from the server for the current connection""" + server_address: str | None + """Autoconnect address provided by the ctx constructor""" + password: str | None + """Password used for Connecting, expected by server_auth""" + hint_cost: int | None + """Current Hint Cost per Hint from the server""" + hint_points: int | None + """Current avaliable Hint Points from the server""" + player_names: dict[int, str] + """Current lookup of slot number to player display name from server (includes aliases)""" finished_game: bool + """ + Bool to signal that status should be updated to Goal after reconnecting + to be used to ensure that a StatusUpdate packet does not get lost when disconnected + """ ready: bool - team: typing.Optional[int] - slot: typing.Optional[int] - auth: typing.Optional[str] - seed_name: typing.Optional[str] + """Bool to keep track of state for the /ready command""" + team: int | None + """Team number of currently connected slot""" + slot: int | None + """Slot number of currently connected slot""" + auth: str | None + """Name used in Connect packet""" + seed_name: str | None + """Seed name that will be validated on opening a socket if present""" # locations - locations_checked: typing.Set[int] # local state - locations_scouted: typing.Set[int] - items_received: typing.List[NetworkItem] - missing_locations: typing.Set[int] # server state - checked_locations: typing.Set[int] # server state - server_locations: typing.Set[int] # all locations the server knows of, missing_location | checked_locations - locations_info: typing.Dict[int, NetworkItem] + locations_checked: set[int] + """ + Local container of location ids checked to signal that LocationChecks should be resent after reconnecting + to be used to ensure that a LocationChecks packet does not get lost when disconnected + """ + locations_scouted: set[int] + """ + Local container of location ids scouted to signal that LocationScouts should be resent after reconnecting + to be used to ensure that a LocationScouts packet does not get lost when disconnected + """ + items_received: list[NetworkItem] + """List of NetworkItems recieved from the server""" + missing_locations: set[int] + """Container of Locations that are unchecked per server state""" + checked_locations: set[int] + """Container of Locations that are checked per server state""" + server_locations: set[int] + """Container of Locations that exist per server state; a combination between missing and checked locations""" + locations_info: dict[int, NetworkItem] + """Dict of location id: NetworkItem info from LocationScouts request""" # data storage - stored_data: typing.Dict[str, typing.Any] - stored_data_notification_keys: typing.Set[str] + stored_data: dict[str, typing.Any] + """ + Data Storage values by key that were retrieved from the server + any keys subscribed to with SetNotify will be kept up to date + """ + stored_data_notification_keys: set[str] + """Current container of watched Data Storage keys, managed by ctx.set_notify""" # internals - # current message box through kvui _messagebox: typing.Optional["kvui.MessageBox"] = None - # message box reporting a loss of connection + """Current message box through kvui""" _messagebox_connection_loss: typing.Optional["kvui.MessageBox"] = None + """Message box reporting a loss of connection""" def __init__(self, server_address: typing.Optional[str] = None, password: typing.Optional[str] = None) -> None: # server state From 9c0ad2b825ac3f95216a34b529291e3a1c02b8c1 Mon Sep 17 00:00:00 2001 From: Rosalie <61372066+Rosalie-A@users.noreply.github.com> Date: Thu, 22 May 2025 11:35:38 -0400 Subject: [PATCH 175/199] FF1: Bizhawk Client and APWorld Support (#4448) Co-authored-by: beauxq Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- FF1Client.py | 267 ---------------- data/lua/connector_ff1.lua | 462 ---------------------------- inno_setup.iss | 1 + setup.py | 1 - worlds/LauncherComponents.py | 2 - worlds/ff1/Client.py | 328 ++++++++++++++++++++ worlds/ff1/Items.py | 18 +- worlds/ff1/Locations.py | 14 +- worlds/ff1/__init__.py | 1 + worlds/ff1/docs/en_Final Fantasy.md | 9 +- worlds/ff1/docs/multiworld_en.md | 25 +- 11 files changed, 356 insertions(+), 772 deletions(-) delete mode 100644 FF1Client.py delete mode 100644 data/lua/connector_ff1.lua create mode 100644 worlds/ff1/Client.py diff --git a/FF1Client.py b/FF1Client.py deleted file mode 100644 index 748a95b72c..0000000000 --- a/FF1Client.py +++ /dev/null @@ -1,267 +0,0 @@ -import asyncio -import copy -import json -import time -from asyncio import StreamReader, StreamWriter -from typing import List - - -import Utils -from Utils import async_start -from CommonClient import CommonContext, server_loop, gui_enabled, ClientCommandProcessor, logger, \ - get_base_parser - -SYSTEM_MESSAGE_ID = 0 - -CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_ff1.lua" -CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure connector_ff1.lua is running" -CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart connector_ff1.lua" -CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" -CONNECTION_CONNECTED_STATUS = "Connected" -CONNECTION_INITIAL_STATUS = "Connection has not been initiated" - -DISPLAY_MSGS = True - - -class FF1CommandProcessor(ClientCommandProcessor): - def __init__(self, ctx: CommonContext): - super().__init__(ctx) - - def _cmd_nes(self): - """Check NES Connection State""" - if isinstance(self.ctx, FF1Context): - logger.info(f"NES Status: {self.ctx.nes_status}") - - def _cmd_toggle_msgs(self): - """Toggle displaying messages in EmuHawk""" - global DISPLAY_MSGS - DISPLAY_MSGS = not DISPLAY_MSGS - logger.info(f"Messages are now {'enabled' if DISPLAY_MSGS else 'disabled'}") - - -class FF1Context(CommonContext): - command_processor = FF1CommandProcessor - game = 'Final Fantasy' - items_handling = 0b111 # full remote - - def __init__(self, server_address, password): - super().__init__(server_address, password) - self.nes_streams: (StreamReader, StreamWriter) = None - self.nes_sync_task = None - self.messages = {} - self.locations_array = None - self.nes_status = CONNECTION_INITIAL_STATUS - self.awaiting_rom = False - self.display_msgs = True - - async def server_auth(self, password_requested: bool = False): - if password_requested and not self.password: - await super(FF1Context, self).server_auth(password_requested) - if not self.auth: - self.awaiting_rom = True - logger.info('Awaiting connection to NES to get Player information') - return - - await self.send_connect() - - def _set_message(self, msg: str, msg_id: int): - if DISPLAY_MSGS: - self.messages[time.time(), msg_id] = msg - - def on_package(self, cmd: str, args: dict): - if cmd == 'Connected': - async_start(parse_locations(self.locations_array, self, True)) - elif cmd == 'Print': - msg = args['text'] - if ': !' not in msg: - self._set_message(msg, SYSTEM_MESSAGE_ID) - - def on_print_json(self, args: dict): - if self.ui: - self.ui.print_json(copy.deepcopy(args["data"])) - else: - text = self.jsontotextparser(copy.deepcopy(args["data"])) - logger.info(text) - relevant = args.get("type", None) in {"Hint", "ItemSend"} - if relevant: - item = args["item"] - # goes to this world - if self.slot_concerns_self(args["receiving"]): - relevant = True - # found in this world - elif self.slot_concerns_self(item.player): - relevant = True - # not related - else: - relevant = False - if relevant: - item = args["item"] - msg = self.raw_text_parser(copy.deepcopy(args["data"])) - self._set_message(msg, item.item) - - def run_gui(self): - from kvui import GameManager - - class FF1Manager(GameManager): - logging_pairs = [ - ("Client", "Archipelago") - ] - base_title = "Archipelago Final Fantasy 1 Client" - - self.ui = FF1Manager(self) - self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") - - -def get_payload(ctx: FF1Context): - current_time = time.time() - return json.dumps( - { - "items": [item.item for item in ctx.items_received], - "messages": {f'{key[0]}:{key[1]}': value for key, value in ctx.messages.items() - if key[0] > current_time - 10} - } - ) - - -async def parse_locations(locations_array: List[int], ctx: FF1Context, force: bool): - if locations_array == ctx.locations_array and not force: - return - else: - # print("New values") - ctx.locations_array = locations_array - locations_checked = [] - if len(locations_array) > 0xFE and locations_array[0xFE] & 0x02 != 0 and not ctx.finished_game: - await ctx.send_msgs([ - {"cmd": "StatusUpdate", - "status": 30} - ]) - ctx.finished_game = True - for location in ctx.missing_locations: - # index will be - 0x100 or 0x200 - index = location - if location < 0x200: - # Location is a chest - index -= 0x100 - flag = 0x04 - else: - # Location is an NPC - index -= 0x200 - flag = 0x02 - - # print(f"Location: {ctx.location_names[location]}") - # print(f"Index: {str(hex(index))}") - # print(f"value: {locations_array[index] & flag != 0}") - if locations_array[index] & flag != 0: - locations_checked.append(location) - if locations_checked: - # print([ctx.location_names[location] for location in locations_checked]) - await ctx.send_msgs([ - {"cmd": "LocationChecks", - "locations": locations_checked} - ]) - - -async def nes_sync_task(ctx: FF1Context): - logger.info("Starting nes connector. Use /nes for status information") - while not ctx.exit_event.is_set(): - error_status = None - if ctx.nes_streams: - (reader, writer) = ctx.nes_streams - msg = get_payload(ctx).encode() - writer.write(msg) - writer.write(b'\n') - try: - await asyncio.wait_for(writer.drain(), timeout=1.5) - try: - # Data will return a dict with up to two fields: - # 1. A keepalive response of the Players Name (always) - # 2. An array representing the memory values of the locations area (if in game) - data = await asyncio.wait_for(reader.readline(), timeout=5) - data_decoded = json.loads(data.decode()) - # print(data_decoded) - if ctx.game is not None and 'locations' in data_decoded: - # Not just a keep alive ping, parse - async_start(parse_locations(data_decoded['locations'], ctx, False)) - if not ctx.auth: - ctx.auth = ''.join([chr(i) for i in data_decoded['playerName'] if i != 0]) - if ctx.auth == '': - logger.info("Invalid ROM detected. No player name built into the ROM. Please regenerate" - "the ROM using the same link but adding your slot name") - if ctx.awaiting_rom: - await ctx.server_auth(False) - except asyncio.TimeoutError: - logger.debug("Read Timed Out, Reconnecting") - error_status = CONNECTION_TIMING_OUT_STATUS - writer.close() - ctx.nes_streams = None - except ConnectionResetError as e: - logger.debug("Read failed due to Connection Lost, Reconnecting") - error_status = CONNECTION_RESET_STATUS - writer.close() - ctx.nes_streams = None - except TimeoutError: - logger.debug("Connection Timed Out, Reconnecting") - error_status = CONNECTION_TIMING_OUT_STATUS - writer.close() - ctx.nes_streams = None - except ConnectionResetError: - logger.debug("Connection Lost, Reconnecting") - error_status = CONNECTION_RESET_STATUS - writer.close() - ctx.nes_streams = None - if ctx.nes_status == CONNECTION_TENTATIVE_STATUS: - if not error_status: - logger.info("Successfully Connected to NES") - ctx.nes_status = CONNECTION_CONNECTED_STATUS - else: - ctx.nes_status = f"Was tentatively connected but error occured: {error_status}" - elif error_status: - ctx.nes_status = error_status - logger.info("Lost connection to nes and attempting to reconnect. Use /nes for status updates") - else: - try: - logger.debug("Attempting to connect to NES") - ctx.nes_streams = await asyncio.wait_for(asyncio.open_connection("localhost", 52980), timeout=10) - ctx.nes_status = CONNECTION_TENTATIVE_STATUS - except TimeoutError: - logger.debug("Connection Timed Out, Trying Again") - ctx.nes_status = CONNECTION_TIMING_OUT_STATUS - continue - except ConnectionRefusedError: - logger.debug("Connection Refused, Trying Again") - ctx.nes_status = CONNECTION_REFUSED_STATUS - continue - - -if __name__ == '__main__': - # Text Mode to use !hint and such with games that have no text entry - Utils.init_logging("FF1Client") - - options = Utils.get_options() - DISPLAY_MSGS = options["ffr_options"]["display_msgs"] - - async def main(args): - ctx = FF1Context(args.connect, args.password) - ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") - if gui_enabled: - ctx.run_gui() - ctx.run_cli() - ctx.nes_sync_task = asyncio.create_task(nes_sync_task(ctx), name="NES Sync") - - await ctx.exit_event.wait() - ctx.server_address = None - - await ctx.shutdown() - - if ctx.nes_sync_task: - await ctx.nes_sync_task - - - import colorama - - parser = get_base_parser() - args = parser.parse_args() - colorama.just_fix_windows_console() - - asyncio.run(main(args)) - colorama.deinit() diff --git a/data/lua/connector_ff1.lua b/data/lua/connector_ff1.lua deleted file mode 100644 index afae5d3c81..0000000000 --- a/data/lua/connector_ff1.lua +++ /dev/null @@ -1,462 +0,0 @@ -local socket = require("socket") -local json = require('json') -local math = require('math') -require("common") - -local STATE_OK = "Ok" -local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" -local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" -local STATE_UNINITIALIZED = "Uninitialized" - -local ITEM_INDEX = 0x03 -local WEAPON_INDEX = 0x07 -local ARMOR_INDEX = 0x0B - -local goldLookup = { - [0x16C] = 10, - [0x16D] = 20, - [0x16E] = 25, - [0x16F] = 30, - [0x170] = 55, - [0x171] = 70, - [0x172] = 85, - [0x173] = 110, - [0x174] = 135, - [0x175] = 155, - [0x176] = 160, - [0x177] = 180, - [0x178] = 240, - [0x179] = 255, - [0x17A] = 260, - [0x17B] = 295, - [0x17C] = 300, - [0x17D] = 315, - [0x17E] = 330, - [0x17F] = 350, - [0x180] = 385, - [0x181] = 400, - [0x182] = 450, - [0x183] = 500, - [0x184] = 530, - [0x185] = 575, - [0x186] = 620, - [0x187] = 680, - [0x188] = 750, - [0x189] = 795, - [0x18A] = 880, - [0x18B] = 1020, - [0x18C] = 1250, - [0x18D] = 1455, - [0x18E] = 1520, - [0x18F] = 1760, - [0x190] = 1975, - [0x191] = 2000, - [0x192] = 2750, - [0x193] = 3400, - [0x194] = 4150, - [0x195] = 5000, - [0x196] = 5450, - [0x197] = 6400, - [0x198] = 6720, - [0x199] = 7340, - [0x19A] = 7690, - [0x19B] = 7900, - [0x19C] = 8135, - [0x19D] = 9000, - [0x19E] = 9300, - [0x19F] = 9500, - [0x1A0] = 9900, - [0x1A1] = 10000, - [0x1A2] = 12350, - [0x1A3] = 13000, - [0x1A4] = 13450, - [0x1A5] = 14050, - [0x1A6] = 14720, - [0x1A7] = 15000, - [0x1A8] = 17490, - [0x1A9] = 18010, - [0x1AA] = 19990, - [0x1AB] = 20000, - [0x1AC] = 20010, - [0x1AD] = 26000, - [0x1AE] = 45000, - [0x1AF] = 65000 -} - -local extensionConsumableLookup = { - [432] = 0x3C, - [436] = 0x3C, - [440] = 0x3C, - [433] = 0x3D, - [437] = 0x3D, - [441] = 0x3D, - [434] = 0x3E, - [438] = 0x3E, - [442] = 0x3E, - [435] = 0x3F, - [439] = 0x3F, - [443] = 0x3F -} - -local noOverworldItemsLookup = { - [499] = 0x2B, - [500] = 0x12, -} - -local consumableStacks = nil -local prevstate = "" -local curstate = STATE_UNINITIALIZED -local ff1Socket = nil -local frame = 0 - -local isNesHawk = false - - ---Sets correct memory access functions based on whether NesHawk or QuickNES is loaded -local function defineMemoryFunctions() - local memDomain = {} - local domains = memory.getmemorydomainlist() - if domains[1] == "System Bus" then - --NesHawk - isNesHawk = true - memDomain["systembus"] = function() memory.usememorydomain("System Bus") end - memDomain["saveram"] = function() memory.usememorydomain("Battery RAM") end - memDomain["rom"] = function() memory.usememorydomain("PRG ROM") end - elseif domains[1] == "WRAM" then - --QuickNES - memDomain["systembus"] = function() memory.usememorydomain("System Bus") end - memDomain["saveram"] = function() memory.usememorydomain("WRAM") end - memDomain["rom"] = function() memory.usememorydomain("PRG ROM") end - end - return memDomain -end - -local memDomain = defineMemoryFunctions() - -local function StateOKForMainLoop() - memDomain.saveram() - local A = u8(0x102) -- Party Made - local B = u8(0x0FC) - local C = u8(0x0A3) - return A ~= 0x00 and not (A== 0xF2 and B == 0xF2 and C == 0xF2) -end - -function generateLocationChecked() - memDomain.saveram() - data = uRange(0x01FF, 0x101) - data[0] = nil - return data -end - -function setConsumableStacks() - memDomain.rom() - consumableStacks = {} - -- In order shards, tent, cabin, house, heal, pure, soft, ext1, ext2, ext3, ex4 - consumableStacks[0x35] = 1 - consumableStacks[0x36] = u8(0x47400) + 1 - consumableStacks[0x37] = u8(0x47401) + 1 - consumableStacks[0x38] = u8(0x47402) + 1 - consumableStacks[0x39] = u8(0x47403) + 1 - consumableStacks[0x3A] = u8(0x47404) + 1 - consumableStacks[0x3B] = u8(0x47405) + 1 - consumableStacks[0x3C] = u8(0x47406) + 1 - consumableStacks[0x3D] = u8(0x47407) + 1 - consumableStacks[0x3E] = u8(0x47408) + 1 - consumableStacks[0x3F] = u8(0x47409) + 1 -end - -function getEmptyWeaponSlots() - memDomain.saveram() - ret = {} - count = 1 - slot1 = uRange(0x118, 0x4) - slot2 = uRange(0x158, 0x4) - slot3 = uRange(0x198, 0x4) - slot4 = uRange(0x1D8, 0x4) - for i,v in pairs(slot1) do - if v == 0 then - ret[count] = 0x118 + i - count = count + 1 - end - end - for i,v in pairs(slot2) do - if v == 0 then - ret[count] = 0x158 + i - count = count + 1 - end - end - for i,v in pairs(slot3) do - if v == 0 then - ret[count] = 0x198 + i - count = count + 1 - end - end - for i,v in pairs(slot4) do - if v == 0 then - ret[count] = 0x1D8 + i - count = count + 1 - end - end - return ret -end - -function getEmptyArmorSlots() - memDomain.saveram() - ret = {} - count = 1 - slot1 = uRange(0x11C, 0x4) - slot2 = uRange(0x15C, 0x4) - slot3 = uRange(0x19C, 0x4) - slot4 = uRange(0x1DC, 0x4) - for i,v in pairs(slot1) do - if v == 0 then - ret[count] = 0x11C + i - count = count + 1 - end - end - for i,v in pairs(slot2) do - if v == 0 then - ret[count] = 0x15C + i - count = count + 1 - end - end - for i,v in pairs(slot3) do - if v == 0 then - ret[count] = 0x19C + i - count = count + 1 - end - end - for i,v in pairs(slot4) do - if v == 0 then - ret[count] = 0x1DC + i - count = count + 1 - end - end - return ret -end -local function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end -function processBlock(block) - local msgBlock = block['messages'] - if msgBlock ~= nil then - for i, v in pairs(msgBlock) do - if itemMessages[i] == nil then - local msg = {TTL=450, message=v, color=0xFFFF0000} - itemMessages[i] = msg - end - end - end - local itemsBlock = block["items"] - memDomain.saveram() - isInGame = u8(0x102) - if itemsBlock ~= nil and isInGame ~= 0x00 then - if consumableStacks == nil then - setConsumableStacks() - end - memDomain.saveram() --- print('ITEMBLOCK: ') --- print(itemsBlock) - itemIndex = u8(ITEM_INDEX) --- print('ITEMINDEX: '..itemIndex) - for i, v in pairs(slice(itemsBlock, itemIndex, #itemsBlock)) do - -- Minus the offset and add to the correct domain - local memoryLocation = v - if v >= 0x100 and v <= 0x114 then - -- This is a key item - memoryLocation = memoryLocation - 0x0E0 - wU8(memoryLocation, 0x01) - elseif v >= 0x1E0 and v <= 0x1F2 then - -- This is a movement item - -- Minus Offset (0x100) - movement offset (0xE0) - memoryLocation = memoryLocation - 0x1E0 - -- Canal is a flipped bit - if memoryLocation == 0x0C then - wU8(memoryLocation, 0x00) - else - wU8(memoryLocation, 0x01) - end - elseif v >= 0x1F3 and v <= 0x1F4 then - -- NoOverworld special items - memoryLocation = noOverworldItemsLookup[v] - wU8(memoryLocation, 0x01) - elseif v >= 0x16C and v <= 0x1AF then - -- This is a gold item - amountToAdd = goldLookup[v] - biggest = u8(0x01E) - medium = u8(0x01D) - smallest = u8(0x01C) - currentValue = 0x10000 * biggest + 0x100 * medium + smallest - newValue = currentValue + amountToAdd - newBiggest = math.floor(newValue / 0x10000) - newMedium = math.floor(math.fmod(newValue, 0x10000) / 0x100) - newSmallest = math.floor(math.fmod(newValue, 0x100)) - wU8(0x01E, newBiggest) - wU8(0x01D, newMedium) - wU8(0x01C, newSmallest) - elseif v >= 0x115 and v <= 0x11B then - -- This is a regular consumable OR a shard - -- Minus Offset (0x100) + item offset (0x20) - memoryLocation = memoryLocation - 0x0E0 - currentValue = u8(memoryLocation) - amountToAdd = consumableStacks[memoryLocation] - if currentValue < 99 then - wU8(memoryLocation, currentValue + amountToAdd) - end - elseif v >= 0x1B0 and v <= 0x1BB then - -- This is an extension consumable - memoryLocation = extensionConsumableLookup[v] - currentValue = u8(memoryLocation) - amountToAdd = consumableStacks[memoryLocation] - if currentValue < 99 then - value = currentValue + amountToAdd - if value > 99 then - value = 99 - end - wU8(memoryLocation, value) - end - end - end - if #itemsBlock > itemIndex then - wU8(ITEM_INDEX, #itemsBlock) - end - - memDomain.saveram() - weaponIndex = u8(WEAPON_INDEX) - emptyWeaponSlots = getEmptyWeaponSlots() - lastUsedWeaponIndex = weaponIndex --- print('WEAPON_INDEX: '.. weaponIndex) - memDomain.saveram() - for i, v in pairs(slice(itemsBlock, weaponIndex, #itemsBlock)) do - if v >= 0x11C and v <= 0x143 then - -- Minus the offset and add to the correct domain - local itemValue = v - 0x11B - if #emptyWeaponSlots > 0 then - slot = table.remove(emptyWeaponSlots, 1) - wU8(slot, itemValue) - lastUsedWeaponIndex = weaponIndex + i - else - break - end - end - end - if lastUsedWeaponIndex ~= weaponIndex then - wU8(WEAPON_INDEX, lastUsedWeaponIndex) - end - memDomain.saveram() - armorIndex = u8(ARMOR_INDEX) - emptyArmorSlots = getEmptyArmorSlots() - lastUsedArmorIndex = armorIndex --- print('ARMOR_INDEX: '.. armorIndex) - memDomain.saveram() - for i, v in pairs(slice(itemsBlock, armorIndex, #itemsBlock)) do - if v >= 0x144 and v <= 0x16B then - -- Minus the offset and add to the correct domain - local itemValue = v - 0x143 - if #emptyArmorSlots > 0 then - slot = table.remove(emptyArmorSlots, 1) - wU8(slot, itemValue) - lastUsedArmorIndex = armorIndex + i - else - break - end - end - end - if lastUsedArmorIndex ~= armorIndex then - wU8(ARMOR_INDEX, lastUsedArmorIndex) - end - end -end - -function receive() - l, e = ff1Socket:receive() - if e == 'closed' then - if curstate == STATE_OK then - print("Connection closed") - end - curstate = STATE_UNINITIALIZED - return - elseif e == 'timeout' then - print("timeout") - return - elseif e ~= nil then - print(e) - curstate = STATE_UNINITIALIZED - return - end - processBlock(json.decode(l)) - - -- Determine Message to send back - memDomain.rom() - local playerName = uRange(0x7BCBF, 0x41) - playerName[0] = nil - local retTable = {} - retTable["playerName"] = playerName - if StateOKForMainLoop() then - retTable["locations"] = generateLocationChecked() - end - msg = json.encode(retTable).."\n" - local ret, error = ff1Socket:send(msg) - if ret == nil then - print(error) - elseif curstate == STATE_INITIAL_CONNECTION_MADE then - curstate = STATE_TENTATIVELY_CONNECTED - elseif curstate == STATE_TENTATIVELY_CONNECTED then - print("Connected!") - itemMessages["(0,0)"] = {TTL=240, message="Connected", color="green"} - curstate = STATE_OK - end -end - -function main() - if not checkBizHawkVersion() then - return - end - server, error = socket.bind('localhost', 52980) - - while true do - gui.drawEllipse(248, 9, 6, 6, "Black", "Yellow") - frame = frame + 1 - drawMessages() - if not (curstate == prevstate) then - -- console.log("Current state: "..curstate) - prevstate = curstate - end - if (curstate == STATE_OK) or (curstate == STATE_INITIAL_CONNECTION_MADE) or (curstate == STATE_TENTATIVELY_CONNECTED) then - if (frame % 60 == 0) then - gui.drawEllipse(248, 9, 6, 6, "Black", "Blue") - receive() - else - gui.drawEllipse(248, 9, 6, 6, "Black", "Green") - end - elseif (curstate == STATE_UNINITIALIZED) then - gui.drawEllipse(248, 9, 6, 6, "Black", "White") - if (frame % 60 == 0) then - gui.drawEllipse(248, 9, 6, 6, "Black", "Yellow") - - drawText(5, 8, "Waiting for client", 0xFFFF0000) - drawText(5, 32, "Please start FF1Client.exe", 0xFFFF0000) - - -- Advance so the messages are drawn - emu.frameadvance() - server:settimeout(2) - print("Attempting to connect") - local client, timeout = server:accept() - if timeout == nil then - -- print('Initial Connection Made') - curstate = STATE_INITIAL_CONNECTION_MADE - ff1Socket = client - ff1Socket:settimeout(0) - end - end - end - emu.frameadvance() - end -end - -main() diff --git a/inno_setup.iss b/inno_setup.iss index adf9acc834..d9d4d7fb01 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -86,6 +86,7 @@ Type: dirifempty; Name: "{app}" [InstallDelete] Type: files; Name: "{app}\*.exe" Type: files; Name: "{app}\data\lua\connector_pkmn_rb.lua" +Type: files; Name: "{app}\data\lua\connector_ff1.lua" Type: filesandordirs; Name: "{app}\SNI\lua*" Type: filesandordirs; Name: "{app}\EnemizerCLI*" #include "installdelete.iss" diff --git a/setup.py b/setup.py index ccca46390b..a46b1e8ce5 100644 --- a/setup.py +++ b/setup.py @@ -64,7 +64,6 @@ non_apworlds: set[str] = { "ArchipIDLE", "Archipelago", "Clique", - "Final Fantasy", "Lufia II Ancient Cave", "Meritous", "Ocarina of Time", diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index b3e3d90060..2bd9636931 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -224,8 +224,6 @@ components: List[Component] = [ Component('OoT Client', 'OoTClient', file_identifier=SuffixIdentifier('.apz5')), Component('OoT Adjuster', 'OoTAdjuster'), - # FF1 - Component('FF1 Client', 'FF1Client'), # TLoZ Component('Zelda 1 Client', 'Zelda1Client', file_identifier=SuffixIdentifier('.aptloz')), # ChecksFinder diff --git a/worlds/ff1/Client.py b/worlds/ff1/Client.py new file mode 100644 index 0000000000..f7315f69f0 --- /dev/null +++ b/worlds/ff1/Client.py @@ -0,0 +1,328 @@ +import logging +from collections import deque +from typing import TYPE_CHECKING + +from NetUtils import ClientStatus + +import worlds._bizhawk as bizhawk +from worlds._bizhawk.client import BizHawkClient + +if TYPE_CHECKING: + from worlds._bizhawk.context import BizHawkClientContext + + +base_id = 7000 +logger = logging.getLogger("Client") + + +rom_name_location = 0x07FFE3 +locations_array_start = 0x200 +locations_array_length = 0x100 +items_obtained = 0x03 +gp_location_low = 0x1C +gp_location_middle = 0x1D +gp_location_high = 0x1E +weapons_arrays_starts = [0x118, 0x158, 0x198, 0x1D8] +armors_arrays_starts = [0x11C, 0x15C, 0x19C, 0x1DC] +status_a_location = 0x102 +status_b_location = 0x0FC +status_c_location = 0x0A3 + +key_items = ["Lute", "Crown", "Crystal", "Herb", "Key", "Tnt", "Adamant", "Slab", "Ruby", "Rod", + "Floater", "Chime", "Tail", "Cube", "Bottle", "Oxyale", "EarthOrb", "FireOrb", "WaterOrb", "AirOrb"] + +consumables = ["Shard", "Tent", "Cabin", "House", "Heal", "Pure", "Soft"] + +weapons = ["WoodenNunchucks", "SmallKnife", "WoodenRod", "Rapier", "IronHammer", "ShortSword", "HandAxe", "Scimitar", + "IronNunchucks", "LargeKnife", "IronStaff", "Sabre", "LongSword", "GreatAxe", "Falchon", "SilverKnife", + "SilverSword", "SilverHammer", "SilverAxe", "FlameSword", "IceSword", "DragonSword", "GiantSword", + "SunSword", "CoralSword", "WereSword", "RuneSword", "PowerRod", "LightAxe", "HealRod", "MageRod", "Defense", + "WizardRod", "Vorpal", "CatClaw", "ThorHammer", "BaneSword", "Katana", "Xcalber", "Masamune"] + +armor = ["Cloth", "WoodenArmor", "ChainArmor", "IronArmor", "SteelArmor", "SilverArmor", "FlameArmor", "IceArmor", + "OpalArmor", "DragonArmor", "Copper", "Silver", "Gold", "Opal", "WhiteShirt", "BlackShirt", "WoodenShield", + "IronShield", "SilverShield", "FlameShield", "IceShield", "OpalShield", "AegisShield", "Buckler", "ProCape", + "Cap", "WoodenHelm", "IronHelm", "SilverHelm", "OpalHelm", "HealHelm", "Ribbon", "Gloves", "CopperGauntlets", + "IronGauntlets", "SilverGauntlets", "ZeusGauntlets", "PowerGauntlets", "OpalGauntlets", "ProRing"] + +gold_items = ["Gold10", "Gold20", "Gold25", "Gold30", "Gold55", "Gold70", "Gold85", "Gold110", "Gold135", "Gold155", + "Gold160", "Gold180", "Gold240", "Gold255", "Gold260", "Gold295", "Gold300", "Gold315", "Gold330", + "Gold350", "Gold385", "Gold400", "Gold450", "Gold500", "Gold530", "Gold575", "Gold620", "Gold680", + "Gold750", "Gold795", "Gold880", "Gold1020", "Gold1250", "Gold1455", "Gold1520", "Gold1760", "Gold1975", + "Gold2000", "Gold2750", "Gold3400", "Gold4150", "Gold5000", "Gold5450", "Gold6400", "Gold6720", + "Gold7340", "Gold7690", "Gold7900", "Gold8135", "Gold9000", "Gold9300", "Gold9500", "Gold9900", + "Gold10000", "Gold12350", "Gold13000", "Gold13450", "Gold14050", "Gold14720", "Gold15000", "Gold17490", + "Gold18010", "Gold19990", "Gold20000", "Gold20010", "Gold26000", "Gold45000", "Gold65000"] + +extended_consumables = ["FullCure", "Phoenix", "Blast", "Smoke", + "Refresh", "Flare", "Black", "Guard", + "Quick", "HighPotion", "Wizard", "Cloak"] + +ext_consumables_lookup = {"FullCure": "Ext1", "Phoenix": "Ext2", "Blast": "Ext3", "Smoke": "Ext4", + "Refresh": "Ext1", "Flare": "Ext2", "Black": "Ext3", "Guard": "Ext4", + "Quick": "Ext1", "HighPotion": "Ext2", "Wizard": "Ext3", "Cloak": "Ext4"} + +ext_consumables_locations = {"Ext1": 0x3C, "Ext2": 0x3D, "Ext3": 0x3E, "Ext4": 0x3F} + + +movement_items = ["Ship", "Bridge", "Canal", "Canoe"] + +no_overworld_items = ["Sigil", "Mark"] + + +class FF1Client(BizHawkClient): + game = "Final Fantasy" + system = "NES" + + weapons_queue: deque[int] + armor_queue: deque[int] + consumable_stack_amounts: dict[str, int] | None + + def __init__(self) -> None: + self.wram = "RAM" + self.sram = "WRAM" + self.rom = "PRG ROM" + self.consumable_stack_amounts = None + self.weapons_queue = deque() + self.armor_queue = deque() + self.guard_character = 0x00 + + async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: + try: + # Check ROM name/patch version + rom_name = ((await bizhawk.read(ctx.bizhawk_ctx, [(rom_name_location, 0x0D, self.rom)]))[0]) + rom_name = rom_name.decode("ascii") + if rom_name != "FINAL FANTASY": + return False # Not a Final Fantasy 1 ROM + except bizhawk.RequestFailedError: + return False # Not able to get a response, say no for now + + ctx.game = self.game + ctx.items_handling = 0b111 + ctx.want_slot_data = True + # Resetting these in case of switching ROMs + self.consumable_stack_amounts = None + self.weapons_queue = deque() + self.armor_queue = deque() + + return True + + async def game_watcher(self, ctx: "BizHawkClientContext") -> None: + if ctx.server is None: + return + + if ctx.slot is None: + return + try: + self.guard_character = await self.read_sram_value(ctx, status_a_location) + # If the first character's name starts with a 0 value, we're at the title screen/character creation. + # In that case, don't allow any read/writes. + # We do this by setting the guard to 1 because that's neither a valid character nor the initial value. + if self.guard_character == 0: + self.guard_character = 0x01 + + if self.consumable_stack_amounts is None: + self.consumable_stack_amounts = {} + self.consumable_stack_amounts["Shard"] = 1 + other_consumable_amounts = await self.read_rom(ctx, 0x47400, 10) + self.consumable_stack_amounts["Tent"] = other_consumable_amounts[0] + 1 + self.consumable_stack_amounts["Cabin"] = other_consumable_amounts[1] + 1 + self.consumable_stack_amounts["House"] = other_consumable_amounts[2] + 1 + self.consumable_stack_amounts["Heal"] = other_consumable_amounts[3] + 1 + self.consumable_stack_amounts["Pure"] = other_consumable_amounts[4] + 1 + self.consumable_stack_amounts["Soft"] = other_consumable_amounts[5] + 1 + self.consumable_stack_amounts["Ext1"] = other_consumable_amounts[6] + 1 + self.consumable_stack_amounts["Ext2"] = other_consumable_amounts[7] + 1 + self.consumable_stack_amounts["Ext3"] = other_consumable_amounts[8] + 1 + self.consumable_stack_amounts["Ext4"] = other_consumable_amounts[9] + 1 + + await self.location_check(ctx) + await self.received_items_check(ctx) + await self.process_weapons_queue(ctx) + await self.process_armor_queue(ctx) + + except bizhawk.RequestFailedError: + # The connector didn't respond. Exit handler and return to main loop to reconnect + pass + + async def location_check(self, ctx: "BizHawkClientContext"): + locations_data = await self.read_sram_values_guarded(ctx, locations_array_start, locations_array_length) + if locations_data is None: + return + locations_checked = [] + if len(locations_data) > 0xFE and locations_data[0xFE] & 0x02 != 0 and not ctx.finished_game: + await ctx.send_msgs([ + {"cmd": "StatusUpdate", + "status": ClientStatus.CLIENT_GOAL} + ]) + ctx.finished_game = True + for location in ctx.missing_locations: + # index will be - 0x100 or 0x200 + index = location + if location < 0x200: + # Location is a chest + index -= 0x100 + flag = 0x04 + else: + # Location is an NPC + index -= 0x200 + flag = 0x02 + if locations_data[index] & flag != 0: + locations_checked.append(location) + + found_locations = await ctx.check_locations(locations_checked) + for location in found_locations: + ctx.locations_checked.add(location) + location_name = ctx.location_names.lookup_in_game(location) + logger.info( + f'New Check: {location_name} ({len(ctx.locations_checked)}/' + f'{len(ctx.missing_locations) + len(ctx.checked_locations)})') + + + async def received_items_check(self, ctx: "BizHawkClientContext") -> None: + assert self.consumable_stack_amounts, "shouldn't call this function without reading consumable_stack_amounts" + write_list: list[tuple[int, list[int], str]] = [] + items_received_count = await self.read_sram_value_guarded(ctx, items_obtained) + if items_received_count is None: + return + if items_received_count < len(ctx.items_received): + current_item = ctx.items_received[items_received_count] + current_item_id = current_item.item + current_item_name = ctx.item_names.lookup_in_game(current_item_id, ctx.game) + if current_item_name in key_items: + location = current_item_id - 0xE0 + write_list.append((location, [1], self.sram)) + elif current_item_name in movement_items: + location = current_item_id - 0x1E0 + if current_item_name != "Canal": + write_list.append((location, [1], self.sram)) + else: + write_list.append((location, [0], self.sram)) + elif current_item_name in no_overworld_items: + if current_item_name == "Sigil": + location = 0x28 + else: + location = 0x12 + write_list.append((location, [1], self.sram)) + elif current_item_name in gold_items: + gold_amount = int(current_item_name[4:]) + current_gold_value = await self.read_sram_values_guarded(ctx, gp_location_low, 3) + if current_gold_value is None: + return + current_gold = int.from_bytes(current_gold_value, "little") + new_gold = min(gold_amount + current_gold, 999999) + lower_byte = new_gold % (2 ** 8) + middle_byte = (new_gold // (2 ** 8)) % (2 ** 8) + upper_byte = new_gold // (2 ** 16) + write_list.append((gp_location_low, [lower_byte], self.sram)) + write_list.append((gp_location_middle, [middle_byte], self.sram)) + write_list.append((gp_location_high, [upper_byte], self.sram)) + elif current_item_name in consumables: + location = current_item_id - 0xE0 + current_value = await self.read_sram_value_guarded(ctx, location) + if current_value is None: + return + amount_to_add = self.consumable_stack_amounts[current_item_name] + new_value = min(current_value + amount_to_add, 99) + write_list.append((location, [new_value], self.sram)) + elif current_item_name in extended_consumables: + ext_name = ext_consumables_lookup[current_item_name] + location = ext_consumables_locations[ext_name] + current_value = await self.read_sram_value_guarded(ctx, location) + if current_value is None: + return + amount_to_add = self.consumable_stack_amounts[ext_name] + new_value = min(current_value + amount_to_add, 99) + write_list.append((location, [new_value], self.sram)) + elif current_item_name in weapons: + self.weapons_queue.appendleft(current_item_id - 0x11B) + elif current_item_name in armor: + self.armor_queue.appendleft(current_item_id - 0x143) + write_list.append((items_obtained, [items_received_count + 1], self.sram)) + write_successful = await self.write_sram_values_guarded(ctx, write_list) + if write_successful: + await bizhawk.display_message(ctx.bizhawk_ctx, f"Received {current_item_name}") + + async def process_weapons_queue(self, ctx: "BizHawkClientContext"): + empty_slots = deque() + char1_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[0], 4) + char2_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[1], 4) + char3_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[2], 4) + char4_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[3], 4) + if char1_slots is None or char2_slots is None or char3_slots is None or char4_slots is None: + return + for i, slot in enumerate(char1_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[0] + i) + for i, slot in enumerate(char2_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[1] + i) + for i, slot in enumerate(char3_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[2] + i) + for i, slot in enumerate(char4_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[3] + i) + while len(empty_slots) > 0 and len(self.weapons_queue) > 0: + current_slot = empty_slots.pop() + current_weapon = self.weapons_queue.pop() + await self.write_sram_guarded(ctx, current_slot, current_weapon) + + async def process_armor_queue(self, ctx: "BizHawkClientContext"): + empty_slots = deque() + char1_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[0], 4) + char2_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[1], 4) + char3_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[2], 4) + char4_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[3], 4) + if char1_slots is None or char2_slots is None or char3_slots is None or char4_slots is None: + return + for i, slot in enumerate(char1_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[0] + i) + for i, slot in enumerate(char2_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[1] + i) + for i, slot in enumerate(char3_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[2] + i) + for i, slot in enumerate(char4_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[3] + i) + while len(empty_slots) > 0 and len(self.armor_queue) > 0: + current_slot = empty_slots.pop() + current_armor = self.armor_queue.pop() + await self.write_sram_guarded(ctx, current_slot, current_armor) + + + async def read_sram_value(self, ctx: "BizHawkClientContext", location: int): + value = ((await bizhawk.read(ctx.bizhawk_ctx, [(location, 1, self.sram)]))[0]) + return int.from_bytes(value, "little") + + async def read_sram_values_guarded(self, ctx: "BizHawkClientContext", location: int, size: int): + value = await bizhawk.guarded_read(ctx.bizhawk_ctx, + [(location, size, self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + if value is None: + return None + return value[0] + + async def read_sram_value_guarded(self, ctx: "BizHawkClientContext", location: int): + value = await bizhawk.guarded_read(ctx.bizhawk_ctx, + [(location, 1, self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + if value is None: + return None + return int.from_bytes(value[0], "little") + + async def read_rom(self, ctx: "BizHawkClientContext", location: int, size: int): + return (await bizhawk.read(ctx.bizhawk_ctx, [(location, size, self.rom)]))[0] + + async def write_sram_guarded(self, ctx: "BizHawkClientContext", location: int, value: int): + return await bizhawk.guarded_write(ctx.bizhawk_ctx, + [(location, [value], self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + + async def write_sram_values_guarded(self, ctx: "BizHawkClientContext", write_list): + return await bizhawk.guarded_write(ctx.bizhawk_ctx, + write_list, + [(status_a_location, [self.guard_character], self.sram)]) diff --git a/worlds/ff1/Items.py b/worlds/ff1/Items.py index 469cf6f051..5d674a17b3 100644 --- a/worlds/ff1/Items.py +++ b/worlds/ff1/Items.py @@ -1,5 +1,5 @@ import json -from pathlib import Path +import pkgutil from typing import Dict, Set, NamedTuple, List from BaseClasses import Item, ItemClassification @@ -37,15 +37,13 @@ class FF1Items: _item_table_lookup: Dict[str, ItemData] = {} def _populate_item_table_from_data(self): - base_path = Path(__file__).parent - file_path = (base_path / "data/items.json").resolve() - with open(file_path) as file: - items = json.load(file) - # Hardcode progression and categories for now - self._item_table = [ItemData(name, code, "FF1Item", ItemClassification.progression if name in - FF1_PROGRESSION_LIST else ItemClassification.useful if name in FF1_USEFUL_LIST else - ItemClassification.filler) for name, code in items.items()] - self._item_table_lookup = {item.name: item for item in self._item_table} + file = pkgutil.get_data(__name__, "data/items.json").decode("utf-8") + items = json.loads(file) + # Hardcode progression and categories for now + self._item_table = [ItemData(name, code, "FF1Item", ItemClassification.progression if name in + FF1_PROGRESSION_LIST else ItemClassification.useful if name in FF1_USEFUL_LIST else + ItemClassification.filler) for name, code in items.items()] + self._item_table_lookup = {item.name: item for item in self._item_table} def _get_item_table(self) -> List[ItemData]: if not self._item_table or not self._item_table_lookup: diff --git a/worlds/ff1/Locations.py b/worlds/ff1/Locations.py index b0353f94fb..47facad985 100644 --- a/worlds/ff1/Locations.py +++ b/worlds/ff1/Locations.py @@ -1,5 +1,5 @@ import json -from pathlib import Path +import pkgutil from typing import Dict, NamedTuple, List, Optional from BaseClasses import Region, Location, MultiWorld @@ -18,13 +18,11 @@ class FF1Locations: _location_table_lookup: Dict[str, LocationData] = {} def _populate_item_table_from_data(self): - base_path = Path(__file__).parent - file_path = (base_path / "data/locations.json").resolve() - with open(file_path) as file: - locations = json.load(file) - # Hardcode progression and categories for now - self._location_table = [LocationData(name, code) for name, code in locations.items()] - self._location_table_lookup = {item.name: item for item in self._location_table} + file = pkgutil.get_data(__name__, "data/locations.json") + locations = json.loads(file) + # Hardcode progression and categories for now + self._location_table = [LocationData(name, code) for name, code in locations.items()] + self._location_table_lookup = {item.name: item for item in self._location_table} def _get_location_table(self) -> List[LocationData]: if not self._location_table or not self._location_table_lookup: diff --git a/worlds/ff1/__init__.py b/worlds/ff1/__init__.py index 3a50475068..39df9020e5 100644 --- a/worlds/ff1/__init__.py +++ b/worlds/ff1/__init__.py @@ -7,6 +7,7 @@ from .Items import ItemData, FF1Items, FF1_STARTER_ITEMS, FF1_PROGRESSION_LIST, from .Locations import EventId, FF1Locations, generate_rule, CHAOS_TERMINATED_EVENT from .Options import FF1Options from ..AutoWorld import World, WebWorld +from .Client import FF1Client class FF1Settings(settings.Group): diff --git a/worlds/ff1/docs/en_Final Fantasy.md b/worlds/ff1/docs/en_Final Fantasy.md index 889bb46e0c..a05aef63bc 100644 --- a/worlds/ff1/docs/en_Final Fantasy.md +++ b/worlds/ff1/docs/en_Final Fantasy.md @@ -22,11 +22,6 @@ All items can appear in other players worlds, including consumables, shards, wea ## What does another world's item look like in Final Fantasy -All local and remote items appear the same. Final Fantasy will say that you received an item, then BOTH the client log and the -emulator will display what was found external to the in-game text box. +All local and remote items appear the same. Final Fantasy will say that you received an item, then the client log will +display what was found external to the in-game text box. -## Unique Local Commands -The following commands are only available when using the FF1Client for the Final Fantasy Randomizer. - -- `/nes` Shows the current status of the NES connection. -- `/toggle_msgs` Toggle displaying messages in EmuHawk diff --git a/worlds/ff1/docs/multiworld_en.md b/worlds/ff1/docs/multiworld_en.md index d3dc457f01..1f1147bb31 100644 --- a/worlds/ff1/docs/multiworld_en.md +++ b/worlds/ff1/docs/multiworld_en.md @@ -2,10 +2,10 @@ ## Required Software -- The FF1Client - - Bundled with Archipelago: [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) -- The BizHawk emulator. Versions 2.3.1 and higher are supported. Version 2.7 is recommended - - [BizHawk at TASVideos](https://tasvideos.org/BizHawk) +- BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) + - Detailed installation instructions for BizHawk can be found at the above link. + - Windows users must run the prerequisite installer first, which can also be found at the above link. +- The built-in BizHawk client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) - Your legally obtained Final Fantasy (USA Edition) ROM file, probably named `Final Fantasy (USA).nes`. Neither Archipelago.gg nor the Final Fantasy Randomizer Community can supply you with this. @@ -13,7 +13,7 @@ 1. Download and install the latest version of Archipelago. 1. On Windows, download Setup.Archipelago..exe and run it -2. Assign EmuHawk version 2.3.1 or higher as your default program for launching `.nes` files. +2. Assign EmuHawk as your default program for launching `.nes` files. 1. Extract your BizHawk folder to your Desktop, or somewhere you will remember. Below are optional additional steps for loading ROMs more conveniently 1. Right-click on a ROM file and select **Open with...** @@ -46,7 +46,7 @@ please refer to the [game agnostic setup guide](/tutorial/Archipelago/setup/en). Once the Archipelago server has been hosted: -1. Navigate to your Archipelago install folder and run `ArchipelagoFF1Client.exe` +1. Navigate to your Archipelago install folder and run `ArchipelagoBizhawkClient.exe` 2. Notice the `/connect command` on the server hosting page (It should look like `/connect archipelago.gg:*****` where ***** are numbers) 3. Type the connect command into the client OR add the port to the pre-populated address on the top bar (it should @@ -54,16 +54,11 @@ Once the Archipelago server has been hosted: ### Running Your Game and Connecting to the Client Program -1. Open EmuHawk 2.3.1 or higher and load your ROM OR click your ROM file if it is already associated with the +1. Open EmuHawk and load your ROM OR click your ROM file if it is already associated with the extension `*.nes` -2. Navigate to where you installed Archipelago, then to `data/lua`, and drag+drop the `connector_ff1.lua` script onto - the main EmuHawk window. - 1. You could instead open the Lua Console manually, click `Script` 〉 `Open Script`, and navigate to - `connector_ff1.lua` with the file picker. - 2. If it gives a `NLua.Exceptions.LuaScriptException: .\socket.lua:13: module 'socket.core' not found:` exception - close your emulator entirely, restart it and re-run these steps - 3. If it says `Must use a version of BizHawk 2.3.1 or higher`, double-check your BizHawk version by clicking ** - Help** -> **About** +2. Navigate to where you installed Archipelago, then to `data/lua`, and drag+drop the `connector_bizhawk_generic.lua` +script onto the main EmuHawk window. You can also instead open the Lua Console manually, click `Script` 〉 `Open Script`, +and navigate to `connector_bizhawk_generic.lua` with the file picker. ## Play the game From 62694b1ce77f881e0b3915358d1ab9867502d7fc Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 22 May 2025 10:37:23 -0500 Subject: [PATCH 176/199] Launcher: Fix on File Drop Error Message (#5026) --- Launcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Launcher.py b/Launcher.py index 2520fd6b5f..8b533a505f 100644 --- a/Launcher.py +++ b/Launcher.py @@ -392,7 +392,7 @@ def run_gui(path: str, args: Any) -> None: if file and component: run_component(component, file) else: - logging.warning(f"unable to identify component for {file}") + logging.warning(f"unable to identify component for {filename}") def _on_keyboard(self, window: Window, key: int, scancode: int, codepoint: str, modifier: list[str]): # Activate search as soon as we start typing, no matter if we are focused on the search box or not. From 653ee2b625cc64461589abe3c836e87f3ca21bc3 Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Thu, 22 May 2025 15:00:30 -0400 Subject: [PATCH 177/199] Docs: Update Snippets to Modern Type Hints (#4987) --- docs/network protocol.md | 24 ++++++++++++------------ docs/options api.md | 2 +- docs/settings api.md | 11 +++++------ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/docs/network protocol.md b/docs/network protocol.md index 6688c101ab..8c07ff10fd 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -231,11 +231,11 @@ Sent to clients after a client requested this message be sent to them, more info Sent to clients if the server caught a problem with a packet. This only occurs for errors that are explicitly checked for. #### Arguments -| Name | Type | Notes | -| ---- | ---- | ----- | -| type | str | The [PacketProblemType](#PacketProblemType) that was detected in the packet. | -| original_cmd | Optional[str] | The `cmd` argument of the faulty packet, will be `None` if the `cmd` failed to be parsed. | -| text | str | A descriptive message of the problem at hand. | +| Name | Type | Notes | +| ---- |-------------| ----- | +| type | str | The [PacketProblemType](#PacketProblemType) that was detected in the packet. | +| original_cmd | str \| None | The `cmd` argument of the faulty packet, will be `None` if the `cmd` failed to be parsed. | +| text | str | A descriptive message of the problem at hand. | ##### PacketProblemType `PacketProblemType` indicates the type of problem that was detected in the faulty packet, the known problem types are below but others may be added in the future. @@ -551,14 +551,14 @@ In JSON this may look like: Message nodes sent along with [PrintJSON](#PrintJSON) packet to be reconstructed into a legible message. The nodes are intended to be read in the order they are listed in the packet. ```python -from typing import TypedDict, Optional +from typing import TypedDict class JSONMessagePart(TypedDict): - type: Optional[str] - text: Optional[str] - color: Optional[str] # only available if type is a color - flags: Optional[int] # only available if type is an item_id or item_name - player: Optional[int] # only available if type is either item or location - hint_status: Optional[HintStatus] # only available if type is hint_status + type: str | None + text: str | None + color: str | None # only available if type is a color + flags: int | None # only available if type is an item_id or item_name + player: int | None # only available if type is either item or location + hint_status: HintStatus | None # only available if type is hint_status ``` `type` is used to denote the intent of the message part. This can be used to indicate special information which may be rendered differently depending on client. How these types are displayed in Archipelago's ALttP client is not the end-all be-all. Other clients may choose to interpret and display these messages differently. diff --git a/docs/options api.md b/docs/options api.md index 037b9edb87..c9b7c422fe 100644 --- a/docs/options api.md +++ b/docs/options api.md @@ -333,7 +333,7 @@ within the world. ### TextChoice Like choice allows you to predetermine options and has all of the same comparison methods and handling. Also accepts any user defined string as a valid option, so will either need to be validated by adding a validation step to the option -class or within world, if necessary. Value for this class is `Union[str, int]` so if you need the value at a specified +class or within world, if necessary. Value for this class is `str | int` so if you need the value at a specified point, `self.options.my_option.current_key` will always return a string. ### PlandoBosses diff --git a/docs/settings api.md b/docs/settings api.md index bfc642d4b5..ef1f20d098 100644 --- a/docs/settings api.md +++ b/docs/settings api.md @@ -102,17 +102,16 @@ In worlds, this should only be used for the top level to avoid issues when upgra ### Bool -Since `bool` can not be subclassed, use the `settings.Bool` helper in a `typing.Union` to get a comment in host.yaml. +Since `bool` can not be subclassed, use the `settings.Bool` helper in a union to get a comment in host.yaml. ```python import settings -import typing class MySettings(settings.Group): class MyBool(settings.Bool): """Doc string""" - my_value: typing.Union[MyBool, bool] = True + my_value: MyBool | bool = True ``` ### UserFilePath @@ -134,15 +133,15 @@ Checks the file against [md5s](#md5s) by default. Resolves to an executable (varying file extension based on platform) -#### description: Optional\[str\] +#### description: str | None Human-readable name to use in file browser -#### copy_to: Optional\[str\] +#### copy_to: str | None Instead of storing the path, copy the file. -#### md5s: List[Union[str, bytes]] +#### md5s: list[str | bytes] Provide md5 hashes as hex digests or raw bytes for automatic validation. From de71677208f43730ce62191290901759363e407c Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 22 May 2025 21:30:30 +0200 Subject: [PATCH 178/199] Core: only raise min_client_version for new gens (#4896) --- MultiServer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MultiServer.py b/MultiServer.py index 9bcf8f6f4c..f12f327c3f 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -458,8 +458,12 @@ class Context: self.generator_version = Version(*decoded_obj["version"]) clients_ver = decoded_obj["minimum_versions"].get("clients", {}) self.minimum_client_versions = {} + if self.generator_version < Version(0, 6, 2): + min_version = Version(0, 1, 6) + else: + min_version = min_client_version for player, version in clients_ver.items(): - self.minimum_client_versions[player] = max(Version(*version), min_client_version) + self.minimum_client_versions[player] = max(Version(*version), min_version) self.slot_info = decoded_obj["slot_info"] self.games = {slot: slot_info.game for slot, slot_info in self.slot_info.items()} From 5491f8c4598b93c179761014c5d4d6fc7ee3ed62 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 22 May 2025 21:28:56 -0500 Subject: [PATCH 179/199] Core: Make `get_all_state` Sweeping Optional (#4828) --- BaseClasses.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 377dee7d63..1a06ef6b73 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -439,7 +439,7 @@ class MultiWorld(): return self.regions.location_cache[player][location_name] def get_all_state(self, use_cache: bool, allow_partial_entrances: bool = False, - collect_pre_fill_items: bool = True) -> CollectionState: + collect_pre_fill_items: bool = True, perform_sweep: bool = True) -> CollectionState: cached = getattr(self, "_all_state", None) if use_cache and cached: return cached.copy() @@ -453,7 +453,8 @@ class MultiWorld(): subworld = self.worlds[player] for item in subworld.get_pre_fill_items(): subworld.collect(ret, item) - ret.sweep_for_advancements() + if perform_sweep: + ret.sweep_for_advancements() if use_cache: self._all_state = ret From e9f51e330211743f52d20a9a1b570da8db4db6af Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Fri, 23 May 2025 19:26:37 +0000 Subject: [PATCH 180/199] Linux: avoid adding cwd to LD_LIBRARY_PATH (#5029) When LD_LIBRARY_PATH is not set, the old code would also add the current working directory to LD_LIBRARY_PATH, which is bad. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a46b1e8ce5..959746717a 100644 --- a/setup.py +++ b/setup.py @@ -481,7 +481,7 @@ tmp="${{exe#*/}}" if [ ! "${{#tmp}}" -lt "${{#exe}}" ]; then exe="{default_exe.parent}/$exe" fi -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$APPDIR/{default_exe.parent}/lib" +export LD_LIBRARY_PATH="${{LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}}$APPDIR/{default_exe.parent}/lib" $APPDIR/$exe "$@" """) launcher_filename.chmod(0o755) From a7de89f45cadb885ee01a6216af836a34bc8b843 Mon Sep 17 00:00:00 2001 From: BlastSlimey <89539656+BlastSlimey@users.noreply.github.com> Date: Fri, 23 May 2025 21:41:27 +0200 Subject: [PATCH 181/199] shapez: Add game to README and CODEOWNERS (#5034) * Aktualisieren von README.md * Aktualisieren von CODEOWNERS --- README.md | 1 + docs/CODEOWNERS | 3 +++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 84e62b1528..9ce6caf0cf 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Currently, the following games are supported: * The Legend of Zelda: The Wind Waker * Jak and Daxter: The Precursor Legacy * Super Mario Land 2: 6 Golden Coins +* shapez For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 2289daad07..1fb5578e99 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -160,6 +160,9 @@ # Saving Princess /worlds/saving_princess/ @LeonarthCG +# shapez +/worlds/shapez/ @BlastSlimey + # Shivers /worlds/shivers/ @GodlFire @korydondzila From 8671e9a39150d1efa41e04e12f00edecf916bb28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Fri, 23 May 2025 15:52:47 -0400 Subject: [PATCH 182/199] Stardew Valley: Make animal catalog logically year 2 (#5032) --- worlds/stardew_valley/content/vanilla/pelican_town.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/stardew_valley/content/vanilla/pelican_town.py b/worlds/stardew_valley/content/vanilla/pelican_town.py index aeae4c1431..d1d024b54c 100644 --- a/worlds/stardew_valley/content/vanilla/pelican_town.py +++ b/worlds/stardew_valley/content/vanilla/pelican_town.py @@ -3,7 +3,7 @@ from ...data import villagers_data, fish_data from ...data.building import Building from ...data.game_item import GenericSource, ItemTag, Tag, CustomRuleSource from ...data.harvest import ForagingSource, SeasonalForagingSource, ArtifactSpotSource -from ...data.requirement import ToolRequirement, BookRequirement, SkillRequirement +from ...data.requirement import ToolRequirement, BookRequirement, SkillRequirement, YearRequirement from ...data.shop import ShopSource, MysteryBoxSource, ArtifactTroveSource, PrizeMachineSource, FishingTreasureChestSource from ...strings.artisan_good_names import ArtisanGood from ...strings.book_names import Book @@ -209,7 +209,7 @@ pelican_town = ContentPack( # Books Book.animal_catalogue: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), - ShopSource(money_price=5000, shop_region=Region.ranch),), + ShopSource(money_price=5000, shop_region=Region.ranch, other_requirements=(YearRequirement(2),)),), Book.book_of_mysteries: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), MysteryBoxSource(amount=38),), # After 38 boxes, there are 49.99% chances player received the book. From 13ca134d125d573af1394512a0ef4f78d60f0e7e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 23 May 2025 23:47:21 +0200 Subject: [PATCH 183/199] Core: Fix a playthrough crash when a world uses "placement based logic" (#3915) * Fix playthrough * oops * oops 2 * I don't like this * that should do it * Update BaseClasses.py Co-authored-by: Doug Hoskisson * Update BaseClasses.py --------- Co-authored-by: Doug Hoskisson --- BaseClasses.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 1a06ef6b73..1de23bc1ea 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -559,7 +559,9 @@ class MultiWorld(): else: return all((self.has_beaten_game(state, p) for p in range(1, self.players + 1))) - def can_beat_game(self, starting_state: Optional[CollectionState] = None) -> bool: + def can_beat_game(self, + starting_state: Optional[CollectionState] = None, + locations: Optional[Iterable[Location]] = None) -> bool: if starting_state: if self.has_beaten_game(starting_state): return True @@ -568,7 +570,9 @@ class MultiWorld(): state = CollectionState(self) if self.has_beaten_game(state): return True - prog_locations = {location for location in self.get_locations() if location.item + + base_locations = self.get_locations() if locations is None else locations + prog_locations = {location for location in base_locations if location.item and location.item.advancement and location not in state.locations_checked} while prog_locations: @@ -1603,21 +1607,19 @@ class Spoiler: # in the second phase, we cull each sphere such that the game is still beatable, # reducing each range of influence to the bare minimum required inside it - restore_later: Dict[Location, Item] = {} + required_locations = {location for sphere in collection_spheres for location in sphere} for num, sphere in reversed(tuple(enumerate(collection_spheres))): to_delete: Set[Location] = set() for location in sphere: - # we remove the item at location and check if game is still beatable + # we remove the location from required_locations to sweep from, and check if the game is still beatable logging.debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player) - old_item = location.item - location.item = None - if multiworld.can_beat_game(state_cache[num]): + required_locations.remove(location) + if multiworld.can_beat_game(state_cache[num], required_locations): to_delete.add(location) - restore_later[location] = old_item else: # still required, got to keep it around - location.item = old_item + required_locations.add(location) # cull entries in spheres for spoiler walkthrough at end sphere -= to_delete @@ -1634,7 +1636,7 @@ class Spoiler: logging.debug('Checking if %s (Player %d) is required to beat the game.', item.name, item.player) precollected_items.remove(item) multiworld.state.remove(item) - if not multiworld.can_beat_game(): + if not multiworld.can_beat_game(multiworld.state, required_locations): # Add the item back into `precollected_items` and collect it into `multiworld.state`. multiworld.push_precollected(item) else: @@ -1676,9 +1678,6 @@ class Spoiler: self.create_paths(state, collection_spheres) # repair the multiworld again - for location, item in restore_later.items(): - location.item = item - for item in removed_precollected: multiworld.push_precollected(item) From 0a7aa9e3e2a1a9aea371a471f6102e554a042bd4 Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 23 May 2025 17:02:50 -0500 Subject: [PATCH 184/199] Launcher: skip launcher gui when opening webhost list with no game handlers (#4888) * calc relevant components before opening the launcher app so it can be skipped for text client only uri launches * generically passthrough the url arg * Apply suggestions from code review Co-authored-by: Aaron Wagener * flip if not else * Update Launcher.py * pluralize --------- Co-authored-by: Aaron Wagener --- Launcher.py | 58 ++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/Launcher.py b/Launcher.py index 8b533a505f..e9751f2c23 100644 --- a/Launcher.py +++ b/Launcher.py @@ -115,34 +115,30 @@ components.extend([ ]) -def handle_uri(path: str, launch_args: tuple[str, ...]) -> None: +def handle_uri(path: str) -> tuple[list[Component], Component]: url = urllib.parse.urlparse(path) queries = urllib.parse.parse_qs(url.query) - launch_args = (path, *launch_args) - client_component = [] + client_components = [] text_client_component = None game = queries["game"][0] for component in components: if component.supports_uri and component.game_name == game: - client_component.append(component) + client_components.append(component) elif component.display_name == "Text Client": text_client_component = component + return client_components, text_client_component - if not client_component: - run_component(text_client_component, *launch_args) - return - else: - from kvui import ButtonsPrompt - component_options = { - text_client_component.display_name: text_client_component, - **{component.display_name: component for component in client_component} - } - popup = ButtonsPrompt("Connect to Multiworld", - "Select client to open and connect with.", - lambda component_name: run_component(component_options[component_name], *launch_args), - *component_options.keys()) - popup.open() +def build_uri_popup(component_list: list[Component], launch_args: tuple[str, ...]) -> None: + from kvui import ButtonsPrompt + component_options = { + component.display_name: component for component in component_list + } + popup = ButtonsPrompt("Connect to Multiworld", + "Select client to open and connect with.", + lambda component_name: run_component(component_options[component_name], *launch_args), + *component_options.keys()) + popup.open() def identify(path: None | str) -> tuple[None | str, None | Component]: @@ -212,7 +208,7 @@ def create_shortcut(button: Any, component: Component) -> None: refresh_components: Callable[[], None] | None = None -def run_gui(path: str, args: Any) -> None: +def run_gui(launch_components: list[Component], args: Any) -> None: from kvui import (ThemedApp, MDFloatLayout, MDGridLayout, ScrollBox) from kivy.properties import ObjectProperty from kivy.core.window import Window @@ -245,12 +241,12 @@ def run_gui(path: str, args: Any) -> None: cards: list[LauncherCard] current_filter: Sequence[str | Type] | None - def __init__(self, ctx=None, path=None, args=None): + def __init__(self, ctx=None, components=None, args=None): self.title = self.base_title + " " + Utils.__version__ self.ctx = ctx self.icon = r"data/icon.png" self.favorites = [] - self.launch_uri = path + self.launch_components = components self.launch_args = args self.cards = [] self.current_filter = (Type.CLIENT, Type.TOOL, Type.ADJUSTER, Type.MISC) @@ -372,9 +368,9 @@ def run_gui(path: str, args: Any) -> None: return self.top_screen def on_start(self): - if self.launch_uri: - handle_uri(self.launch_uri, self.launch_args) - self.launch_uri = None + if self.launch_components: + build_uri_popup(self.launch_components, self.launch_args) + self.launch_components = None self.launch_args = None @staticmethod @@ -415,7 +411,7 @@ def run_gui(path: str, args: Any) -> None: for filter in self.current_filter)) super().on_stop() - Launcher(path=path, args=args).run() + Launcher(components=launch_components, args=args).run() # avoiding Launcher reference leak # and don't try to do something with widgets after window closed @@ -442,7 +438,15 @@ def main(args: argparse.Namespace | dict | None = None): path = args.get("Patch|Game|Component|url", None) if path is not None: - if not path.startswith("archipelago://"): + if path.startswith("archipelago://"): + args["args"] = (path, *args.get("args", ())) + # add the url arg to the passthrough args + components, text_client_component = handle_uri(path) + if not components: + args["component"] = text_client_component + else: + args['launch_components'] = [text_client_component, *components] + else: file, component = identify(path) if file: args['file'] = file @@ -458,7 +462,7 @@ def main(args: argparse.Namespace | dict | None = None): elif "component" in args: run_component(args["component"], *args["args"]) elif not args["update_settings"]: - run_gui(path, args.get("args", ())) + run_gui(args.get("launch_components", None), args.get("args", ())) if __name__ == '__main__': From e82d50a3c5cdc67091a42059f922520dec691f9c Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Fri, 23 May 2025 17:13:34 -0500 Subject: [PATCH 185/199] The Messenger: more generous portal validation (#5011) * The Messenger: more generous portal validation * remove the while and just go for 20 attempts. hopefully that's enough --- worlds/messenger/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index e403ff59d8..88a0cec2ca 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -281,7 +281,7 @@ class MessengerWorld(World): disconnect_entrances(self) add_closed_portal_reqs(self) # i need portal shuffle to happen after rules exist so i can validate it - attempts = 5 + attempts = 20 if self.options.shuffle_portals: self.portal_mapping = [] self.spoiler_portal_mapping = {} From c64791e3a8b0c51378182ad12da8d6f2a72e132e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 24 May 2025 01:15:41 -0400 Subject: [PATCH 186/199] Stardew Valley: Replace current naive entrance rando with GER (#4624) --- worlds/stardew_valley/__init__.py | 25 +- worlds/stardew_valley/content/mods/sve.py | 21 +- worlds/stardew_valley/mods/logic/sve_logic.py | 3 +- .../mods/{mod_regions.py => region_data.py} | 298 +++---- worlds/stardew_valley/region_classes.py | 67 -- worlds/stardew_valley/regions.py | 775 ------------------ worlds/stardew_valley/regions/__init__.py | 2 + .../stardew_valley/regions/entrance_rando.py | 73 ++ worlds/stardew_valley/regions/model.py | 94 +++ worlds/stardew_valley/regions/mods.py | 46 ++ worlds/stardew_valley/regions/regions.py | 61 ++ worlds/stardew_valley/regions/vanilla_data.py | 522 ++++++++++++ worlds/stardew_valley/test/TestRegions.py | 173 ---- .../test/assertion/rule_assert.py | 12 +- worlds/stardew_valley/test/bases.py | 7 +- worlds/stardew_valley/test/mods/TestMods.py | 39 +- .../regions/TestEntranceClassifications.py | 36 + .../test/regions/TestEntranceRandomization.py | 167 ++++ .../test/regions/TestRandomizationFlag.py | 88 ++ .../test/regions/TestRegionConnections.py | 66 ++ .../stardew_valley/test/regions/__init__.py | 0 21 files changed, 1351 insertions(+), 1224 deletions(-) rename worlds/stardew_valley/mods/{mod_regions.py => region_data.py} (61%) delete mode 100644 worlds/stardew_valley/region_classes.py delete mode 100644 worlds/stardew_valley/regions.py create mode 100644 worlds/stardew_valley/regions/__init__.py create mode 100644 worlds/stardew_valley/regions/entrance_rando.py create mode 100644 worlds/stardew_valley/regions/model.py create mode 100644 worlds/stardew_valley/regions/mods.py create mode 100644 worlds/stardew_valley/regions/regions.py create mode 100644 worlds/stardew_valley/regions/vanilla_data.py delete mode 100644 worlds/stardew_valley/test/TestRegions.py create mode 100644 worlds/stardew_valley/test/regions/TestEntranceClassifications.py create mode 100644 worlds/stardew_valley/test/regions/TestEntranceRandomization.py create mode 100644 worlds/stardew_valley/test/regions/TestRandomizationFlag.py create mode 100644 worlds/stardew_valley/test/regions/TestRegionConnections.py create mode 100644 worlds/stardew_valley/test/regions/__init__.py diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 9a05c04d51..ea0ce9e123 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,9 +1,10 @@ import logging import typing from random import Random -from typing import Dict, Any, Iterable, Optional, List, TextIO +from typing import Dict, Any, Optional, List, TextIO -from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +import entrance_rando +from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState from Options import PerGameCommonOptions from worlds.AutoWorld import World, WebWorld from .bundles.bundle_room import BundleRoom @@ -21,7 +22,7 @@ from .options.forced_options import force_change_options_if_incompatible from .options.option_groups import sv_option_groups from .options.presets import sv_options_presets from .options.worlds_group import apply_most_restrictive_options -from .regions import create_regions +from .regions import create_regions, prepare_mod_data from .rules import set_rules from .stardew_rule import True_, StardewRule, HasProgressionPercent from .strings.ap_names.event_names import Event @@ -124,18 +125,13 @@ class StardewValleyWorld(World): self.content = create_content(self.options) def create_regions(self): - def create_region(name: str, exits: Iterable[str]) -> Region: - region = Region(name, self.player, self.multiworld) - region.exits = [Entrance(self.player, exit_name, region) for exit_name in exits] - return region + def create_region(name: str) -> Region: + return Region(name, self.player, self.multiworld) - world_regions, world_entrances, self.randomized_entrances = create_regions(create_region, self.random, self.options, self.content) + world_regions = create_regions(create_region, self.options, self.content) self.logic = StardewLogic(self.player, self.options, self.content, world_regions.keys()) - self.modified_bundles = get_all_bundles(self.random, - self.logic, - self.content, - self.options) + self.modified_bundles = get_all_bundles(self.random, self.logic, self.content, self.options) def add_location(name: str, code: Optional[int], region: str): region: Region = world_regions[region] @@ -308,6 +304,11 @@ class StardewValleyWorld(World): def set_rules(self): set_rules(self) + def connect_entrances(self) -> None: + no_target_groups = {0: [0]} + placement = entrance_rando.randomize_entrances(self, coupled=True, target_group_lookup=no_target_groups) + self.randomized_entrances = prepare_mod_data(placement) + def generate_basic(self): pass diff --git a/worlds/stardew_valley/content/mods/sve.py b/worlds/stardew_valley/content/mods/sve.py index 12b3e3558a..2c9edc8106 100644 --- a/worlds/stardew_valley/content/mods/sve.py +++ b/worlds/stardew_valley/content/mods/sve.py @@ -24,6 +24,9 @@ from ...strings.skill_names import Skill from ...strings.tool_names import Tool, ToolMaterial from ...strings.villager_names import ModNPC +# Used to adapt content not yet moved to content packs to easily detect when SVE and Ginger Island are both enabled. +SVE_GINGER_ISLAND_PACK = ModNames.sve + "+" + ginger_island_content_pack.name + class SVEContentPack(ContentPack): @@ -67,6 +70,10 @@ class SVEContentPack(ContentPack): content.game_items.pop(SVESeed.slime) content.game_items.pop(SVEFruit.slime_berry) + def finalize_hook(self, content: StardewContent): + if ginger_island_content_pack.name in content.registered_packs: + content.registered_packs.add(SVE_GINGER_ISLAND_PACK) + register_mod_content_pack(SVEContentPack( ModNames.sve, @@ -80,8 +87,9 @@ register_mod_content_pack(SVEContentPack( ModEdible.lightning_elixir: (ShopSource(money_price=12000, shop_region=SVERegion.galmoran_outpost),), ModEdible.barbarian_elixir: (ShopSource(money_price=22000, shop_region=SVERegion.galmoran_outpost),), ModEdible.gravity_elixir: (ShopSource(money_price=4000, shop_region=SVERegion.galmoran_outpost),), - SVEMeal.grampleton_orange_chicken: ( - ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), + SVEMeal.grampleton_orange_chicken: (ShopSource(money_price=650, + shop_region=Region.saloon, + other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), ModEdible.hero_elixir: (ShopSource(money_price=8000, shop_region=SVERegion.isaac_shop),), ModEdible.aegis_elixir: (ShopSource(money_price=28000, shop_region=SVERegion.galmoran_outpost),), SVEBeverage.sports_drink: (ShopSource(money_price=750, shop_region=Region.hospital),), @@ -118,8 +126,8 @@ register_mod_content_pack(SVEContentPack( ModLoot.green_mushroom: (ForagingSource(regions=(SVERegion.highlands_pond,), seasons=Season.not_winter),), ModLoot.ornate_treasure_chest: (ForagingSource(regions=(SVERegion.highlands_outside,), - other_requirements=( - CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),), + other_requirements=(CombatRequirement(Performance.galaxy), + ToolRequirement(Tool.axe, ToolMaterial.iron))),), ModLoot.swirl_stone: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.galaxy),)),), ModLoot.void_soul: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.good),)),), SVEForage.winter_star_rose: (ForagingSource(regions=(SVERegion.summit,), seasons=(Season.winter,)),), @@ -139,8 +147,9 @@ register_mod_content_pack(SVEContentPack( SVEForage.thistle: (ForagingSource(regions=(SVERegion.summit,)),), ModLoot.void_pebble: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.great),)),), ModLoot.void_shard: (ForagingSource(regions=(SVERegion.crimson_badlands,), - other_requirements=( - CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),), + other_requirements=(CombatRequirement(Performance.galaxy), + SkillRequirement(Skill.combat, 10), + YearRequirement(3),)),), SVEWaterItem.dulse_seaweed: (ForagingSource(regions=(Region.beach,), other_requirements=(FishingRequirement(Region.beach),)),), # Fable Reef diff --git a/worlds/stardew_valley/mods/logic/sve_logic.py b/worlds/stardew_valley/mods/logic/sve_logic.py index 7f0c12bc4f..03f1737c59 100644 --- a/worlds/stardew_valley/mods/logic/sve_logic.py +++ b/worlds/stardew_valley/mods/logic/sve_logic.py @@ -1,8 +1,7 @@ -from ..mod_regions import SVERegion from ...logic.base_logic import BaseLogicMixin, BaseLogic from ...strings.ap_names.mods.mod_items import SVELocation, SVERunes, SVEQuestItem from ...strings.quest_names import Quest, ModQuest -from ...strings.region_names import Region +from ...strings.region_names import Region, SVERegion from ...strings.tool_names import Tool, ToolMaterial from ...strings.wallet_item_names import Wallet diff --git a/worlds/stardew_valley/mods/mod_regions.py b/worlds/stardew_valley/mods/region_data.py similarity index 61% rename from worlds/stardew_valley/mods/mod_regions.py rename to worlds/stardew_valley/mods/region_data.py index a402ba6068..5dc4a3dff2 100644 --- a/worlds/stardew_valley/mods/mod_regions.py +++ b/worlds/stardew_valley/mods/region_data.py @@ -1,15 +1,14 @@ -from typing import Dict, List - from .mod_data import ModNames -from ..region_classes import RegionData, ConnectionData, ModificationFlag, RandomizationFlag, ModRegionData +from ..content.mods.sve import SVE_GINGER_ISLAND_PACK +from ..regions.model import RegionData, ConnectionData, MergeFlag, RandomizationFlag, ModRegionsData from ..strings.entrance_names import Entrance, DeepWoodsEntrance, EugeneEntrance, LaceyEntrance, BoardingHouseEntrance, \ JasperEntrance, AlecEntrance, YobaEntrance, JunaEntrance, MagicEntrance, AyeishaEntrance, RileyEntrance, SVEEntrance, AlectoEntrance from ..strings.region_names import Region, DeepWoodsRegion, EugeneRegion, JasperRegion, BoardingHouseRegion, \ AlecRegion, YobaRegion, JunaRegion, MagicRegion, AyeishaRegion, RileyRegion, SVERegion, AlectoRegion, LaceyRegion deep_woods_regions = [ - RegionData(Region.farm, [DeepWoodsEntrance.use_woods_obelisk]), - RegionData(DeepWoodsRegion.woods_obelisk_menu, [DeepWoodsEntrance.deep_woods_depth_1, + RegionData(Region.farm, (DeepWoodsEntrance.use_woods_obelisk,)), + RegionData(DeepWoodsRegion.woods_obelisk_menu, (DeepWoodsEntrance.deep_woods_depth_1, DeepWoodsEntrance.deep_woods_depth_10, DeepWoodsEntrance.deep_woods_depth_20, DeepWoodsEntrance.deep_woods_depth_30, @@ -19,9 +18,9 @@ deep_woods_regions = [ DeepWoodsEntrance.deep_woods_depth_70, DeepWoodsEntrance.deep_woods_depth_80, DeepWoodsEntrance.deep_woods_depth_90, - DeepWoodsEntrance.deep_woods_depth_100]), - RegionData(Region.secret_woods, [DeepWoodsEntrance.secret_woods_to_deep_woods]), - RegionData(DeepWoodsRegion.main_lichtung, [DeepWoodsEntrance.deep_woods_house]), + DeepWoodsEntrance.deep_woods_depth_100)), + RegionData(Region.secret_woods, (DeepWoodsEntrance.secret_woods_to_deep_woods,)), + RegionData(DeepWoodsRegion.main_lichtung, (DeepWoodsEntrance.deep_woods_house,)), RegionData(DeepWoodsRegion.abandoned_home), RegionData(DeepWoodsRegion.floor_10), RegionData(DeepWoodsRegion.floor_20), @@ -32,14 +31,13 @@ deep_woods_regions = [ RegionData(DeepWoodsRegion.floor_70), RegionData(DeepWoodsRegion.floor_80), RegionData(DeepWoodsRegion.floor_90), - RegionData(DeepWoodsRegion.floor_100) + RegionData(DeepWoodsRegion.floor_100), ] deep_woods_entrances = [ ConnectionData(DeepWoodsEntrance.use_woods_obelisk, DeepWoodsRegion.woods_obelisk_menu), ConnectionData(DeepWoodsEntrance.secret_woods_to_deep_woods, DeepWoodsRegion.main_lichtung), - ConnectionData(DeepWoodsEntrance.deep_woods_house, DeepWoodsRegion.abandoned_home, - flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(DeepWoodsEntrance.deep_woods_house, DeepWoodsRegion.abandoned_home, flag=RandomizationFlag.BUILDINGS), ConnectionData(DeepWoodsEntrance.deep_woods_depth_1, DeepWoodsRegion.main_lichtung), ConnectionData(DeepWoodsEntrance.deep_woods_depth_10, DeepWoodsRegion.floor_10), ConnectionData(DeepWoodsEntrance.deep_woods_depth_20, DeepWoodsRegion.floor_20), @@ -50,165 +48,166 @@ deep_woods_entrances = [ ConnectionData(DeepWoodsEntrance.deep_woods_depth_70, DeepWoodsRegion.floor_70), ConnectionData(DeepWoodsEntrance.deep_woods_depth_80, DeepWoodsRegion.floor_80), ConnectionData(DeepWoodsEntrance.deep_woods_depth_90, DeepWoodsRegion.floor_90), - ConnectionData(DeepWoodsEntrance.deep_woods_depth_100, DeepWoodsRegion.floor_100) + ConnectionData(DeepWoodsEntrance.deep_woods_depth_100, DeepWoodsRegion.floor_100), ] eugene_regions = [ - RegionData(Region.forest, [EugeneEntrance.forest_to_garden]), - RegionData(EugeneRegion.eugene_garden, [EugeneEntrance.garden_to_bedroom]), - RegionData(EugeneRegion.eugene_bedroom) + RegionData(Region.forest, (EugeneEntrance.forest_to_garden,)), + RegionData(EugeneRegion.eugene_garden, (EugeneEntrance.garden_to_bedroom,)), + RegionData(EugeneRegion.eugene_bedroom), ] eugene_entrances = [ ConnectionData(EugeneEntrance.forest_to_garden, EugeneRegion.eugene_garden, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(EugeneEntrance.garden_to_bedroom, EugeneRegion.eugene_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(EugeneEntrance.garden_to_bedroom, EugeneRegion.eugene_bedroom, flag=RandomizationFlag.BUILDINGS), ] magic_regions = [ - RegionData(Region.pierre_store, [MagicEntrance.store_to_altar]), - RegionData(MagicRegion.altar) + RegionData(Region.pierre_store, (MagicEntrance.store_to_altar,)), + RegionData(MagicRegion.altar), ] magic_entrances = [ - ConnectionData(MagicEntrance.store_to_altar, MagicRegion.altar, flag=RandomizationFlag.NOT_RANDOMIZED) + ConnectionData(MagicEntrance.store_to_altar, MagicRegion.altar, flag=RandomizationFlag.NOT_RANDOMIZED), ] jasper_regions = [ - RegionData(Region.museum, [JasperEntrance.museum_to_bedroom]), - RegionData(JasperRegion.jasper_bedroom) + RegionData(Region.museum, (JasperEntrance.museum_to_bedroom,)), + RegionData(JasperRegion.jasper_bedroom), ] jasper_entrances = [ - ConnectionData(JasperEntrance.museum_to_bedroom, JasperRegion.jasper_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(JasperEntrance.museum_to_bedroom, JasperRegion.jasper_bedroom, flag=RandomizationFlag.BUILDINGS), ] alec_regions = [ - RegionData(Region.forest, [AlecEntrance.forest_to_petshop]), - RegionData(AlecRegion.pet_store, [AlecEntrance.petshop_to_bedroom]), - RegionData(AlecRegion.alec_bedroom) + RegionData(Region.forest, (AlecEntrance.forest_to_petshop,)), + RegionData(AlecRegion.pet_store, (AlecEntrance.petshop_to_bedroom,)), + RegionData(AlecRegion.alec_bedroom), ] alec_entrances = [ ConnectionData(AlecEntrance.forest_to_petshop, AlecRegion.pet_store, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(AlecEntrance.petshop_to_bedroom, AlecRegion.alec_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(AlecEntrance.petshop_to_bedroom, AlecRegion.alec_bedroom, flag=RandomizationFlag.BUILDINGS), ] yoba_regions = [ - RegionData(Region.secret_woods, [YobaEntrance.secret_woods_to_clearing]), - RegionData(YobaRegion.yoba_clearing) + RegionData(Region.secret_woods, (YobaEntrance.secret_woods_to_clearing,)), + RegionData(YobaRegion.yoba_clearing), ] yoba_entrances = [ - ConnectionData(YobaEntrance.secret_woods_to_clearing, YobaRegion.yoba_clearing, flag=RandomizationFlag.BUILDINGS) + ConnectionData(YobaEntrance.secret_woods_to_clearing, YobaRegion.yoba_clearing, flag=RandomizationFlag.BUILDINGS), ] juna_regions = [ - RegionData(Region.forest, [JunaEntrance.forest_to_juna_cave]), - RegionData(JunaRegion.juna_cave) + RegionData(Region.forest, (JunaEntrance.forest_to_juna_cave,)), + RegionData(JunaRegion.juna_cave), ] juna_entrances = [ ConnectionData(JunaEntrance.forest_to_juna_cave, JunaRegion.juna_cave, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] ayeisha_regions = [ - RegionData(Region.bus_stop, [AyeishaEntrance.bus_stop_to_mail_van]), - RegionData(AyeishaRegion.mail_van) + RegionData(Region.bus_stop, (AyeishaEntrance.bus_stop_to_mail_van,)), + RegionData(AyeishaRegion.mail_van), ] ayeisha_entrances = [ ConnectionData(AyeishaEntrance.bus_stop_to_mail_van, AyeishaRegion.mail_van, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] riley_regions = [ - RegionData(Region.town, [RileyEntrance.town_to_riley]), - RegionData(RileyRegion.riley_house) + RegionData(Region.town, (RileyEntrance.town_to_riley,)), + RegionData(RileyRegion.riley_house), ] riley_entrances = [ ConnectionData(RileyEntrance.town_to_riley, RileyRegion.riley_house, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] -stardew_valley_expanded_regions = [ - RegionData(Region.backwoods, [SVEEntrance.backwoods_to_grove]), - RegionData(SVERegion.enchanted_grove, [SVEEntrance.grove_to_outpost_warp, SVEEntrance.grove_to_wizard_warp, +sve_main_land_regions = [ + RegionData(Region.backwoods, (SVEEntrance.backwoods_to_grove,)), + RegionData(SVERegion.enchanted_grove, (SVEEntrance.grove_to_outpost_warp, SVEEntrance.grove_to_wizard_warp, SVEEntrance.grove_to_farm_warp, SVEEntrance.grove_to_guild_warp, SVEEntrance.grove_to_junimo_warp, - SVEEntrance.grove_to_spring_warp, SVEEntrance.grove_to_aurora_warp]), - RegionData(SVERegion.grove_farm_warp, [SVEEntrance.farm_warp_to_farm]), - RegionData(SVERegion.grove_aurora_warp, [SVEEntrance.aurora_warp_to_aurora]), - RegionData(SVERegion.grove_guild_warp, [SVEEntrance.guild_warp_to_guild]), - RegionData(SVERegion.grove_junimo_warp, [SVEEntrance.junimo_warp_to_junimo]), - RegionData(SVERegion.grove_spring_warp, [SVEEntrance.spring_warp_to_spring]), - RegionData(SVERegion.grove_outpost_warp, [SVEEntrance.outpost_warp_to_outpost]), - RegionData(SVERegion.grove_wizard_warp, [SVEEntrance.wizard_warp_to_wizard]), - RegionData(SVERegion.galmoran_outpost, [SVEEntrance.outpost_to_badlands_entrance, SVEEntrance.use_alesia_shop, - SVEEntrance.use_isaac_shop]), - RegionData(SVERegion.badlands_entrance, [SVEEntrance.badlands_entrance_to_badlands]), - RegionData(SVERegion.crimson_badlands, [SVEEntrance.badlands_to_cave]), + SVEEntrance.grove_to_spring_warp, SVEEntrance.grove_to_aurora_warp)), + RegionData(SVERegion.grove_farm_warp, (SVEEntrance.farm_warp_to_farm,)), + RegionData(SVERegion.grove_aurora_warp, (SVEEntrance.aurora_warp_to_aurora,)), + RegionData(SVERegion.grove_guild_warp, (SVEEntrance.guild_warp_to_guild,)), + RegionData(SVERegion.grove_junimo_warp, (SVEEntrance.junimo_warp_to_junimo,)), + RegionData(SVERegion.grove_spring_warp, (SVEEntrance.spring_warp_to_spring,)), + RegionData(SVERegion.grove_outpost_warp, (SVEEntrance.outpost_warp_to_outpost,)), + RegionData(SVERegion.grove_wizard_warp, (SVEEntrance.wizard_warp_to_wizard,)), + RegionData(SVERegion.galmoran_outpost, (SVEEntrance.outpost_to_badlands_entrance, SVEEntrance.use_alesia_shop, SVEEntrance.use_isaac_shop)), + RegionData(SVERegion.badlands_entrance, (SVEEntrance.badlands_entrance_to_badlands,)), + RegionData(SVERegion.crimson_badlands, (SVEEntrance.badlands_to_cave,)), RegionData(SVERegion.badlands_cave), - RegionData(Region.bus_stop, [SVEEntrance.bus_stop_to_shed]), - RegionData(SVERegion.grandpas_shed, [SVEEntrance.grandpa_shed_to_interior, SVEEntrance.grandpa_shed_to_town]), - RegionData(SVERegion.grandpas_shed_interior, [SVEEntrance.grandpa_interior_to_upstairs]), + RegionData(Region.bus_stop, (SVEEntrance.bus_stop_to_shed,)), + RegionData(SVERegion.grandpas_shed, (SVEEntrance.grandpa_shed_to_interior, SVEEntrance.grandpa_shed_to_town)), + RegionData(SVERegion.grandpas_shed_interior, (SVEEntrance.grandpa_interior_to_upstairs,)), RegionData(SVERegion.grandpas_shed_upstairs), RegionData(Region.forest, - [SVEEntrance.forest_to_fairhaven, SVEEntrance.forest_to_west, SVEEntrance.forest_to_lost_woods, - SVEEntrance.forest_to_bmv, SVEEntrance.forest_to_marnie_shed]), + (SVEEntrance.forest_to_fairhaven, SVEEntrance.forest_to_west, SVEEntrance.forest_to_lost_woods, + SVEEntrance.forest_to_bmv, SVEEntrance.forest_to_marnie_shed)), RegionData(SVERegion.marnies_shed), RegionData(SVERegion.fairhaven_farm), - RegionData(Region.town, [SVEEntrance.town_to_bmv, SVEEntrance.town_to_jenkins, - SVEEntrance.town_to_bridge, SVEEntrance.town_to_plot]), - RegionData(SVERegion.blue_moon_vineyard, [SVEEntrance.bmv_to_sophia, SVEEntrance.bmv_to_beach]), + RegionData(Region.town, (SVEEntrance.town_to_bmv, SVEEntrance.town_to_jenkins, SVEEntrance.town_to_bridge, SVEEntrance.town_to_plot)), + RegionData(SVERegion.blue_moon_vineyard, (SVEEntrance.bmv_to_sophia, SVEEntrance.bmv_to_beach)), RegionData(SVERegion.sophias_house), - RegionData(SVERegion.jenkins_residence, [SVEEntrance.jenkins_to_cellar]), + RegionData(SVERegion.jenkins_residence, (SVEEntrance.jenkins_to_cellar,)), RegionData(SVERegion.jenkins_cellar), - RegionData(SVERegion.unclaimed_plot, [SVEEntrance.plot_to_bridge]), + RegionData(SVERegion.unclaimed_plot, (SVEEntrance.plot_to_bridge,)), RegionData(SVERegion.shearwater), - RegionData(Region.museum, [SVEEntrance.museum_to_gunther_bedroom]), + RegionData(Region.museum, (SVEEntrance.museum_to_gunther_bedroom,)), RegionData(SVERegion.gunther_bedroom), - RegionData(Region.fish_shop, [SVEEntrance.fish_shop_to_willy_bedroom]), + RegionData(Region.fish_shop, (SVEEntrance.fish_shop_to_willy_bedroom,)), RegionData(SVERegion.willy_bedroom), - RegionData(Region.mountain, [SVEEntrance.mountain_to_guild_summit]), - RegionData(SVERegion.guild_summit, [SVEEntrance.guild_to_interior, SVEEntrance.guild_to_mines, - SVEEntrance.summit_to_highlands]), - RegionData(Region.railroad, [SVEEntrance.to_susan_house, SVEEntrance.enter_summit, SVEEntrance.railroad_to_grampleton_station]), - RegionData(SVERegion.grampleton_station, [SVEEntrance.grampleton_station_to_grampleton_suburbs]), - RegionData(SVERegion.grampleton_suburbs, [SVEEntrance.grampleton_suburbs_to_scarlett_house]), + RegionData(Region.mountain, (SVEEntrance.mountain_to_guild_summit,)), + # These entrances are removed from the mountain region when SVE is enabled + RegionData(Region.mountain, (Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_the_mines), flag=MergeFlag.REMOVE_EXITS), + RegionData(SVERegion.guild_summit, (SVEEntrance.guild_to_interior, SVEEntrance.guild_to_mines)), + RegionData(Region.railroad, (SVEEntrance.to_susan_house, SVEEntrance.enter_summit, SVEEntrance.railroad_to_grampleton_station)), + RegionData(SVERegion.grampleton_station, (SVEEntrance.grampleton_station_to_grampleton_suburbs,)), + RegionData(SVERegion.grampleton_suburbs, (SVEEntrance.grampleton_suburbs_to_scarlett_house,)), RegionData(SVERegion.scarlett_house), - RegionData(Region.wizard_basement, [SVEEntrance.wizard_to_fable_reef]), - RegionData(SVERegion.fable_reef, [SVEEntrance.fable_reef_to_guild], is_ginger_island=True), - RegionData(SVERegion.first_slash_guild, [SVEEntrance.first_slash_guild_to_hallway], is_ginger_island=True), - RegionData(SVERegion.first_slash_hallway, [SVEEntrance.first_slash_hallway_to_room], is_ginger_island=True), - RegionData(SVERegion.first_slash_spare_room, is_ginger_island=True), - RegionData(SVERegion.highlands_outside, [SVEEntrance.highlands_to_lance, SVEEntrance.highlands_to_cave, SVEEntrance.highlands_to_pond], is_ginger_island=True), - RegionData(SVERegion.highlands_pond, is_ginger_island=True), - RegionData(SVERegion.highlands_cavern, [SVEEntrance.to_dwarf_prison], is_ginger_island=True), - RegionData(SVERegion.dwarf_prison, is_ginger_island=True), - RegionData(SVERegion.lances_house, [SVEEntrance.lance_to_ladder], is_ginger_island=True), - RegionData(SVERegion.lances_ladder, [SVEEntrance.lance_ladder_to_highlands], is_ginger_island=True), - RegionData(SVERegion.forest_west, [SVEEntrance.forest_west_to_spring, SVEEntrance.west_to_aurora, - SVEEntrance.use_bear_shop]), - RegionData(SVERegion.aurora_vineyard, [SVEEntrance.to_aurora_basement]), + RegionData(SVERegion.forest_west, (SVEEntrance.forest_west_to_spring, SVEEntrance.west_to_aurora, SVEEntrance.use_bear_shop,)), + RegionData(SVERegion.aurora_vineyard, (SVEEntrance.to_aurora_basement,)), RegionData(SVERegion.aurora_vineyard_basement), - RegionData(Region.secret_woods, [SVEEntrance.secret_woods_to_west]), + RegionData(Region.secret_woods, (SVEEntrance.secret_woods_to_west,)), RegionData(SVERegion.bear_shop), - RegionData(SVERegion.sprite_spring, [SVEEntrance.sprite_spring_to_cave]), + RegionData(SVERegion.sprite_spring, (SVEEntrance.sprite_spring_to_cave,)), RegionData(SVERegion.sprite_spring_cave), - RegionData(SVERegion.lost_woods, [SVEEntrance.lost_woods_to_junimo_woods]), - RegionData(SVERegion.junimo_woods, [SVEEntrance.use_purple_junimo]), + RegionData(SVERegion.lost_woods, (SVEEntrance.lost_woods_to_junimo_woods,)), + RegionData(SVERegion.junimo_woods, (SVEEntrance.use_purple_junimo,)), RegionData(SVERegion.purple_junimo_shop), RegionData(SVERegion.alesia_shop), RegionData(SVERegion.isaac_shop), RegionData(SVERegion.summit), RegionData(SVERegion.susans_house), - RegionData(Region.mountain, [Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_the_mines], ModificationFlag.MODIFIED) - ] -mandatory_sve_connections = [ +sve_ginger_island_regions = [ + RegionData(Region.wizard_basement, (SVEEntrance.wizard_to_fable_reef,)), + + RegionData(SVERegion.fable_reef, (SVEEntrance.fable_reef_to_guild,)), + RegionData(SVERegion.first_slash_guild, (SVEEntrance.first_slash_guild_to_hallway,)), + RegionData(SVERegion.first_slash_hallway, (SVEEntrance.first_slash_hallway_to_room,)), + RegionData(SVERegion.first_slash_spare_room), + RegionData(SVERegion.guild_summit, (SVEEntrance.summit_to_highlands,)), + RegionData(SVERegion.highlands_outside, (SVEEntrance.highlands_to_lance, SVEEntrance.highlands_to_cave, SVEEntrance.highlands_to_pond), ), + RegionData(SVERegion.highlands_pond), + RegionData(SVERegion.highlands_cavern, (SVEEntrance.to_dwarf_prison,)), + RegionData(SVERegion.dwarf_prison), + RegionData(SVERegion.lances_house, (SVEEntrance.lance_to_ladder,)), + RegionData(SVERegion.lances_ladder, (SVEEntrance.lance_ladder_to_highlands,)), +] + +sve_main_land_connections = [ ConnectionData(SVEEntrance.town_to_jenkins, SVERegion.jenkins_residence, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(SVEEntrance.jenkins_to_cellar, SVERegion.jenkins_cellar, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.forest_to_bmv, SVERegion.blue_moon_vineyard), @@ -223,7 +222,7 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.grandpa_interior_to_upstairs, SVERegion.grandpas_shed_upstairs, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.grandpa_shed_to_town, Region.town), ConnectionData(SVEEntrance.bmv_to_sophia, SVERegion.sophias_house, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(SVEEntrance.summit_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(SVEEntrance.summit_to_highlands, SVERegion.highlands_outside), ConnectionData(SVEEntrance.guild_to_interior, Region.adventurer_guild, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.backwoods_to_grove, SVERegion.enchanted_grove, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(SVEEntrance.grove_to_outpost_warp, SVERegion.grove_outpost_warp), @@ -242,8 +241,6 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), ConnectionData(SVEEntrance.grove_to_spring_warp, SVERegion.grove_spring_warp), ConnectionData(SVEEntrance.spring_warp_to_spring, SVERegion.sprite_spring, flag=RandomizationFlag.BUILDINGS), - ConnectionData(SVEEntrance.wizard_to_fable_reef, SVERegion.fable_reef, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.fable_reef_to_guild, SVERegion.first_slash_guild, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.outpost_to_badlands_entrance, SVERegion.badlands_entrance, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.badlands_entrance_to_badlands, SVERegion.crimson_badlands, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.badlands_to_cave, SVERegion.badlands_cave, flag=RandomizationFlag.BUILDINGS), @@ -259,71 +256,75 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.to_susan_house, SVERegion.susans_house, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.enter_summit, SVERegion.summit, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.forest_to_fairhaven, SVERegion.fairhaven_farm, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(SVEEntrance.highlands_to_lance, SVERegion.lances_house, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.lance_to_ladder, SVERegion.lances_ladder, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.lance_ladder_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.highlands_to_cave, SVERegion.highlands_cavern, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.use_bear_shop, SVERegion.bear_shop), ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), ConnectionData(SVEEntrance.use_alesia_shop, SVERegion.alesia_shop), ConnectionData(SVEEntrance.use_isaac_shop, SVERegion.isaac_shop), - ConnectionData(SVEEntrance.to_dwarf_prison, SVERegion.dwarf_prison, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.railroad_to_grampleton_station, SVERegion.grampleton_station), ConnectionData(SVEEntrance.grampleton_station_to_grampleton_suburbs, SVERegion.grampleton_suburbs), ConnectionData(SVEEntrance.grampleton_suburbs_to_scarlett_house, SVERegion.scarlett_house, flag=RandomizationFlag.BUILDINGS), - ConnectionData(SVEEntrance.first_slash_guild_to_hallway, SVERegion.first_slash_hallway, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.first_slash_hallway_to_room, SVERegion.first_slash_spare_room, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.sprite_spring_to_cave, SVERegion.sprite_spring_cave, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.fish_shop_to_willy_bedroom, SVERegion.willy_bedroom, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.museum_to_gunther_bedroom, SVERegion.gunther_bedroom, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.highlands_to_pond, SVERegion.highlands_pond), ] +sve_ginger_island_connections = [ + ConnectionData(SVEEntrance.wizard_to_fable_reef, SVERegion.fable_reef, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.fable_reef_to_guild, SVERegion.first_slash_guild, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.highlands_to_lance, SVERegion.lances_house, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.lance_to_ladder, SVERegion.lances_ladder), + ConnectionData(SVEEntrance.lance_ladder_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.highlands_to_cave, SVERegion.highlands_cavern, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.to_dwarf_prison, SVERegion.dwarf_prison, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.first_slash_guild_to_hallway, SVERegion.first_slash_hallway, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.first_slash_hallway_to_room, SVERegion.first_slash_spare_room, flag=RandomizationFlag.BUILDINGS), +] + alecto_regions = [ - RegionData(Region.witch_hut, [AlectoEntrance.witch_hut_to_witch_attic]), - RegionData(AlectoRegion.witch_attic) + RegionData(Region.witch_hut, (AlectoEntrance.witch_hut_to_witch_attic,)), + RegionData(AlectoRegion.witch_attic), ] alecto_entrances = [ - ConnectionData(AlectoEntrance.witch_hut_to_witch_attic, AlectoRegion.witch_attic, flag=RandomizationFlag.BUILDINGS) + ConnectionData(AlectoEntrance.witch_hut_to_witch_attic, AlectoRegion.witch_attic, flag=RandomizationFlag.BUILDINGS), ] lacey_regions = [ - RegionData(Region.forest, [LaceyEntrance.forest_to_hat_house]), - RegionData(LaceyRegion.hat_house) + RegionData(Region.forest, (LaceyEntrance.forest_to_hat_house,)), + RegionData(LaceyRegion.hat_house), ] lacey_entrances = [ - ConnectionData(LaceyEntrance.forest_to_hat_house, LaceyRegion.hat_house, flag=RandomizationFlag.BUILDINGS) + ConnectionData(LaceyEntrance.forest_to_hat_house, LaceyRegion.hat_house, flag=RandomizationFlag.BUILDINGS), ] boarding_house_regions = [ - RegionData(Region.bus_stop, [BoardingHouseEntrance.bus_stop_to_boarding_house_plateau]), - RegionData(BoardingHouseRegion.boarding_house_plateau, [BoardingHouseEntrance.boarding_house_plateau_to_boarding_house_first, + RegionData(Region.bus_stop, (BoardingHouseEntrance.bus_stop_to_boarding_house_plateau,)), + RegionData(BoardingHouseRegion.boarding_house_plateau, (BoardingHouseEntrance.boarding_house_plateau_to_boarding_house_first, BoardingHouseEntrance.boarding_house_plateau_to_buffalo_ranch, - BoardingHouseEntrance.boarding_house_plateau_to_abandoned_mines_entrance]), - RegionData(BoardingHouseRegion.boarding_house_first, [BoardingHouseEntrance.boarding_house_first_to_boarding_house_second]), + BoardingHouseEntrance.boarding_house_plateau_to_abandoned_mines_entrance)), + RegionData(BoardingHouseRegion.boarding_house_first, (BoardingHouseEntrance.boarding_house_first_to_boarding_house_second,)), RegionData(BoardingHouseRegion.boarding_house_second), RegionData(BoardingHouseRegion.buffalo_ranch), - RegionData(BoardingHouseRegion.abandoned_mines_entrance, [BoardingHouseEntrance.abandoned_mines_entrance_to_abandoned_mines_1a, - BoardingHouseEntrance.abandoned_mines_entrance_to_the_lost_valley]), - RegionData(BoardingHouseRegion.abandoned_mines_1a, [BoardingHouseEntrance.abandoned_mines_1a_to_abandoned_mines_1b]), - RegionData(BoardingHouseRegion.abandoned_mines_1b, [BoardingHouseEntrance.abandoned_mines_1b_to_abandoned_mines_2a]), - RegionData(BoardingHouseRegion.abandoned_mines_2a, [BoardingHouseEntrance.abandoned_mines_2a_to_abandoned_mines_2b]), - RegionData(BoardingHouseRegion.abandoned_mines_2b, [BoardingHouseEntrance.abandoned_mines_2b_to_abandoned_mines_3]), - RegionData(BoardingHouseRegion.abandoned_mines_3, [BoardingHouseEntrance.abandoned_mines_3_to_abandoned_mines_4]), - RegionData(BoardingHouseRegion.abandoned_mines_4, [BoardingHouseEntrance.abandoned_mines_4_to_abandoned_mines_5]), - RegionData(BoardingHouseRegion.abandoned_mines_5, [BoardingHouseEntrance.abandoned_mines_5_to_the_lost_valley]), - RegionData(BoardingHouseRegion.the_lost_valley, [BoardingHouseEntrance.the_lost_valley_to_gregory_tent, + RegionData(BoardingHouseRegion.abandoned_mines_entrance, (BoardingHouseEntrance.abandoned_mines_entrance_to_abandoned_mines_1a, + BoardingHouseEntrance.abandoned_mines_entrance_to_the_lost_valley)), + RegionData(BoardingHouseRegion.abandoned_mines_1a, (BoardingHouseEntrance.abandoned_mines_1a_to_abandoned_mines_1b,)), + RegionData(BoardingHouseRegion.abandoned_mines_1b, (BoardingHouseEntrance.abandoned_mines_1b_to_abandoned_mines_2a,)), + RegionData(BoardingHouseRegion.abandoned_mines_2a, (BoardingHouseEntrance.abandoned_mines_2a_to_abandoned_mines_2b,)), + RegionData(BoardingHouseRegion.abandoned_mines_2b, (BoardingHouseEntrance.abandoned_mines_2b_to_abandoned_mines_3,)), + RegionData(BoardingHouseRegion.abandoned_mines_3, (BoardingHouseEntrance.abandoned_mines_3_to_abandoned_mines_4,)), + RegionData(BoardingHouseRegion.abandoned_mines_4, (BoardingHouseEntrance.abandoned_mines_4_to_abandoned_mines_5,)), + RegionData(BoardingHouseRegion.abandoned_mines_5, (BoardingHouseEntrance.abandoned_mines_5_to_the_lost_valley,)), + RegionData(BoardingHouseRegion.the_lost_valley, (BoardingHouseEntrance.the_lost_valley_to_gregory_tent, BoardingHouseEntrance.lost_valley_to_lost_valley_minecart, - BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins]), + BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins)), RegionData(BoardingHouseRegion.gregory_tent), - RegionData(BoardingHouseRegion.lost_valley_ruins, [BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, - BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2]), + RegionData(BoardingHouseRegion.lost_valley_ruins, (BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, + BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2)), RegionData(BoardingHouseRegion.lost_valley_minecart), RegionData(BoardingHouseRegion.lost_valley_house_1), - RegionData(BoardingHouseRegion.lost_valley_house_2) + RegionData(BoardingHouseRegion.lost_valley_house_2), ] boarding_house_entrances = [ @@ -351,30 +352,29 @@ boarding_house_entrances = [ ConnectionData(BoardingHouseEntrance.lost_valley_to_lost_valley_minecart, BoardingHouseRegion.lost_valley_minecart), ConnectionData(BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins, BoardingHouseRegion.lost_valley_ruins, flag=RandomizationFlag.BUILDINGS), ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, BoardingHouseRegion.lost_valley_house_1, flag=RandomizationFlag.BUILDINGS), - ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2, BoardingHouseRegion.lost_valley_house_2, flag=RandomizationFlag.BUILDINGS) + ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2, BoardingHouseRegion.lost_valley_house_2, flag=RandomizationFlag.BUILDINGS), ] -vanilla_connections_to_remove_by_mod: Dict[str, List[ConnectionData]] = { - ModNames.sve: [ - ConnectionData(Entrance.mountain_to_the_mines, Region.mines, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_adventurer_guild, Region.adventurer_guild, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ] +vanilla_connections_to_remove_by_content_pack: dict[str, tuple[str, ...]] = { + ModNames.sve: ( + Entrance.mountain_to_the_mines, + Entrance.mountain_to_adventurer_guild, + ) } -ModDataList = { - ModNames.deepwoods: ModRegionData(ModNames.deepwoods, deep_woods_regions, deep_woods_entrances), - ModNames.eugene: ModRegionData(ModNames.eugene, eugene_regions, eugene_entrances), - ModNames.jasper: ModRegionData(ModNames.jasper, jasper_regions, jasper_entrances), - ModNames.alec: ModRegionData(ModNames.alec, alec_regions, alec_entrances), - ModNames.yoba: ModRegionData(ModNames.yoba, yoba_regions, yoba_entrances), - ModNames.juna: ModRegionData(ModNames.juna, juna_regions, juna_entrances), - ModNames.magic: ModRegionData(ModNames.magic, magic_regions, magic_entrances), - ModNames.ayeisha: ModRegionData(ModNames.ayeisha, ayeisha_regions, ayeisha_entrances), - ModNames.riley: ModRegionData(ModNames.riley, riley_regions, riley_entrances), - ModNames.sve: ModRegionData(ModNames.sve, stardew_valley_expanded_regions, mandatory_sve_connections), - ModNames.alecto: ModRegionData(ModNames.alecto, alecto_regions, alecto_entrances), - ModNames.lacey: ModRegionData(ModNames.lacey, lacey_regions, lacey_entrances), - ModNames.boarding_house: ModRegionData(ModNames.boarding_house, boarding_house_regions, boarding_house_entrances), +region_data_by_content_pack = { + ModNames.deepwoods: ModRegionsData(ModNames.deepwoods, deep_woods_regions, deep_woods_entrances), + ModNames.eugene: ModRegionsData(ModNames.eugene, eugene_regions, eugene_entrances), + ModNames.jasper: ModRegionsData(ModNames.jasper, jasper_regions, jasper_entrances), + ModNames.alec: ModRegionsData(ModNames.alec, alec_regions, alec_entrances), + ModNames.yoba: ModRegionsData(ModNames.yoba, yoba_regions, yoba_entrances), + ModNames.juna: ModRegionsData(ModNames.juna, juna_regions, juna_entrances), + ModNames.magic: ModRegionsData(ModNames.magic, magic_regions, magic_entrances), + ModNames.ayeisha: ModRegionsData(ModNames.ayeisha, ayeisha_regions, ayeisha_entrances), + ModNames.riley: ModRegionsData(ModNames.riley, riley_regions, riley_entrances), + ModNames.sve: ModRegionsData(ModNames.sve, sve_main_land_regions, sve_main_land_connections), + SVE_GINGER_ISLAND_PACK: ModRegionsData(SVE_GINGER_ISLAND_PACK, sve_ginger_island_regions, sve_ginger_island_connections), + ModNames.alecto: ModRegionsData(ModNames.alecto, alecto_regions, alecto_entrances), + ModNames.lacey: ModRegionsData(ModNames.lacey, lacey_regions, lacey_entrances), + ModNames.boarding_house: ModRegionsData(ModNames.boarding_house, boarding_house_regions, boarding_house_entrances), } diff --git a/worlds/stardew_valley/region_classes.py b/worlds/stardew_valley/region_classes.py deleted file mode 100644 index d3d16e3878..0000000000 --- a/worlds/stardew_valley/region_classes.py +++ /dev/null @@ -1,67 +0,0 @@ -from copy import deepcopy -from dataclasses import dataclass, field -from enum import IntFlag -from typing import Optional, List, Set - -connector_keyword = " to " - - -class ModificationFlag(IntFlag): - NOT_MODIFIED = 0 - MODIFIED = 1 - - -class RandomizationFlag(IntFlag): - NOT_RANDOMIZED = 0b0 - PELICAN_TOWN = 0b00011111 - NON_PROGRESSION = 0b00011110 - BUILDINGS = 0b00011100 - EVERYTHING = 0b00011000 - GINGER_ISLAND = 0b00100000 - LEAD_TO_OPEN_AREA = 0b01000000 - MASTERIES = 0b10000000 - - -@dataclass(frozen=True) -class RegionData: - name: str - exits: List[str] = field(default_factory=list) - flag: ModificationFlag = ModificationFlag.NOT_MODIFIED - is_ginger_island: bool = False - - def get_merged_with(self, exits: List[str]): - merged_exits = [] - merged_exits.extend(self.exits) - if exits is not None: - merged_exits.extend(exits) - merged_exits = sorted(set(merged_exits)) - return RegionData(self.name, merged_exits, is_ginger_island=self.is_ginger_island) - - def get_without_exits(self, exits_to_remove: Set[str]): - exits = [exit_ for exit_ in self.exits if exit_ not in exits_to_remove] - return RegionData(self.name, exits, is_ginger_island=self.is_ginger_island) - - def get_clone(self): - return deepcopy(self) - - -@dataclass(frozen=True) -class ConnectionData: - name: str - destination: str - origin: Optional[str] = None - reverse: Optional[str] = None - flag: RandomizationFlag = RandomizationFlag.NOT_RANDOMIZED - - def __post_init__(self): - if connector_keyword in self.name: - origin, destination = self.name.split(connector_keyword) - if self.reverse is None: - super().__setattr__("reverse", f"{destination}{connector_keyword}{origin}") - - -@dataclass(frozen=True) -class ModRegionData: - mod_name: str - regions: List[RegionData] - connections: List[ConnectionData] diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py deleted file mode 100644 index 4d06d598d3..0000000000 --- a/worlds/stardew_valley/regions.py +++ /dev/null @@ -1,775 +0,0 @@ -from random import Random -from typing import Iterable, Dict, Protocol, List, Tuple, Set - -from BaseClasses import Region, Entrance -from .content import content_packs, StardewContent -from .mods.mod_regions import ModDataList, vanilla_connections_to_remove_by_mod -from .options import EntranceRandomization, ExcludeGingerIsland, StardewValleyOptions -from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag -from .strings.entrance_names import Entrance, LogicEntrance -from .strings.region_names import Region as RegionName, LogicRegion - - -class RegionFactory(Protocol): - def __call__(self, name: str, regions: Iterable[str]) -> Region: - raise NotImplementedError - - -vanilla_regions = [ - RegionData(RegionName.menu, [Entrance.to_stardew_valley]), - RegionData(RegionName.stardew_valley, [Entrance.to_farmhouse]), - RegionData(RegionName.farm_house, - [Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce]), - RegionData(RegionName.cellar), - RegionData(RegionName.farm, - [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, - Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, - LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping, - LogicEntrance.fishing, ]), - RegionData(RegionName.backwoods, [Entrance.backwoods_to_mountain]), - RegionData(RegionName.bus_stop, - [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]), - RegionData(RegionName.forest, - [Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch, - Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant, - LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby, - LogicEntrance.attend_festival_of_ice]), - RegionData(LogicRegion.forest_waterfall), - RegionData(RegionName.farm_cave), - RegionData(RegionName.greenhouse, - [LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse, - LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse]), - RegionData(RegionName.mountain, - [Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, - Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, - Entrance.mountain_to_town, Entrance.mountain_to_maru_room, - Entrance.mountain_to_leo_treehouse]), - RegionData(RegionName.leo_treehouse, is_ginger_island=True), - RegionData(RegionName.maru_room), - RegionData(RegionName.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]), - RegionData(RegionName.bus_tunnel), - RegionData(RegionName.town, - [Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store, - Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house, - Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart, - Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, - LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]), - RegionData(RegionName.beach, - [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.attend_luau, - LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]), - RegionData(RegionName.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]), - RegionData(RegionName.ranch), - RegionData(RegionName.leah_house), - RegionData(RegionName.mastery_cave), - RegionData(RegionName.sewer, [Entrance.enter_mutant_bug_lair]), - RegionData(RegionName.mutant_bug_lair), - RegionData(RegionName.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]), - RegionData(RegionName.wizard_basement), - RegionData(RegionName.tent), - RegionData(RegionName.carpenter, [Entrance.enter_sebastian_room]), - RegionData(RegionName.sebastian_room), - RegionData(RegionName.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]), - RegionData(RegionName.adventurer_guild_bedroom), - RegionData(RegionName.community_center, - [Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank, - Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault]), - RegionData(RegionName.crafts_room), - RegionData(RegionName.pantry), - RegionData(RegionName.fish_tank), - RegionData(RegionName.boiler_room), - RegionData(RegionName.bulletin_board), - RegionData(RegionName.vault), - RegionData(RegionName.hospital, [Entrance.enter_harvey_room]), - RegionData(RegionName.harvey_room), - RegionData(RegionName.pierre_store, [Entrance.enter_sunroom]), - RegionData(RegionName.sunroom), - RegionData(RegionName.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]), - RegionData(RegionName.jotpk_world_1, [Entrance.reach_jotpk_world_2]), - RegionData(RegionName.jotpk_world_2, [Entrance.reach_jotpk_world_3]), - RegionData(RegionName.jotpk_world_3), - RegionData(RegionName.junimo_kart_1, [Entrance.reach_junimo_kart_2]), - RegionData(RegionName.junimo_kart_2, [Entrance.reach_junimo_kart_3]), - RegionData(RegionName.junimo_kart_3, [Entrance.reach_junimo_kart_4]), - RegionData(RegionName.junimo_kart_4), - RegionData(RegionName.alex_house), - RegionData(RegionName.trailer), - RegionData(RegionName.mayor_house), - RegionData(RegionName.sam_house), - RegionData(RegionName.haley_house), - RegionData(RegionName.blacksmith, [LogicEntrance.blacksmith_copper]), - RegionData(RegionName.museum), - RegionData(RegionName.jojamart, [Entrance.enter_abandoned_jojamart]), - RegionData(RegionName.abandoned_jojamart, [Entrance.enter_movie_theater]), - RegionData(RegionName.movie_ticket_stand), - RegionData(RegionName.movie_theater), - RegionData(RegionName.fish_shop, [Entrance.fish_shop_to_boat_tunnel]), - RegionData(RegionName.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True), - RegionData(RegionName.elliott_house), - RegionData(RegionName.tide_pools), - RegionData(RegionName.bathhouse_entrance, [Entrance.enter_locker_room]), - RegionData(RegionName.locker_room, [Entrance.enter_public_bath]), - RegionData(RegionName.public_bath), - RegionData(RegionName.witch_warp_cave, [Entrance.enter_witch_swamp]), - RegionData(RegionName.witch_swamp, [Entrance.enter_witch_hut]), - RegionData(RegionName.witch_hut, [Entrance.witch_warp_to_wizard_basement]), - RegionData(RegionName.quarry, [Entrance.enter_quarry_mine_entrance]), - RegionData(RegionName.quarry_mine_entrance, [Entrance.enter_quarry_mine]), - RegionData(RegionName.quarry_mine), - RegionData(RegionName.secret_woods), - RegionData(RegionName.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]), - RegionData(RegionName.oasis, [Entrance.enter_casino]), - RegionData(RegionName.casino), - RegionData(RegionName.skull_cavern_entrance, [Entrance.enter_skull_cavern]), - RegionData(RegionName.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]), - RegionData(RegionName.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]), - RegionData(RegionName.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]), - RegionData(RegionName.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]), - RegionData(RegionName.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]), - RegionData(RegionName.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]), - RegionData(RegionName.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]), - RegionData(RegionName.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]), - RegionData(RegionName.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]), - RegionData(RegionName.dangerous_skull_cavern, is_ginger_island=True), - RegionData(RegionName.island_south, - [Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast, - Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site, - Entrance.parrot_express_docks_to_jungle], - is_ginger_island=True), - RegionData(RegionName.island_resort, is_ginger_island=True), - RegionData(RegionName.island_west, - [Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave, - Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks, - Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island, - LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island, - LogicEntrance.grow_indoor_crops_on_island], - is_ginger_island=True), - RegionData(RegionName.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True), - RegionData(RegionName.island_shrine, is_ginger_island=True), - RegionData(RegionName.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True), - RegionData(RegionName.island_north, - [Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano, - Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks], - is_ginger_island=True), - RegionData(RegionName.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True), - RegionData(RegionName.volcano_secret_beach, is_ginger_island=True), - RegionData(RegionName.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True), - RegionData(RegionName.volcano_dwarf_shop, is_ginger_island=True), - RegionData(RegionName.volcano_floor_10, is_ginger_island=True), - RegionData(RegionName.island_trader, is_ginger_island=True), - RegionData(RegionName.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True), - RegionData(RegionName.gourmand_frog_cave, is_ginger_island=True), - RegionData(RegionName.colored_crystals_cave, is_ginger_island=True), - RegionData(RegionName.shipwreck, is_ginger_island=True), - RegionData(RegionName.qi_walnut_room, is_ginger_island=True), - RegionData(RegionName.leo_hut, is_ginger_island=True), - RegionData(RegionName.pirate_cove, is_ginger_island=True), - RegionData(RegionName.field_office, is_ginger_island=True), - RegionData(RegionName.dig_site, - [Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano, - Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle], - is_ginger_island=True), - RegionData(RegionName.professor_snail_cave, is_ginger_island=True), - RegionData(RegionName.coop), - RegionData(RegionName.barn), - RegionData(RegionName.shed), - RegionData(RegionName.slime_hutch), - - RegionData(RegionName.mines, [LogicEntrance.talk_to_mines_dwarf, - Entrance.dig_to_mines_floor_5]), - RegionData(RegionName.mines_floor_5, [Entrance.dig_to_mines_floor_10]), - RegionData(RegionName.mines_floor_10, [Entrance.dig_to_mines_floor_15]), - RegionData(RegionName.mines_floor_15, [Entrance.dig_to_mines_floor_20]), - RegionData(RegionName.mines_floor_20, [Entrance.dig_to_mines_floor_25]), - RegionData(RegionName.mines_floor_25, [Entrance.dig_to_mines_floor_30]), - RegionData(RegionName.mines_floor_30, [Entrance.dig_to_mines_floor_35]), - RegionData(RegionName.mines_floor_35, [Entrance.dig_to_mines_floor_40]), - RegionData(RegionName.mines_floor_40, [Entrance.dig_to_mines_floor_45]), - RegionData(RegionName.mines_floor_45, [Entrance.dig_to_mines_floor_50]), - RegionData(RegionName.mines_floor_50, [Entrance.dig_to_mines_floor_55]), - RegionData(RegionName.mines_floor_55, [Entrance.dig_to_mines_floor_60]), - RegionData(RegionName.mines_floor_60, [Entrance.dig_to_mines_floor_65]), - RegionData(RegionName.mines_floor_65, [Entrance.dig_to_mines_floor_70]), - RegionData(RegionName.mines_floor_70, [Entrance.dig_to_mines_floor_75]), - RegionData(RegionName.mines_floor_75, [Entrance.dig_to_mines_floor_80]), - RegionData(RegionName.mines_floor_80, [Entrance.dig_to_mines_floor_85]), - RegionData(RegionName.mines_floor_85, [Entrance.dig_to_mines_floor_90]), - RegionData(RegionName.mines_floor_90, [Entrance.dig_to_mines_floor_95]), - RegionData(RegionName.mines_floor_95, [Entrance.dig_to_mines_floor_100]), - RegionData(RegionName.mines_floor_100, [Entrance.dig_to_mines_floor_105]), - RegionData(RegionName.mines_floor_105, [Entrance.dig_to_mines_floor_110]), - RegionData(RegionName.mines_floor_110, [Entrance.dig_to_mines_floor_115]), - RegionData(RegionName.mines_floor_115, [Entrance.dig_to_mines_floor_120]), - RegionData(RegionName.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]), - RegionData(RegionName.dangerous_mines_20, is_ginger_island=True), - RegionData(RegionName.dangerous_mines_60, is_ginger_island=True), - RegionData(RegionName.dangerous_mines_100, is_ginger_island=True), - - RegionData(LogicRegion.mines_dwarf_shop), - RegionData(LogicRegion.blacksmith_copper, [LogicEntrance.blacksmith_iron]), - RegionData(LogicRegion.blacksmith_iron, [LogicEntrance.blacksmith_gold]), - RegionData(LogicRegion.blacksmith_gold, [LogicEntrance.blacksmith_iridium]), - RegionData(LogicRegion.blacksmith_iridium), - RegionData(LogicRegion.kitchen), - RegionData(LogicRegion.queen_of_sauce), - RegionData(LogicRegion.fishing), - - RegionData(LogicRegion.spring_farming), - RegionData(LogicRegion.summer_farming, [LogicEntrance.grow_summer_fall_crops_in_summer]), - RegionData(LogicRegion.fall_farming, [LogicEntrance.grow_summer_fall_crops_in_fall]), - RegionData(LogicRegion.winter_farming), - RegionData(LogicRegion.summer_or_fall_farming), - RegionData(LogicRegion.indoor_farming), - - RegionData(LogicRegion.shipping), - RegionData(LogicRegion.traveling_cart, [LogicEntrance.buy_from_traveling_merchant_sunday, - LogicEntrance.buy_from_traveling_merchant_monday, - LogicEntrance.buy_from_traveling_merchant_tuesday, - LogicEntrance.buy_from_traveling_merchant_wednesday, - LogicEntrance.buy_from_traveling_merchant_thursday, - LogicEntrance.buy_from_traveling_merchant_friday, - LogicEntrance.buy_from_traveling_merchant_saturday]), - RegionData(LogicRegion.traveling_cart_sunday), - RegionData(LogicRegion.traveling_cart_monday), - RegionData(LogicRegion.traveling_cart_tuesday), - RegionData(LogicRegion.traveling_cart_wednesday), - RegionData(LogicRegion.traveling_cart_thursday), - RegionData(LogicRegion.traveling_cart_friday), - RegionData(LogicRegion.traveling_cart_saturday), - RegionData(LogicRegion.raccoon_daddy, [LogicEntrance.buy_from_raccoon]), - RegionData(LogicRegion.raccoon_shop), - - RegionData(LogicRegion.egg_festival), - RegionData(LogicRegion.desert_festival), - RegionData(LogicRegion.flower_dance), - RegionData(LogicRegion.luau), - RegionData(LogicRegion.trout_derby), - RegionData(LogicRegion.moonlight_jellies), - RegionData(LogicRegion.fair), - RegionData(LogicRegion.spirit_eve), - RegionData(LogicRegion.festival_of_ice), - RegionData(LogicRegion.night_market), - RegionData(LogicRegion.winter_star), - RegionData(LogicRegion.squidfest), - RegionData(LogicRegion.bookseller_1, [LogicEntrance.buy_year1_books]), - RegionData(LogicRegion.bookseller_2, [LogicEntrance.buy_year3_books]), - RegionData(LogicRegion.bookseller_3), -] - -# Exists and where they lead -vanilla_connections = [ - ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley), - ConnectionData(Entrance.to_farmhouse, RegionName.farm_house), - ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm), - ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar), - ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods), - ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop), - ConnectionData(Entrance.farm_to_forest, RegionName.forest), - ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse), - ConnectionData(Entrance.enter_coop, RegionName.coop), - ConnectionData(Entrance.enter_barn, RegionName.barn), - ConnectionData(Entrance.enter_shed, RegionName.shed), - ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch), - ConnectionData(Entrance.use_desert_obelisk, RegionName.desert), - ConnectionData(Entrance.use_island_obelisk, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_farm_obelisk, RegionName.farm), - ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain), - ConnectionData(Entrance.bus_stop_to_town, RegionName.town), - ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance), - ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.take_bus_to_desert, RegionName.desert), - ConnectionData(Entrance.forest_to_town, RegionName.town), - ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods), - ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES), - ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad), - ConnectionData(Entrance.mountain_to_tent, RegionName.tent, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom), - ConnectionData(Entrance.enter_quarry, RegionName.quarry), - ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance, - flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine), - ConnectionData(Entrance.mountain_to_town, RegionName.town), - ConnectionData(Entrance.town_to_community_center, RegionName.community_center, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room), - ConnectionData(Entrance.access_pantry, RegionName.pantry), - ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank), - ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room), - ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board), - ConnectionData(Entrance.access_vault, RegionName.vault), - ConnectionData(Entrance.town_to_hospital, RegionName.hospital, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_saloon, RegionName.saloon, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1), - ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2), - ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3), - ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1), - ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2), - ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3), - ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4), - ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_trailer, RegionName.trailer, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_museum, RegionName.museum, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand), - ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart), - ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater), - ConnectionData(Entrance.town_to_beach, RegionName.beach), - ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools), - ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5), - ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10), - ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15), - ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20), - ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25), - ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30), - ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35), - ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40), - ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45), - ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50), - ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55), - ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60), - ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65), - ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70), - ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75), - ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80), - ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85), - ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90), - ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95), - ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100), - ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105), - ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110), - ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115), - ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120), - ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_oasis, RegionName.oasis, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern), - ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25), - ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50), - ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75), - ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100), - ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125), - ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150), - ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175), - ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200), - ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.island_south_to_west, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_north, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_east, RegionName.island_east, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east, - flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_island_resort, RegionName.island_resort, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - - ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop), - - ConnectionData(LogicEntrance.buy_from_traveling_merchant, LogicRegion.traveling_cart), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_sunday, LogicRegion.traveling_cart_sunday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_monday, LogicRegion.traveling_cart_monday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_tuesday, LogicRegion.traveling_cart_tuesday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_wednesday, LogicRegion.traveling_cart_wednesday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_thursday, LogicRegion.traveling_cart_thursday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_friday, LogicRegion.traveling_cart_friday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_saturday, LogicRegion.traveling_cart_saturday), - ConnectionData(LogicEntrance.complete_raccoon_requests, LogicRegion.raccoon_daddy), - ConnectionData(LogicEntrance.fish_in_waterfall, LogicRegion.forest_waterfall), - ConnectionData(LogicEntrance.buy_from_raccoon, LogicRegion.raccoon_shop), - ConnectionData(LogicEntrance.farmhouse_cooking, LogicRegion.kitchen), - ConnectionData(LogicEntrance.watch_queen_of_sauce, LogicRegion.queen_of_sauce), - - ConnectionData(LogicEntrance.grow_spring_crops, LogicRegion.spring_farming), - ConnectionData(LogicEntrance.grow_summer_crops, LogicRegion.summer_farming), - ConnectionData(LogicEntrance.grow_fall_crops, LogicRegion.fall_farming), - ConnectionData(LogicEntrance.grow_winter_crops, LogicRegion.winter_farming), - ConnectionData(LogicEntrance.grow_spring_crops_in_greenhouse, LogicRegion.spring_farming), - ConnectionData(LogicEntrance.grow_summer_crops_in_greenhouse, LogicRegion.summer_farming), - ConnectionData(LogicEntrance.grow_fall_crops_in_greenhouse, LogicRegion.fall_farming), - ConnectionData(LogicEntrance.grow_winter_crops_in_greenhouse, LogicRegion.winter_farming), - ConnectionData(LogicEntrance.grow_indoor_crops_in_greenhouse, LogicRegion.indoor_farming), - ConnectionData(LogicEntrance.grow_spring_crops_on_island, LogicRegion.spring_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_summer_crops_on_island, LogicRegion.summer_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_fall_crops_on_island, LogicRegion.fall_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_winter_crops_on_island, LogicRegion.winter_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_indoor_crops_on_island, LogicRegion.indoor_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_summer_fall_crops_in_summer, LogicRegion.summer_or_fall_farming), - ConnectionData(LogicEntrance.grow_summer_fall_crops_in_fall, LogicRegion.summer_or_fall_farming), - - ConnectionData(LogicEntrance.shipping, LogicRegion.shipping), - ConnectionData(LogicEntrance.blacksmith_copper, LogicRegion.blacksmith_copper), - ConnectionData(LogicEntrance.blacksmith_iron, LogicRegion.blacksmith_iron), - ConnectionData(LogicEntrance.blacksmith_gold, LogicRegion.blacksmith_gold), - ConnectionData(LogicEntrance.blacksmith_iridium, LogicRegion.blacksmith_iridium), - ConnectionData(LogicEntrance.fishing, LogicRegion.fishing), - ConnectionData(LogicEntrance.island_cooking, LogicRegion.kitchen), - ConnectionData(LogicEntrance.attend_egg_festival, LogicRegion.egg_festival), - ConnectionData(LogicEntrance.attend_desert_festival, LogicRegion.desert_festival), - ConnectionData(LogicEntrance.attend_flower_dance, LogicRegion.flower_dance), - ConnectionData(LogicEntrance.attend_luau, LogicRegion.luau), - ConnectionData(LogicEntrance.attend_trout_derby, LogicRegion.trout_derby), - ConnectionData(LogicEntrance.attend_moonlight_jellies, LogicRegion.moonlight_jellies), - ConnectionData(LogicEntrance.attend_fair, LogicRegion.fair), - ConnectionData(LogicEntrance.attend_spirit_eve, LogicRegion.spirit_eve), - ConnectionData(LogicEntrance.attend_festival_of_ice, LogicRegion.festival_of_ice), - ConnectionData(LogicEntrance.attend_night_market, LogicRegion.night_market), - ConnectionData(LogicEntrance.attend_winter_star, LogicRegion.winter_star), - ConnectionData(LogicEntrance.attend_squidfest, LogicRegion.squidfest), - ConnectionData(LogicEntrance.buy_experience_books, LogicRegion.bookseller_1), - ConnectionData(LogicEntrance.buy_year1_books, LogicRegion.bookseller_2), - ConnectionData(LogicEntrance.buy_year3_books, LogicRegion.bookseller_3), -] - - -def create_final_regions(world_options) -> List[RegionData]: - final_regions = [] - final_regions.extend(vanilla_regions) - if world_options.mods is None: - return final_regions - for mod in sorted(world_options.mods.value): - if mod not in ModDataList: - continue - for mod_region in ModDataList[mod].regions: - existing_region = next( - (region for region in final_regions if region.name == mod_region.name), None) - if existing_region: - final_regions.remove(existing_region) - if ModificationFlag.MODIFIED in mod_region.flag: - mod_region = modify_vanilla_regions(existing_region, mod_region) - final_regions.append(existing_region.get_merged_with(mod_region.exits)) - continue - final_regions.append(mod_region.get_clone()) - - return final_regions - - -def create_final_connections_and_regions(world_options) -> Tuple[Dict[str, ConnectionData], Dict[str, RegionData]]: - regions_data: Dict[str, RegionData] = {region.name: region for region in create_final_regions(world_options)} - connections = {connection.name: connection for connection in vanilla_connections} - connections = modify_connections_for_mods(connections, sorted(world_options.mods.value)) - include_island = world_options.exclude_ginger_island == ExcludeGingerIsland.option_false - return remove_ginger_island_regions_and_connections(regions_data, connections, include_island) - - -def remove_ginger_island_regions_and_connections(regions_by_name: Dict[str, RegionData], connections: Dict[str, ConnectionData], include_island: bool): - if include_island: - return connections, regions_by_name - - removed_connections = set() - - for connection_name in tuple(connections): - connection = connections[connection_name] - if connection.flag & RandomizationFlag.GINGER_ISLAND: - connections.pop(connection_name) - removed_connections.add(connection_name) - - for region_name in tuple(regions_by_name): - region = regions_by_name[region_name] - if region.is_ginger_island: - regions_by_name.pop(region_name) - else: - regions_by_name[region_name] = region.get_without_exits(removed_connections) - - return connections, regions_by_name - - -def modify_connections_for_mods(connections: Dict[str, ConnectionData], mods: Iterable) -> Dict[str, ConnectionData]: - for mod in mods: - if mod not in ModDataList: - continue - if mod in vanilla_connections_to_remove_by_mod: - for connection_data in vanilla_connections_to_remove_by_mod[mod]: - connections.pop(connection_data.name) - connections.update({connection.name: connection for connection in ModDataList[mod].connections}) - return connections - - -def modify_vanilla_regions(existing_region: RegionData, modified_region: RegionData) -> RegionData: - updated_region = existing_region - region_exits = updated_region.exits - modified_exits = modified_region.exits - for exits in modified_exits: - region_exits.remove(exits) - - return updated_region - - -def create_regions(region_factory: RegionFactory, random: Random, world_options: StardewValleyOptions, content: StardewContent) \ - -> Tuple[Dict[str, Region], Dict[str, Entrance], Dict[str, str]]: - entrances_data, regions_data = create_final_connections_and_regions(world_options) - regions_by_name: Dict[str: Region] = {region_name: region_factory(region_name, regions_data[region_name].exits) for region_name in regions_data} - entrances_by_name: Dict[str: Entrance] = { - entrance.name: entrance - for region in regions_by_name.values() - for entrance in region.exits - if entrance.name in entrances_data - } - - connections, randomized_data = randomize_connections(random, world_options, content, regions_data, entrances_data) - - for connection in connections: - if connection.name in entrances_by_name: - entrances_by_name[connection.name].connect(regions_by_name[connection.destination]) - return regions_by_name, entrances_by_name, randomized_data - - -def randomize_connections(random: Random, world_options: StardewValleyOptions, content: StardewContent, regions_by_name: Dict[str, RegionData], - connections_by_name: Dict[str, ConnectionData]) -> Tuple[List[ConnectionData], Dict[str, str]]: - connections_to_randomize: List[ConnectionData] = [] - if world_options.entrance_randomization == EntranceRandomization.option_pelican_town: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.PELICAN_TOWN in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_non_progression: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.NON_PROGRESSION in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_buildings or world_options.entrance_randomization == EntranceRandomization.option_buildings_without_house: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.BUILDINGS in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_chaos: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.BUILDINGS in connections_by_name[connection].flag] - connections_to_randomize = remove_excluded_entrances(connections_to_randomize, content) - - # On Chaos, we just add the connections to randomize, unshuffled, and the client does it every day - randomized_data_for_mod = {} - for connection in connections_to_randomize: - randomized_data_for_mod[connection.name] = connection.name - randomized_data_for_mod[connection.reverse] = connection.reverse - return list(connections_by_name.values()), randomized_data_for_mod - - connections_to_randomize = remove_excluded_entrances(connections_to_randomize, content) - random.shuffle(connections_to_randomize) - destination_pool = list(connections_to_randomize) - random.shuffle(destination_pool) - - randomized_connections = randomize_chosen_connections(connections_to_randomize, destination_pool) - add_non_randomized_connections(list(connections_by_name.values()), connections_to_randomize, randomized_connections) - - swap_connections_until_valid(regions_by_name, connections_by_name, randomized_connections, connections_to_randomize, random) - randomized_connections_for_generation = create_connections_for_generation(randomized_connections) - randomized_data_for_mod = create_data_for_mod(randomized_connections, connections_to_randomize) - - return randomized_connections_for_generation, randomized_data_for_mod - - -def remove_excluded_entrances(connections_to_randomize: List[ConnectionData], content: StardewContent) -> List[ConnectionData]: - # FIXME remove when regions are handled in content packs - if content_packs.ginger_island_content_pack.name not in content.registered_packs: - connections_to_randomize = [connection for connection in connections_to_randomize if RandomizationFlag.GINGER_ISLAND not in connection.flag] - if not content.features.skill_progression.are_masteries_shuffled: - connections_to_randomize = [connection for connection in connections_to_randomize if RandomizationFlag.MASTERIES not in connection.flag] - - return connections_to_randomize - - -def randomize_chosen_connections(connections_to_randomize: List[ConnectionData], - destination_pool: List[ConnectionData]) -> Dict[ConnectionData, ConnectionData]: - randomized_connections = {} - for connection in connections_to_randomize: - destination = destination_pool.pop() - randomized_connections[connection] = destination - return randomized_connections - - -def create_connections_for_generation(randomized_connections: Dict[ConnectionData, ConnectionData]) -> List[ConnectionData]: - connections = [] - for connection in randomized_connections: - destination = randomized_connections[connection] - connections.append(ConnectionData(connection.name, destination.destination, destination.reverse)) - return connections - - -def create_data_for_mod(randomized_connections: Dict[ConnectionData, ConnectionData], - connections_to_randomize: List[ConnectionData]) -> Dict[str, str]: - randomized_data_for_mod = {} - for connection in randomized_connections: - if connection not in connections_to_randomize: - continue - destination = randomized_connections[connection] - add_to_mod_data(connection, destination, randomized_data_for_mod) - return randomized_data_for_mod - - -def add_to_mod_data(connection: ConnectionData, destination: ConnectionData, randomized_data_for_mod: Dict[str, str]): - randomized_data_for_mod[connection.name] = destination.name - randomized_data_for_mod[destination.reverse] = connection.reverse - - -def add_non_randomized_connections(all_connections: List[ConnectionData], connections_to_randomize: List[ConnectionData], - randomized_connections: Dict[ConnectionData, ConnectionData]): - for connection in all_connections: - if connection in connections_to_randomize: - continue - randomized_connections[connection] = connection - - -def swap_connections_until_valid(regions_by_name, connections_by_name: Dict[str, ConnectionData], randomized_connections: Dict[ConnectionData, ConnectionData], - connections_to_randomize: List[ConnectionData], random: Random): - while True: - reachable_regions, unreachable_regions = find_reachable_regions(regions_by_name, connections_by_name, randomized_connections) - if not unreachable_regions: - return randomized_connections - swap_one_random_connection(regions_by_name, connections_by_name, randomized_connections, reachable_regions, - unreachable_regions, connections_to_randomize, random) - - -def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[ConnectionData]) -> bool: - if region_name == RegionName.menu: - return True - for connection in connections_in_slot: - if region_name == connection.destination: - return True - return False - - -def find_reachable_regions(regions_by_name, connections_by_name, - randomized_connections: Dict[ConnectionData, ConnectionData]): - reachable_regions = {RegionName.menu} - unreachable_regions = {region for region in regions_by_name.keys()} - # unreachable_regions = {region for region in regions_by_name.keys() if region_should_be_reachable(region, connections_by_name.values())} - unreachable_regions.remove(RegionName.menu) - exits_to_explore = list(regions_by_name[RegionName.menu].exits) - while exits_to_explore: - exit_name = exits_to_explore.pop() - # if exit_name not in connections_by_name: - # continue - exit_connection = connections_by_name[exit_name] - replaced_connection = randomized_connections[exit_connection] - target_region_name = replaced_connection.destination - if target_region_name in reachable_regions: - continue - - target_region = regions_by_name[target_region_name] - reachable_regions.add(target_region_name) - unreachable_regions.remove(target_region_name) - exits_to_explore.extend(target_region.exits) - return reachable_regions, unreachable_regions - - -def swap_one_random_connection(regions_by_name, connections_by_name, randomized_connections: Dict[ConnectionData, ConnectionData], - reachable_regions: Set[str], unreachable_regions: Set[str], - connections_to_randomize: List[ConnectionData], random: Random): - randomized_connections_already_shuffled = {connection: randomized_connections[connection] - for connection in randomized_connections - if connection != randomized_connections[connection]} - unreachable_regions_names_leading_somewhere = [region for region in sorted(unreachable_regions) if len(regions_by_name[region].exits) > 0] - unreachable_regions_leading_somewhere = [regions_by_name[region_name] for region_name in unreachable_regions_names_leading_somewhere] - unreachable_regions_exits_names = [exit_name for region in unreachable_regions_leading_somewhere for exit_name in region.exits] - unreachable_connections = [connections_by_name[exit_name] for exit_name in unreachable_regions_exits_names] - unreachable_connections_that_can_be_randomized = [connection for connection in unreachable_connections if connection in connections_to_randomize] - - chosen_unreachable_entrance = random.choice(unreachable_connections_that_can_be_randomized) - - chosen_reachable_entrance = None - while chosen_reachable_entrance is None or chosen_reachable_entrance not in randomized_connections_already_shuffled: - chosen_reachable_region_name = random.choice(sorted(reachable_regions)) - chosen_reachable_region = regions_by_name[chosen_reachable_region_name] - if not any(chosen_reachable_region.exits): - continue - chosen_reachable_entrance_name = random.choice(chosen_reachable_region.exits) - chosen_reachable_entrance = connections_by_name[chosen_reachable_entrance_name] - - swap_two_connections(chosen_reachable_entrance, chosen_unreachable_entrance, randomized_connections) - - -def swap_two_connections(entrance_1, entrance_2, randomized_connections): - reachable_destination = randomized_connections[entrance_1] - unreachable_destination = randomized_connections[entrance_2] - randomized_connections[entrance_1] = unreachable_destination - randomized_connections[entrance_2] = reachable_destination diff --git a/worlds/stardew_valley/regions/__init__.py b/worlds/stardew_valley/regions/__init__.py new file mode 100644 index 0000000000..63e8afc2fb --- /dev/null +++ b/worlds/stardew_valley/regions/__init__.py @@ -0,0 +1,2 @@ +from .entrance_rando import prepare_mod_data +from .regions import create_regions, RegionFactory diff --git a/worlds/stardew_valley/regions/entrance_rando.py b/worlds/stardew_valley/regions/entrance_rando.py new file mode 100644 index 0000000000..7aa91685e8 --- /dev/null +++ b/worlds/stardew_valley/regions/entrance_rando.py @@ -0,0 +1,73 @@ +from BaseClasses import Region +from entrance_rando import ERPlacementState +from .model import ConnectionData, RandomizationFlag, reverse_connection_name, RegionData +from ..content import StardewContent +from ..options import EntranceRandomization + + +def create_player_randomization_flag(entrance_randomization_choice: EntranceRandomization, content: StardewContent): + """Return the flag that a connection is expected to have to be randomized. Only the bit corresponding to the player randomization choice will be enabled. + + Other bits for content exclusion might also be enabled, tho the preferred solution to exclude content should be to not create those regions at alls, when possible. + """ + flag = RandomizationFlag.NOT_RANDOMIZED + + if entrance_randomization_choice.value == EntranceRandomization.option_disabled: + return flag + + if entrance_randomization_choice == EntranceRandomization.option_pelican_town: + flag |= RandomizationFlag.BIT_PELICAN_TOWN + elif entrance_randomization_choice == EntranceRandomization.option_non_progression: + flag |= RandomizationFlag.BIT_NON_PROGRESSION + elif entrance_randomization_choice in ( + EntranceRandomization.option_buildings, + EntranceRandomization.option_buildings_without_house, + EntranceRandomization.option_chaos + ): + flag |= RandomizationFlag.BIT_BUILDINGS + + if not content.features.skill_progression.are_masteries_shuffled: + flag |= RandomizationFlag.EXCLUDE_MASTERIES + + return flag + + +def connect_regions(region_data_by_name: dict[str, RegionData], connection_data_by_name: dict[str, ConnectionData], regions_by_name: dict[str, Region], + player_randomization_flag: RandomizationFlag) -> None: + for region_name, region_data in region_data_by_name.items(): + origin_region = regions_by_name[region_name] + + for exit_name in region_data.exits: + connection_data = connection_data_by_name[exit_name] + destination_region = regions_by_name[connection_data.destination] + + if connection_data.is_eligible_for_randomization(player_randomization_flag): + create_entrance_rando_target(origin_region, destination_region, connection_data) + else: + origin_region.connect(destination_region, connection_data.name) + + +def create_entrance_rando_target(origin: Region, destination: Region, connection_data: ConnectionData) -> None: + """We need our own function to create the GER targets, because the Stardew Mod have very specific expectations for the name of the entrances. + We need to know exactly which entrances to swap in both directions.""" + origin.create_exit(connection_data.name) + destination.create_er_target(connection_data.reverse) + + +def prepare_mod_data(placements: ERPlacementState) -> dict[str, str]: + """Take the placements from GER and prepare the data for the mod. + The mod require a dictionary detailing which connections need to be swapped. It acts as if the connections are decoupled, so both directions are required. + + For instance, GER will provide placements like (Town to Community Center, Hospital to Town), meaning that the door of the Community Center will instead lead + to the Hospital, and that the exit of the Hospital will lead to the Town by the Community Center door. The StardewAP mod need to know both swaps, being the + original destination of the "Town to Community Center" connection is to be replaced by the original destination of "Town to Hospital", and the original + destination of "Hospital to Town" is to be replaced by the original destination of "Community Center to Town". + """ + + swapped_connections = {} + + for entrance, exit_ in placements.pairings: + swapped_connections[entrance] = reverse_connection_name(exit_) + swapped_connections[exit_] = reverse_connection_name(entrance) + + return swapped_connections diff --git a/worlds/stardew_valley/regions/model.py b/worlds/stardew_valley/regions/model.py new file mode 100644 index 0000000000..07c3901558 --- /dev/null +++ b/worlds/stardew_valley/regions/model.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from collections.abc import Container +from dataclasses import dataclass, field +from enum import IntFlag + +connector_keyword = " to " + + +def reverse_connection_name(name: str) -> str | None: + try: + origin, destination = name.split(connector_keyword) + except ValueError: + return None + return f"{destination}{connector_keyword}{origin}" + + +class MergeFlag(IntFlag): + ADD_EXITS = 0 + REMOVE_EXITS = 1 + + +class RandomizationFlag(IntFlag): + NOT_RANDOMIZED = 0 + + # Randomization options + # The first 4 bits are used to mark if an entrance is eligible for randomization according to the entrance randomization options. + BIT_PELICAN_TOWN = 1 # 0b0001 + BIT_NON_PROGRESSION = 1 << 1 # 0b0010 + BIT_BUILDINGS = 1 << 2 # 0b0100 + BIT_EVERYTHING = 1 << 3 # 0b1000 + + # Content flag for entrances exclusions + # The next 2 bits are used to mark if an entrance is to be excluded from randomization according to the content options. + # Those bits must be removed from an entrance flags when then entrance must be excluded. + __UNUSED = 1 << 4 # 0b010000 + EXCLUDE_MASTERIES = 1 << 5 # 0b100000 + + # Entrance groups + # The last bit is used to add additional qualifiers on entrances to group them + # Those bits should be added when an entrance need additional qualifiers. + LEAD_TO_OPEN_AREA = 1 << 6 + + # Tags to apply on connections + EVERYTHING = EXCLUDE_MASTERIES | BIT_EVERYTHING + BUILDINGS = EVERYTHING | BIT_BUILDINGS + NON_PROGRESSION = BUILDINGS | BIT_NON_PROGRESSION + PELICAN_TOWN = NON_PROGRESSION | BIT_PELICAN_TOWN + + +@dataclass(frozen=True) +class RegionData: + name: str + exits: tuple[str, ...] = field(default_factory=tuple) + flag: MergeFlag = MergeFlag.ADD_EXITS + + def __post_init__(self): + assert not isinstance(self.exits, str), "Exits must be a tuple of strings, you probably forgot a trailing comma." + + def merge_with(self, other: RegionData) -> RegionData: + assert self.name == other.name, "Regions must have the same name to be merged" + + if other.flag == MergeFlag.REMOVE_EXITS: + return self.get_without_exits(other.exits) + + merged_exits = self.exits + other.exits + assert len(merged_exits) == len(set(merged_exits)), "Two regions getting merged have duplicated exists..." + + return RegionData(self.name, merged_exits) + + def get_without_exits(self, exits_to_remove: Container[str]) -> RegionData: + exits = tuple(exit_ for exit_ in self.exits if exit_ not in exits_to_remove) + return RegionData(self.name, exits) + + +@dataclass(frozen=True) +class ConnectionData: + name: str + destination: str + flag: RandomizationFlag = RandomizationFlag.NOT_RANDOMIZED + + @property + def reverse(self) -> str | None: + return reverse_connection_name(self.name) + + def is_eligible_for_randomization(self, chosen_randomization_flag: RandomizationFlag) -> bool: + return chosen_randomization_flag and chosen_randomization_flag in self.flag + + +@dataclass(frozen=True) +class ModRegionsData: + mod_name: str + regions: list[RegionData] + connections: list[ConnectionData] diff --git a/worlds/stardew_valley/regions/mods.py b/worlds/stardew_valley/regions/mods.py new file mode 100644 index 0000000000..fca54619f5 --- /dev/null +++ b/worlds/stardew_valley/regions/mods.py @@ -0,0 +1,46 @@ +from collections.abc import Iterable + +from .model import ConnectionData, RegionData, ModRegionsData +from ..mods.region_data import region_data_by_content_pack, vanilla_connections_to_remove_by_content_pack + + +def modify_regions_for_mods(current_regions_by_name: dict[str, RegionData], active_content_packs: Iterable[str]) -> None: + for content_pack in active_content_packs: + try: + region_data = region_data_by_content_pack[content_pack] + except KeyError: + continue + + merge_mod_regions(current_regions_by_name, region_data) + + +def merge_mod_regions(current_regions_by_name: dict[str, RegionData], mod_region_data: ModRegionsData) -> None: + for new_region in mod_region_data.regions: + region_name = new_region.name + try: + current_region = current_regions_by_name[region_name] + except KeyError: + current_regions_by_name[region_name] = new_region + continue + + current_regions_by_name[region_name] = current_region.merge_with(new_region) + + +def modify_connections_for_mods(connections: dict[str, ConnectionData], active_mods: Iterable[str]) -> None: + for active_mod in active_mods: + try: + region_data = region_data_by_content_pack[active_mod] + except KeyError: + continue + + try: + vanilla_connections_to_remove = vanilla_connections_to_remove_by_content_pack[active_mod] + for connection_name in vanilla_connections_to_remove: + connections.pop(connection_name) + except KeyError: + pass + + connections.update({ + connection.name: connection + for connection in region_data.connections + }) diff --git a/worlds/stardew_valley/regions/regions.py b/worlds/stardew_valley/regions/regions.py new file mode 100644 index 0000000000..ceaec5b2ac --- /dev/null +++ b/worlds/stardew_valley/regions/regions.py @@ -0,0 +1,61 @@ +from typing import Protocol + +from BaseClasses import Region +from . import vanilla_data, mods +from .entrance_rando import create_player_randomization_flag, connect_regions +from .model import ConnectionData, RegionData +from ..content import StardewContent +from ..content.vanilla.ginger_island import ginger_island_content_pack +from ..options import StardewValleyOptions + + +class RegionFactory(Protocol): + def __call__(self, name: str) -> Region: + raise NotImplementedError + + +def create_regions(region_factory: RegionFactory, world_options: StardewValleyOptions, content: StardewContent) -> dict[str, Region]: + connection_data_by_name, region_data_by_name = create_connections_and_regions(content.registered_packs) + + regions_by_name: dict[str: Region] = { + region_name: region_factory(region_name) + for region_name in region_data_by_name + } + + randomization_flag = create_player_randomization_flag(world_options.entrance_randomization, content) + connect_regions(region_data_by_name, connection_data_by_name, regions_by_name, randomization_flag) + + return regions_by_name + + +def create_connections_and_regions(active_content_packs: set[str]) -> tuple[dict[str, ConnectionData], dict[str, RegionData]]: + regions_by_name = create_all_regions(active_content_packs) + connections_by_name = create_all_connections(active_content_packs) + + return connections_by_name, regions_by_name + + +def create_all_regions(active_content_packs: set[str]) -> dict[str, RegionData]: + current_regions_by_name = create_vanilla_regions(active_content_packs) + mods.modify_regions_for_mods(current_regions_by_name, sorted(active_content_packs)) + return current_regions_by_name + + +def create_vanilla_regions(active_content_packs: set[str]) -> dict[str, RegionData]: + if ginger_island_content_pack.name in active_content_packs: + return {**vanilla_data.regions_with_ginger_island_by_name} + else: + return {**vanilla_data.regions_without_ginger_island_by_name} + + +def create_all_connections(active_content_packs: set[str]) -> dict[str, ConnectionData]: + connections = create_vanilla_connections(active_content_packs) + mods.modify_connections_for_mods(connections, sorted(active_content_packs)) + return connections + + +def create_vanilla_connections(active_content_packs: set[str]) -> dict[str, ConnectionData]: + if ginger_island_content_pack.name in active_content_packs: + return {**vanilla_data.connections_with_ginger_island_by_name} + else: + return {**vanilla_data.connections_without_ginger_island_by_name} diff --git a/worlds/stardew_valley/regions/vanilla_data.py b/worlds/stardew_valley/regions/vanilla_data.py new file mode 100644 index 0000000000..dbb83e1063 --- /dev/null +++ b/worlds/stardew_valley/regions/vanilla_data.py @@ -0,0 +1,522 @@ +from collections.abc import Mapping +from types import MappingProxyType + +from .model import ConnectionData, RandomizationFlag, RegionData +from ..strings.entrance_names import LogicEntrance, Entrance +from ..strings.region_names import LogicRegion, Region as RegionName + +vanilla_regions: tuple[RegionData, ...] = ( + RegionData(RegionName.menu, (Entrance.to_stardew_valley,)), + RegionData(RegionName.stardew_valley, (Entrance.to_farmhouse,)), + RegionData(RegionName.farm_house, + (Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce)), + RegionData(RegionName.cellar), + RegionData(RegionName.farm, + (Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, + Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, + LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping, + LogicEntrance.fishing,)), + RegionData(RegionName.backwoods, (Entrance.backwoods_to_mountain,)), + RegionData(RegionName.bus_stop, + (Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance)), + RegionData(RegionName.forest, + (Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch, + Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant, + LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby, + LogicEntrance.attend_festival_of_ice)), + RegionData(LogicRegion.forest_waterfall), + RegionData(RegionName.farm_cave), + RegionData(RegionName.greenhouse, + (LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse, + LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse)), + RegionData(RegionName.mountain, + (Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, + Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, + Entrance.mountain_to_town, Entrance.mountain_to_maru_room)), + RegionData(RegionName.maru_room), + RegionData(RegionName.tunnel_entrance, (Entrance.tunnel_entrance_to_bus_tunnel,)), + RegionData(RegionName.bus_tunnel), + RegionData(RegionName.town, + (Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store, + Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house, + Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart, + Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, + LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star)), + RegionData(RegionName.beach, + (Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.attend_luau, + LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest)), + RegionData(RegionName.railroad, (Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave)), + RegionData(RegionName.ranch), + RegionData(RegionName.leah_house), + RegionData(RegionName.mastery_cave), + RegionData(RegionName.sewer, (Entrance.enter_mutant_bug_lair,)), + RegionData(RegionName.mutant_bug_lair), + RegionData(RegionName.wizard_tower, (Entrance.enter_wizard_basement, Entrance.use_desert_obelisk)), + RegionData(RegionName.wizard_basement), + RegionData(RegionName.tent), + RegionData(RegionName.carpenter, (Entrance.enter_sebastian_room,)), + RegionData(RegionName.sebastian_room), + RegionData(RegionName.adventurer_guild, (Entrance.adventurer_guild_to_bedroom,)), + RegionData(RegionName.adventurer_guild_bedroom), + RegionData(RegionName.community_center, + (Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank, + Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault)), + RegionData(RegionName.crafts_room), + RegionData(RegionName.pantry), + RegionData(RegionName.fish_tank), + RegionData(RegionName.boiler_room), + RegionData(RegionName.bulletin_board), + RegionData(RegionName.vault), + RegionData(RegionName.hospital, (Entrance.enter_harvey_room,)), + RegionData(RegionName.harvey_room), + RegionData(RegionName.pierre_store, (Entrance.enter_sunroom,)), + RegionData(RegionName.sunroom), + RegionData(RegionName.saloon, (Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart)), + RegionData(RegionName.jotpk_world_1, (Entrance.reach_jotpk_world_2,)), + RegionData(RegionName.jotpk_world_2, (Entrance.reach_jotpk_world_3,)), + RegionData(RegionName.jotpk_world_3), + RegionData(RegionName.junimo_kart_1, (Entrance.reach_junimo_kart_2,)), + RegionData(RegionName.junimo_kart_2, (Entrance.reach_junimo_kart_3,)), + RegionData(RegionName.junimo_kart_3, (Entrance.reach_junimo_kart_4,)), + RegionData(RegionName.junimo_kart_4), + RegionData(RegionName.alex_house), + RegionData(RegionName.trailer), + RegionData(RegionName.mayor_house), + RegionData(RegionName.sam_house), + RegionData(RegionName.haley_house), + RegionData(RegionName.blacksmith, (LogicEntrance.blacksmith_copper,)), + RegionData(RegionName.museum), + RegionData(RegionName.jojamart, (Entrance.enter_abandoned_jojamart,)), + RegionData(RegionName.abandoned_jojamart, (Entrance.enter_movie_theater,)), + RegionData(RegionName.movie_ticket_stand), + RegionData(RegionName.movie_theater), + RegionData(RegionName.fish_shop), + RegionData(RegionName.elliott_house), + RegionData(RegionName.tide_pools), + RegionData(RegionName.bathhouse_entrance, (Entrance.enter_locker_room,)), + RegionData(RegionName.locker_room, (Entrance.enter_public_bath,)), + RegionData(RegionName.public_bath), + RegionData(RegionName.witch_warp_cave, (Entrance.enter_witch_swamp,)), + RegionData(RegionName.witch_swamp, (Entrance.enter_witch_hut,)), + RegionData(RegionName.witch_hut, (Entrance.witch_warp_to_wizard_basement,)), + RegionData(RegionName.quarry, (Entrance.enter_quarry_mine_entrance,)), + RegionData(RegionName.quarry_mine_entrance, (Entrance.enter_quarry_mine,)), + RegionData(RegionName.quarry_mine), + RegionData(RegionName.secret_woods), + RegionData(RegionName.desert, (Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival)), + RegionData(RegionName.oasis, (Entrance.enter_casino,)), + RegionData(RegionName.casino), + RegionData(RegionName.skull_cavern_entrance, (Entrance.enter_skull_cavern,)), + RegionData(RegionName.skull_cavern, (Entrance.mine_to_skull_cavern_floor_25,)), + RegionData(RegionName.skull_cavern_25, (Entrance.mine_to_skull_cavern_floor_50,)), + RegionData(RegionName.skull_cavern_50, (Entrance.mine_to_skull_cavern_floor_75,)), + RegionData(RegionName.skull_cavern_75, (Entrance.mine_to_skull_cavern_floor_100,)), + RegionData(RegionName.skull_cavern_100, (Entrance.mine_to_skull_cavern_floor_125,)), + RegionData(RegionName.skull_cavern_125, (Entrance.mine_to_skull_cavern_floor_150,)), + RegionData(RegionName.skull_cavern_150, (Entrance.mine_to_skull_cavern_floor_175,)), + RegionData(RegionName.skull_cavern_175, (Entrance.mine_to_skull_cavern_floor_200,)), + RegionData(RegionName.skull_cavern_200), + + RegionData(RegionName.coop), + RegionData(RegionName.barn), + RegionData(RegionName.shed), + RegionData(RegionName.slime_hutch), + + RegionData(RegionName.mines, (LogicEntrance.talk_to_mines_dwarf, Entrance.dig_to_mines_floor_5)), + RegionData(RegionName.mines_floor_5, (Entrance.dig_to_mines_floor_10,)), + RegionData(RegionName.mines_floor_10, (Entrance.dig_to_mines_floor_15,)), + RegionData(RegionName.mines_floor_15, (Entrance.dig_to_mines_floor_20,)), + RegionData(RegionName.mines_floor_20, (Entrance.dig_to_mines_floor_25,)), + RegionData(RegionName.mines_floor_25, (Entrance.dig_to_mines_floor_30,)), + RegionData(RegionName.mines_floor_30, (Entrance.dig_to_mines_floor_35,)), + RegionData(RegionName.mines_floor_35, (Entrance.dig_to_mines_floor_40,)), + RegionData(RegionName.mines_floor_40, (Entrance.dig_to_mines_floor_45,)), + RegionData(RegionName.mines_floor_45, (Entrance.dig_to_mines_floor_50,)), + RegionData(RegionName.mines_floor_50, (Entrance.dig_to_mines_floor_55,)), + RegionData(RegionName.mines_floor_55, (Entrance.dig_to_mines_floor_60,)), + RegionData(RegionName.mines_floor_60, (Entrance.dig_to_mines_floor_65,)), + RegionData(RegionName.mines_floor_65, (Entrance.dig_to_mines_floor_70,)), + RegionData(RegionName.mines_floor_70, (Entrance.dig_to_mines_floor_75,)), + RegionData(RegionName.mines_floor_75, (Entrance.dig_to_mines_floor_80,)), + RegionData(RegionName.mines_floor_80, (Entrance.dig_to_mines_floor_85,)), + RegionData(RegionName.mines_floor_85, (Entrance.dig_to_mines_floor_90,)), + RegionData(RegionName.mines_floor_90, (Entrance.dig_to_mines_floor_95,)), + RegionData(RegionName.mines_floor_95, (Entrance.dig_to_mines_floor_100,)), + RegionData(RegionName.mines_floor_100, (Entrance.dig_to_mines_floor_105,)), + RegionData(RegionName.mines_floor_105, (Entrance.dig_to_mines_floor_110,)), + RegionData(RegionName.mines_floor_110, (Entrance.dig_to_mines_floor_115,)), + RegionData(RegionName.mines_floor_115, (Entrance.dig_to_mines_floor_120,)), + RegionData(RegionName.mines_floor_120), + + RegionData(LogicRegion.mines_dwarf_shop), + RegionData(LogicRegion.blacksmith_copper, (LogicEntrance.blacksmith_iron,)), + RegionData(LogicRegion.blacksmith_iron, (LogicEntrance.blacksmith_gold,)), + RegionData(LogicRegion.blacksmith_gold, (LogicEntrance.blacksmith_iridium,)), + RegionData(LogicRegion.blacksmith_iridium), + RegionData(LogicRegion.kitchen), + RegionData(LogicRegion.queen_of_sauce), + RegionData(LogicRegion.fishing), + + RegionData(LogicRegion.spring_farming), + RegionData(LogicRegion.summer_farming, (LogicEntrance.grow_summer_fall_crops_in_summer,)), + RegionData(LogicRegion.fall_farming, (LogicEntrance.grow_summer_fall_crops_in_fall,)), + RegionData(LogicRegion.winter_farming), + RegionData(LogicRegion.summer_or_fall_farming), + RegionData(LogicRegion.indoor_farming), + + RegionData(LogicRegion.shipping), + RegionData(LogicRegion.traveling_cart, (LogicEntrance.buy_from_traveling_merchant_sunday, + LogicEntrance.buy_from_traveling_merchant_monday, + LogicEntrance.buy_from_traveling_merchant_tuesday, + LogicEntrance.buy_from_traveling_merchant_wednesday, + LogicEntrance.buy_from_traveling_merchant_thursday, + LogicEntrance.buy_from_traveling_merchant_friday, + LogicEntrance.buy_from_traveling_merchant_saturday)), + RegionData(LogicRegion.traveling_cart_sunday), + RegionData(LogicRegion.traveling_cart_monday), + RegionData(LogicRegion.traveling_cart_tuesday), + RegionData(LogicRegion.traveling_cart_wednesday), + RegionData(LogicRegion.traveling_cart_thursday), + RegionData(LogicRegion.traveling_cart_friday), + RegionData(LogicRegion.traveling_cart_saturday), + RegionData(LogicRegion.raccoon_daddy, (LogicEntrance.buy_from_raccoon,)), + RegionData(LogicRegion.raccoon_shop), + + RegionData(LogicRegion.egg_festival), + RegionData(LogicRegion.desert_festival), + RegionData(LogicRegion.flower_dance), + RegionData(LogicRegion.luau), + RegionData(LogicRegion.trout_derby), + RegionData(LogicRegion.moonlight_jellies), + RegionData(LogicRegion.fair), + RegionData(LogicRegion.spirit_eve), + RegionData(LogicRegion.festival_of_ice), + RegionData(LogicRegion.night_market), + RegionData(LogicRegion.winter_star), + RegionData(LogicRegion.squidfest), + RegionData(LogicRegion.bookseller_1, (LogicEntrance.buy_year1_books,)), + RegionData(LogicRegion.bookseller_2, (LogicEntrance.buy_year3_books,)), + RegionData(LogicRegion.bookseller_3), +) +ginger_island_regions = ( + # This overrides the regions from vanilla... When regions are moved to content packs, overriding existing entrances should no longer be necessary. + RegionData(RegionName.mountain, + (Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, + Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, + Entrance.mountain_to_town, Entrance.mountain_to_maru_room, Entrance.mountain_to_leo_treehouse)), + RegionData(RegionName.wizard_tower, (Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk,)), + RegionData(RegionName.fish_shop, (Entrance.fish_shop_to_boat_tunnel,)), + RegionData(RegionName.mines_floor_120, (Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100)), + RegionData(RegionName.skull_cavern_200, (Entrance.enter_dangerous_skull_cavern,)), + + RegionData(RegionName.leo_treehouse), + RegionData(RegionName.boat_tunnel, (Entrance.boat_to_ginger_island,)), + RegionData(RegionName.dangerous_skull_cavern), + RegionData(RegionName.island_south, + (Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast, + Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site, + Entrance.parrot_express_docks_to_jungle), ), + RegionData(RegionName.island_resort), + RegionData(RegionName.island_west, + (Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave, + Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks, + Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island, + LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island, + LogicEntrance.grow_indoor_crops_on_island), ), + RegionData(RegionName.island_east, (Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine)), + RegionData(RegionName.island_shrine), + RegionData(RegionName.island_south_east, (Entrance.island_southeast_to_pirate_cove,)), + RegionData(RegionName.island_north, + (Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano, + Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks), ), + RegionData(RegionName.volcano, (Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach)), + RegionData(RegionName.volcano_secret_beach), + RegionData(RegionName.volcano_floor_5, (Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10)), + RegionData(RegionName.volcano_dwarf_shop), + RegionData(RegionName.volcano_floor_10), + RegionData(RegionName.island_trader), + RegionData(RegionName.island_farmhouse, (LogicEntrance.island_cooking,)), + RegionData(RegionName.gourmand_frog_cave), + RegionData(RegionName.colored_crystals_cave), + RegionData(RegionName.shipwreck), + RegionData(RegionName.qi_walnut_room), + RegionData(RegionName.leo_hut), + RegionData(RegionName.pirate_cove), + RegionData(RegionName.field_office), + RegionData(RegionName.dig_site, + (Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano, + Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle), ), + + RegionData(RegionName.professor_snail_cave), + RegionData(RegionName.dangerous_mines_20), + RegionData(RegionName.dangerous_mines_60), + RegionData(RegionName.dangerous_mines_100), +) + +# Exists and where they lead +vanilla_connections: tuple[ConnectionData, ...] = ( + ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley), + ConnectionData(Entrance.to_farmhouse, RegionName.farm_house), + ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm), + ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar), + ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods), + ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop), + ConnectionData(Entrance.farm_to_forest, RegionName.forest), + ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse), + ConnectionData(Entrance.enter_coop, RegionName.coop), + ConnectionData(Entrance.enter_barn, RegionName.barn), + ConnectionData(Entrance.enter_shed, RegionName.shed), + ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch), + ConnectionData(Entrance.use_desert_obelisk, RegionName.desert), + ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain), + ConnectionData(Entrance.bus_stop_to_town, RegionName.town), + ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance), + ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.take_bus_to_desert, RegionName.desert), + ConnectionData(Entrance.forest_to_town, RegionName.town), + ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods), + ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + # We remove the bit for masteries, because the mastery cave is to be excluded from the randomization if masteries are not shuffled. + ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS ^ RandomizationFlag.EXCLUDE_MASTERIES), + ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad), + ConnectionData(Entrance.mountain_to_tent, RegionName.tent, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom), + ConnectionData(Entrance.enter_quarry, RegionName.quarry), + ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance, + flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine), + ConnectionData(Entrance.mountain_to_town, RegionName.town), + ConnectionData(Entrance.town_to_community_center, RegionName.community_center, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room), + ConnectionData(Entrance.access_pantry, RegionName.pantry), + ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank), + ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room), + ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board), + ConnectionData(Entrance.access_vault, RegionName.vault), + ConnectionData(Entrance.town_to_hospital, RegionName.hospital, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_saloon, RegionName.saloon, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1), + ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2), + ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3), + ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1), + ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2), + ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3), + ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4), + ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_trailer, RegionName.trailer, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_museum, RegionName.museum, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand), + ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart), + ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater), + ConnectionData(Entrance.town_to_beach, RegionName.beach), + ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools), + ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5), + ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10), + ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15), + ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20), + ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25), + ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30), + ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35), + ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40), + ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45), + ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50), + ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55), + ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60), + ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65), + ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70), + ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75), + ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80), + ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85), + ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90), + ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95), + ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100), + ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105), + ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110), + ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115), + ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120), + ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_oasis, RegionName.oasis, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern), + ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25), + ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50), + ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75), + ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100), + ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125), + ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150), + ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175), + ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200), + ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS), + ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop), + + ConnectionData(LogicEntrance.buy_from_traveling_merchant, LogicRegion.traveling_cart), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_sunday, LogicRegion.traveling_cart_sunday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_monday, LogicRegion.traveling_cart_monday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_tuesday, LogicRegion.traveling_cart_tuesday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_wednesday, LogicRegion.traveling_cart_wednesday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_thursday, LogicRegion.traveling_cart_thursday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_friday, LogicRegion.traveling_cart_friday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_saturday, LogicRegion.traveling_cart_saturday), + ConnectionData(LogicEntrance.complete_raccoon_requests, LogicRegion.raccoon_daddy), + ConnectionData(LogicEntrance.fish_in_waterfall, LogicRegion.forest_waterfall), + ConnectionData(LogicEntrance.buy_from_raccoon, LogicRegion.raccoon_shop), + ConnectionData(LogicEntrance.farmhouse_cooking, LogicRegion.kitchen), + ConnectionData(LogicEntrance.watch_queen_of_sauce, LogicRegion.queen_of_sauce), + + ConnectionData(LogicEntrance.grow_spring_crops, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_spring_crops_in_greenhouse, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops_in_greenhouse, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops_in_greenhouse, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops_in_greenhouse, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_indoor_crops_in_greenhouse, LogicRegion.indoor_farming), + ConnectionData(LogicEntrance.grow_summer_fall_crops_in_summer, LogicRegion.summer_or_fall_farming), + ConnectionData(LogicEntrance.grow_summer_fall_crops_in_fall, LogicRegion.summer_or_fall_farming), + + ConnectionData(LogicEntrance.shipping, LogicRegion.shipping), + ConnectionData(LogicEntrance.blacksmith_copper, LogicRegion.blacksmith_copper), + ConnectionData(LogicEntrance.blacksmith_iron, LogicRegion.blacksmith_iron), + ConnectionData(LogicEntrance.blacksmith_gold, LogicRegion.blacksmith_gold), + ConnectionData(LogicEntrance.blacksmith_iridium, LogicRegion.blacksmith_iridium), + ConnectionData(LogicEntrance.fishing, LogicRegion.fishing), + ConnectionData(LogicEntrance.attend_egg_festival, LogicRegion.egg_festival), + ConnectionData(LogicEntrance.attend_desert_festival, LogicRegion.desert_festival), + ConnectionData(LogicEntrance.attend_flower_dance, LogicRegion.flower_dance), + ConnectionData(LogicEntrance.attend_luau, LogicRegion.luau), + ConnectionData(LogicEntrance.attend_trout_derby, LogicRegion.trout_derby), + ConnectionData(LogicEntrance.attend_moonlight_jellies, LogicRegion.moonlight_jellies), + ConnectionData(LogicEntrance.attend_fair, LogicRegion.fair), + ConnectionData(LogicEntrance.attend_spirit_eve, LogicRegion.spirit_eve), + ConnectionData(LogicEntrance.attend_festival_of_ice, LogicRegion.festival_of_ice), + ConnectionData(LogicEntrance.attend_night_market, LogicRegion.night_market), + ConnectionData(LogicEntrance.attend_winter_star, LogicRegion.winter_star), + ConnectionData(LogicEntrance.attend_squidfest, LogicRegion.squidfest), + ConnectionData(LogicEntrance.buy_experience_books, LogicRegion.bookseller_1), + ConnectionData(LogicEntrance.buy_year1_books, LogicRegion.bookseller_2), + ConnectionData(LogicEntrance.buy_year3_books, LogicRegion.bookseller_3), +) + +ginger_island_connections = ( + ConnectionData(Entrance.use_island_obelisk, RegionName.island_south), + ConnectionData(Entrance.use_farm_obelisk, RegionName.farm), + ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south), + ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern), + ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20), + ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60), + ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100), + ConnectionData(Entrance.island_south_to_west, RegionName.island_west), + ConnectionData(Entrance.island_south_to_north, RegionName.island_north), + ConnectionData(Entrance.island_south_to_east, RegionName.island_east), + ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east), + ConnectionData(Entrance.use_island_resort, RegionName.island_resort), + ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader), + ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5), + ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop), + ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10), + ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north), + ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north), + ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north), + ConnectionData(LogicEntrance.grow_spring_crops_on_island, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops_on_island, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops_on_island, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops_on_island, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_indoor_crops_on_island, LogicRegion.indoor_farming), + ConnectionData(LogicEntrance.island_cooking, LogicRegion.kitchen), +) + +connections_without_ginger_island_by_name: Mapping[str, ConnectionData] = MappingProxyType({ + connection.name: connection + for connection in vanilla_connections +}) +regions_without_ginger_island_by_name: Mapping[str, RegionData] = MappingProxyType({ + region.name: region + for region in vanilla_regions +}) + +connections_with_ginger_island_by_name: Mapping[str, ConnectionData] = MappingProxyType({ + connection.name: connection + for connection in vanilla_connections + ginger_island_connections +}) +regions_with_ginger_island_by_name: Mapping[str, RegionData] = MappingProxyType({ + region.name: region + for region in vanilla_regions + ginger_island_regions +}) diff --git a/worlds/stardew_valley/test/TestRegions.py b/worlds/stardew_valley/test/TestRegions.py deleted file mode 100644 index 07e3094fb2..0000000000 --- a/worlds/stardew_valley/test/TestRegions.py +++ /dev/null @@ -1,173 +0,0 @@ -import random -import unittest -from typing import Set - -from BaseClasses import get_seed -from .bases import SVTestCase -from .options.utils import fill_dataclass_with_default -from .. import create_content -from ..options import EntranceRandomization, ExcludeGingerIsland, SkillProgression -from ..regions import vanilla_regions, vanilla_connections, randomize_connections, RandomizationFlag, create_final_connections_and_regions -from ..strings.entrance_names import Entrance as EntranceName -from ..strings.region_names import Region as RegionName - -connections_by_name = {connection.name for connection in vanilla_connections} -regions_by_name = {region.name for region in vanilla_regions} - - -class TestRegions(unittest.TestCase): - def test_region_exits_lead_somewhere(self): - for region in vanilla_regions: - with self.subTest(region=region): - for exit in region.exits: - self.assertIn(exit, connections_by_name, - f"{region.name} is leading to {exit} but it does not exist.") - - def test_connection_lead_somewhere(self): - for connection in vanilla_connections: - with self.subTest(connection=connection): - self.assertIn(connection.destination, regions_by_name, - f"{connection.name} is leading to {connection.destination} but it does not exist.") - - -def explore_connections_tree_up_to_blockers(blocked_entrances: Set[str], connections_by_name, regions_by_name): - explored_entrances = set() - explored_regions = set() - entrances_to_explore = set() - current_node_name = "Menu" - current_node = regions_by_name[current_node_name] - entrances_to_explore.update(current_node.exits) - while entrances_to_explore: - current_entrance_name = entrances_to_explore.pop() - current_entrance = connections_by_name[current_entrance_name] - current_node_name = current_entrance.destination - - explored_entrances.add(current_entrance_name) - explored_regions.add(current_node_name) - - if current_entrance_name in blocked_entrances: - continue - - current_node = regions_by_name[current_node_name] - entrances_to_explore.update({entrance for entrance in current_node.exits if entrance not in explored_entrances}) - return explored_regions - - -class TestEntranceRando(SVTestCase): - - def test_entrance_randomization(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: option, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(flag=flag, msg=f"Seed: {seed}"): - entrances, regions = create_final_connections_and_regions(sv_options) - _, randomized_connections = randomize_connections(rand, sv_options, content, regions, entrances) - - for connection in vanilla_connections: - if flag in connection.flag: - connection_in_randomized = connection.name in randomized_connections - reverse_in_randomized = connection.reverse in randomized_connections - self.assertTrue(connection_in_randomized, f"Connection {connection.name} should be randomized but it is not in the output.") - self.assertTrue(reverse_in_randomized, f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - def test_entrance_randomization_without_island(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: option, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(option=option, flag=flag, seed=seed): - entrances, regions = create_final_connections_and_regions(sv_options) - _, randomized_connections = randomize_connections(rand, sv_options, content, regions, entrances) - - for connection in vanilla_connections: - if flag in connection.flag: - if RandomizationFlag.GINGER_ISLAND in connection.flag: - self.assertNotIn(connection.name, randomized_connections, - f"Connection {connection.name} should not be randomized but it is in the output.") - self.assertNotIn(connection.reverse, randomized_connections, - f"Connection {connection.reverse} should not be randomized but it is in the output.") - else: - self.assertIn(connection.name, randomized_connections, - f"Connection {connection.name} should be randomized but it is not in the output.") - self.assertIn(connection.reverse, randomized_connections, - f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - def test_cannot_put_island_access_on_island(self): - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: EntranceRandomization.option_buildings, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - - for i in range(0, 100 if self.skip_long_tests else 10000): - seed = get_seed() - rand = random.Random(seed) - with self.subTest(msg=f"Seed: {seed}"): - entrances, regions = create_final_connections_and_regions(sv_options) - randomized_connections, randomized_data = randomize_connections(rand, sv_options, content, regions, entrances) - connections_by_name = {connection.name: connection for connection in randomized_connections} - - blocked_entrances = {EntranceName.use_island_obelisk, EntranceName.boat_to_ginger_island} - required_regions = {RegionName.wizard_tower, RegionName.boat_tunnel} - self.assert_can_reach_any_region_before_blockers(required_regions, blocked_entrances, connections_by_name, regions) - - def assert_can_reach_any_region_before_blockers(self, required_regions, blocked_entrances, connections_by_name, regions_by_name): - explored_regions = explore_connections_tree_up_to_blockers(blocked_entrances, connections_by_name, regions_by_name) - self.assertTrue(any(region in explored_regions for region in required_regions)) - - -class TestEntranceClassifications(SVTestCase): - - def test_non_progression_are_all_accessible_with_empty_inventory(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION)]: - world_options = { - EntranceRandomization.internal_name: option - } - with self.solo_world_sub_test(world_options=world_options, flag=flag) as (multiworld, sv_world): - ap_entrances = {entrance.name: entrance for entrance in multiworld.get_entrances()} - for randomized_entrance in sv_world.randomized_entrances: - if randomized_entrance in ap_entrances: - ap_entrance_origin = ap_entrances[randomized_entrance] - self.assertTrue(ap_entrance_origin.access_rule(multiworld.state)) - if sv_world.randomized_entrances[randomized_entrance] in ap_entrances: - ap_entrance_destination = multiworld.get_entrance(sv_world.randomized_entrances[randomized_entrance], 1) - self.assertTrue(ap_entrance_destination.access_rule(multiworld.state)) - - def test_no_ginger_island_entrances_when_excluded(self): - world_options = { - EntranceRandomization.internal_name: EntranceRandomization.option_disabled, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true - } - with self.solo_world_sub_test(world_options=world_options) as (multiworld, _): - ap_entrances = {entrance.name: entrance for entrance in multiworld.get_entrances()} - entrance_data_by_name = {entrance.name: entrance for entrance in vanilla_connections} - for entrance_name in ap_entrances: - entrance_data = entrance_data_by_name[entrance_name] - with self.subTest(f"{entrance_name}: {entrance_data.flag}"): - self.assertFalse(entrance_data.flag & RandomizationFlag.GINGER_ISLAND) diff --git a/worlds/stardew_valley/test/assertion/rule_assert.py b/worlds/stardew_valley/test/assertion/rule_assert.py index 02362f2d15..39b69a529f 100644 --- a/worlds/stardew_valley/test/assertion/rule_assert.py +++ b/worlds/stardew_valley/test/assertion/rule_assert.py @@ -1,7 +1,7 @@ from typing import List from unittest import TestCase -from BaseClasses import CollectionState, Location, Region +from BaseClasses import CollectionState, Location, Region, Entrance from ...stardew_rule import StardewRule, false_, MISSING_ITEM, Reach from ...stardew_rule.rule_explain import explain @@ -79,3 +79,13 @@ class RuleAssertMixin(TestCase): except KeyError as e: raise AssertionError(f"Error while checking region {region_name}: {e}" f"\nExplanation: {expl}") + + def assert_can_reach_entrance(self, entrance: Entrance | str, state: CollectionState) -> None: + entrance_name = entrance.name if isinstance(entrance, Entrance) else entrance + expl = explain(Reach(entrance_name, "Entrance", 1), state) + try: + can_reach = state.can_reach_entrance(entrance_name, 1) + self.assertTrue(can_reach, expl) + except KeyError as e: + raise AssertionError(f"Error while checking entrance {entrance_name}: {e}" + f"\nExplanation: {expl}") diff --git a/worlds/stardew_valley/test/bases.py b/worlds/stardew_valley/test/bases.py index affc20cde1..a285218399 100644 --- a/worlds/stardew_valley/test/bases.py +++ b/worlds/stardew_valley/test/bases.py @@ -7,7 +7,7 @@ import unittest from contextlib import contextmanager from typing import Optional, Dict, Union, Any, List, Iterable -from BaseClasses import get_seed, MultiWorld, Location, Item, CollectionState +from BaseClasses import get_seed, MultiWorld, Location, Item, CollectionState, Entrance from test.bases import WorldTestBase from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld from worlds.AutoWorld import call_all @@ -179,6 +179,11 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): state = self.multiworld.state super().assert_cannot_reach_location(location, state) + def assert_can_reach_entrance(self, entrance: Entrance | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + super().assert_can_reach_entrance(entrance, state) + pre_generated_worlds = {} diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index be6ce71076..8cff10b4fc 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,17 +1,13 @@ -import random from typing import ClassVar -from BaseClasses import get_seed from test.param import classvar_matrix from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin from ..bases import SVTestCase, SVTestBase, solo_multiworld from ..options.presets import allsanity_mods_6_x_x -from ..options.utils import fill_dataclass_with_default -from ... import options, Group, create_content +from ... import options, Group from ...mods.mod_data import ModNames from ...options.options import all_mods -from ...regions import RandomizationFlag, randomize_connections, create_final_connections_and_regions class TestCanGenerateAllsanityWithMods(WorldAssertMixin, ModAssertMixin, SVTestCase): @@ -117,39 +113,6 @@ class TestNoGingerIslandModItemGeneration(SVTestBase): self.assertIn(progression_item.name, all_created_items) -class TestModEntranceRando(SVTestCase): - - def test_mod_entrance_randomization(self): - for option, flag in [(options.EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (options.EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (options.EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (options.EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - sv_options = fill_dataclass_with_default({ - options.EntranceRandomization.internal_name: option, - options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.SkillProgression.internal_name: options.SkillProgression.option_progressive_with_masteries, - options.Mods.internal_name: frozenset(options.Mods.valid_keys) - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(option=option, flag=flag, seed=seed): - final_connections, final_regions = create_final_connections_and_regions(sv_options) - - _, randomized_connections = randomize_connections(rand, sv_options, content, final_regions, final_connections) - - for connection_name in final_connections: - connection = final_connections[connection_name] - if flag in connection.flag: - connection_in_randomized = connection_name in randomized_connections - reverse_in_randomized = connection.reverse in randomized_connections - self.assertTrue(connection_in_randomized, f"Connection {connection_name} should be randomized but it is not in the output") - self.assertTrue(reverse_in_randomized, f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - class TestVanillaLogicAlternativeWhenQuestsAreNotRandomized(WorldAssertMixin, SVTestBase): """We often forget to add an alternative rule that works when quests are not randomized. When this happens, some Location are not reachable because they depend on items that are only added to the pool when quests are randomized. diff --git a/worlds/stardew_valley/test/regions/TestEntranceClassifications.py b/worlds/stardew_valley/test/regions/TestEntranceClassifications.py new file mode 100644 index 0000000000..43a7090482 --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestEntranceClassifications.py @@ -0,0 +1,36 @@ +from ..bases import SVTestBase +from ... import options +from ...regions.model import RandomizationFlag +from ...regions.regions import create_all_connections + + +class EntranceRandomizationAssertMixin: + + def assert_non_progression_are_all_accessible_with_empty_inventory(self: SVTestBase): + all_connections = create_all_connections(self.world.content.registered_packs) + non_progression_connections = [connection for connection in all_connections.values() if RandomizationFlag.BIT_NON_PROGRESSION in connection.flag] + + for non_progression_connections in non_progression_connections: + with self.subTest(connection=non_progression_connections): + self.assert_can_reach_entrance(non_progression_connections.name) + + +# This test does not actually need to generate with entrance randomization. Entrances rules are the same regardless of the randomization. +class TestVanillaEntranceClassifications(EntranceRandomizationAssertMixin, SVTestBase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset() + } + + def test_non_progression_are_all_accessible_with_empty_inventory(self): + self.assert_non_progression_are_all_accessible_with_empty_inventory() + + +class TestModdedEntranceClassifications(EntranceRandomizationAssertMixin, SVTestBase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset(options.Mods.valid_keys) + } + + def test_non_progression_are_all_accessible_with_empty_inventory(self): + self.assert_non_progression_are_all_accessible_with_empty_inventory() diff --git a/worlds/stardew_valley/test/regions/TestEntranceRandomization.py b/worlds/stardew_valley/test/regions/TestEntranceRandomization.py new file mode 100644 index 0000000000..15c46637ab --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestEntranceRandomization.py @@ -0,0 +1,167 @@ +from collections import deque +from collections.abc import Collection +from unittest.mock import patch, Mock + +from BaseClasses import get_seed, MultiWorld, Entrance +from ..assertion import WorldAssertMixin +from ..bases import SVTestCase, solo_multiworld +from ... import options +from ...mods.mod_data import ModNames +from ...options import EntranceRandomization, ExcludeGingerIsland, SkillProgression +from ...options.options import all_mods +from ...regions.entrance_rando import create_entrance_rando_target, prepare_mod_data, connect_regions +from ...regions.model import RegionData, ConnectionData, RandomizationFlag +from ...strings.entrance_names import Entrance as EntranceName +from ...strings.region_names import Region as RegionName + + +class TestEntranceRando(SVTestCase): + + def test_given_connection_matching_randomization_when_connect_regions_then_make_connection_entrance_rando_target(self): + region_data_by_name = { + "Region1": RegionData("Region1", ("randomized_connection", "not_randomized")), + "Region2": RegionData("Region2"), + "Region3": RegionData("Region3"), + } + connection_data_by_name = { + "randomized_connection": ConnectionData("randomized_connection", "Region2", flag=RandomizationFlag.PELICAN_TOWN), + "not_randomized": ConnectionData("not_randomized", "Region2", flag=RandomizationFlag.BUILDINGS), + } + regions_by_name = { + "Region1": Mock(), + "Region2": Mock(), + "Region3": Mock(), + } + player_randomization_flag = RandomizationFlag.BIT_PELICAN_TOWN + + with patch("worlds.stardew_valley.regions.entrance_rando.create_entrance_rando_target") as mock_create_entrance_rando_target: + connect_regions(region_data_by_name, connection_data_by_name, regions_by_name, player_randomization_flag) + + expected_origin, expected_destination = regions_by_name["Region1"], regions_by_name["Region2"] + expected_connection = connection_data_by_name["randomized_connection"] + mock_create_entrance_rando_target.assert_called_once_with(expected_origin, expected_destination, expected_connection) + + def test_when_create_entrance_rando_target_then_create_exit_and_er_target(self): + origin = Mock() + destination = Mock() + connection_data = ConnectionData("origin to destination", "destination") + + create_entrance_rando_target(origin, destination, connection_data) + + origin.create_exit.assert_called_once_with("origin to destination") + destination.create_er_target.assert_called_once_with("destination to origin") + + def test_when_prepare_mod_data_then_swapped_connections_contains_both_directions(self): + placements = Mock(pairings=[("A to B", "C to A"), ("C to D", "A to C")]) + + swapped_connections = prepare_mod_data(placements) + + self.assertEqual({"A to B": "A to C", "C to A": "B to A", "C to D": "C to A", "A to C": "D to C"}, swapped_connections) + + +class TestEntranceRandoCreatesValidWorlds(WorldAssertMixin, SVTestCase): + + # The following tests validate that ER still generates winnable and logically-sane games with given mods. + # Mods that do not interact with entrances are skipped + # Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others + def test_ginger_island_excluded_buildings(self): + world_options = { + options.EntranceRandomization: options.EntranceRandomization.option_buildings, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + def test_deepwoods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.deepwoods, options.EntranceRandomization.option_buildings) + + def test_juna_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.juna, options.EntranceRandomization.option_buildings) + + def test_jasper_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.jasper, options.EntranceRandomization.option_buildings) + + def test_alec_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alec, options.EntranceRandomization.option_buildings) + + def test_yoba_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.yoba, options.EntranceRandomization.option_buildings) + + def test_eugene_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.eugene, options.EntranceRandomization.option_buildings) + + def test_ayeisha_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.ayeisha, options.EntranceRandomization.option_buildings) + + def test_riley_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.riley, options.EntranceRandomization.option_buildings) + + def test_sve_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.sve, options.EntranceRandomization.option_buildings) + + def test_alecto_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alecto, options.EntranceRandomization.option_buildings) + + def test_lacey_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.lacey, options.EntranceRandomization.option_buildings) + + def test_boarding_house_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.boarding_house, options.EntranceRandomization.option_buildings) + + def test_all_mods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(all_mods, options.EntranceRandomization.option_buildings) + + def perform_basic_checks_on_mod_with_er(self, mods: str | set[str], er_option: int) -> None: + if isinstance(mods, str): + mods = {mods} + world_options = { + options.EntranceRandomization: er_option, + options.Mods: frozenset(mods), + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + +# GER should have this covered, but it's good to have a backup +class TestGingerIslandEntranceRando(SVTestCase): + def test_cannot_put_island_access_on_island(self): + test_options = { + options.EntranceRandomization: EntranceRandomization.option_buildings, + options.ExcludeGingerIsland: ExcludeGingerIsland.option_false, + options.SkillProgression: SkillProgression.option_progressive_with_masteries, + } + + blocked_entrances = {EntranceName.use_island_obelisk, EntranceName.boat_to_ginger_island} + required_regions = {RegionName.wizard_tower, RegionName.boat_tunnel} + + for i in range(0, 10 if self.skip_long_tests else 1000): + seed = get_seed() + with self.solo_world_sub_test(f"Seed: {seed}", world_options=test_options, world_caching=False, seed=seed) as (multiworld, world): + self.assert_can_reach_any_region_before_blockers(required_regions, blocked_entrances, multiworld) + + def assert_can_reach_any_region_before_blockers(self, required_regions: Collection[str], blocked_entrances: Collection[str], multiworld: MultiWorld): + explored_regions = explore_regions_up_to_blockers(blocked_entrances, multiworld) + self.assertTrue(any(region in explored_regions for region in required_regions)) + + +def explore_regions_up_to_blockers(blocked_entrances: Collection[str], multiworld: MultiWorld) -> set[str]: + explored_regions: set[str] = set() + regions_by_name = multiworld.regions.region_cache[1] + regions_to_explore = deque([regions_by_name["Menu"]]) + + while regions_to_explore: + region = regions_to_explore.pop() + + if region.name in explored_regions: + continue + + explored_regions.add(region.name) + + for exit_ in region.exits: + exit_: Entrance + if exit_.name in blocked_entrances: + continue + regions_to_explore.append(exit_.connected_region) + + return explored_regions diff --git a/worlds/stardew_valley/test/regions/TestRandomizationFlag.py b/worlds/stardew_valley/test/regions/TestRandomizationFlag.py new file mode 100644 index 0000000000..6a01ef07e9 --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestRandomizationFlag.py @@ -0,0 +1,88 @@ +import unittest + +from ..options.utils import fill_dataclass_with_default +from ... import create_content, options +from ...regions.entrance_rando import create_player_randomization_flag +from ...regions.model import RandomizationFlag, ConnectionData + + +class TestConnectionData(unittest.TestCase): + + def test_given_entrances_not_randomized_when_is_eligible_for_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.NOT_RANDOMIZED + + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + def test_given_pelican_town_connection_when_is_eligible_for_pelican_town_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_PELICAN_TOWN + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_pelican_town_connection_when_is_eligible_for_buildings_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_BUILDINGS + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_non_progression_connection_when_is_eligible_for_pelican_town_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.BIT_PELICAN_TOWN + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + def test_given_non_progression_masteries_connection_when_is_eligible_for_non_progression_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_NON_PROGRESSION + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION ^ RandomizationFlag.EXCLUDE_MASTERIES) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_non_progression_masteries_connection_when_is_eligible_for_non_progression_without_masteries_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.BIT_NON_PROGRESSION | RandomizationFlag.EXCLUDE_MASTERIES + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION ^ RandomizationFlag.EXCLUDE_MASTERIES) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + +class TestRandomizationFlag(unittest.TestCase): + + def test_given_entrance_randomization_choice_when_create_player_randomization_flag_then_only_relevant_bit_is_enabled(self): + for entrance_randomization_choice, expected_bit in ( + (options.EntranceRandomization.option_disabled, RandomizationFlag.NOT_RANDOMIZED), + (options.EntranceRandomization.option_pelican_town, RandomizationFlag.BIT_PELICAN_TOWN), + (options.EntranceRandomization.option_non_progression, RandomizationFlag.BIT_NON_PROGRESSION), + (options.EntranceRandomization.option_buildings_without_house, RandomizationFlag.BIT_BUILDINGS), + (options.EntranceRandomization.option_buildings, RandomizationFlag.BIT_BUILDINGS), + (options.EntranceRandomization.option_chaos, RandomizationFlag.BIT_BUILDINGS), + ): + player_options = fill_dataclass_with_default({options.EntranceRandomization: entrance_randomization_choice}) + content = create_content(player_options) + + flag = create_player_randomization_flag(player_options.entrance_randomization, content) + + self.assertEqual(flag, expected_bit) + + def test_given_masteries_not_randomized_when_create_player_randomization_flag_then_exclude_masteries_bit_enabled(self): + for entrance_randomization_choice in set(options.EntranceRandomization.options.values()) ^ {options.EntranceRandomization.option_disabled}: + player_options = fill_dataclass_with_default({ + options.EntranceRandomization: entrance_randomization_choice, + options.SkillProgression: options.SkillProgression.option_progressive + }) + content = create_content(player_options) + + flag = create_player_randomization_flag(player_options.entrance_randomization, content) + + self.assertIn(RandomizationFlag.EXCLUDE_MASTERIES, flag) diff --git a/worlds/stardew_valley/test/regions/TestRegionConnections.py b/worlds/stardew_valley/test/regions/TestRegionConnections.py new file mode 100644 index 0000000000..42a2e36124 --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestRegionConnections.py @@ -0,0 +1,66 @@ +import unittest + +from ..options.utils import fill_dataclass_with_default +from ... import options +from ...content import create_content +from ...mods.region_data import region_data_by_content_pack +from ...regions import vanilla_data +from ...regions.model import MergeFlag +from ...regions.regions import create_all_regions, create_all_connections + + +class TestVanillaRegionsConnectionsWithGingerIsland(unittest.TestCase): + def test_region_exits_lead_somewhere(self): + for region in vanilla_data.regions_with_ginger_island_by_name.values(): + with self.subTest(region=region): + for exit_ in region.exits: + self.assertIn(exit_, vanilla_data.connections_with_ginger_island_by_name, + f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for connection in vanilla_data.connections_with_ginger_island_by_name.values(): + with self.subTest(connection=connection): + self.assertIn(connection.destination, vanilla_data.regions_with_ginger_island_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") + + +class TestVanillaRegionsConnectionsWithoutGingerIsland(unittest.TestCase): + def test_region_exits_lead_somewhere(self): + for region in vanilla_data.regions_without_ginger_island_by_name.values(): + with self.subTest(region=region): + for exit_ in region.exits: + self.assertIn(exit_, vanilla_data.connections_without_ginger_island_by_name, + f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for connection in vanilla_data.connections_without_ginger_island_by_name.values(): + with self.subTest(connection=connection): + self.assertIn(connection.destination, vanilla_data.regions_without_ginger_island_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") + + +class TestModsConnections(unittest.TestCase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset(options.Mods.valid_keys) + } + content = create_content(fill_dataclass_with_default(options)) + all_regions_by_name = create_all_regions(content.registered_packs) + all_connections_by_name = create_all_connections(content.registered_packs) + + def test_region_exits_lead_somewhere(self): + for mod_region_data in region_data_by_content_pack.values(): + for region in mod_region_data.regions: + if MergeFlag.REMOVE_EXITS in region.flag: + continue + + with self.subTest(mod=mod_region_data.mod_name, region=region.name): + for exit_ in region.exits: + self.assertIn(exit_, self.all_connections_by_name, f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for mod_region_data in region_data_by_content_pack.values(): + for connection in mod_region_data.connections: + with self.subTest(mod=mod_region_data.mod_name, connection=connection.name): + self.assertIn(connection.destination, self.all_regions_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") diff --git a/worlds/stardew_valley/test/regions/__init__.py b/worlds/stardew_valley/test/regions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 47a0dd696f9dd292788be284012e920c1b35067d Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Sat, 24 May 2025 01:28:25 -0400 Subject: [PATCH 187/199] Stardew Valley: Added moss to statue of blessings recipe (#5038) --- worlds/stardew_valley/data/craftable_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/stardew_valley/data/craftable_data.py b/worlds/stardew_valley/data/craftable_data.py index de371b7c3a..66466d89b1 100644 --- a/worlds/stardew_valley/data/craftable_data.py +++ b/worlds/stardew_valley/data/craftable_data.py @@ -305,7 +305,7 @@ hopper = ap_recipe(Craftable.hopper, {Material.hardwood: 10, MetalBar.iridium: 1 cookout_kit = skill_recipe(Craftable.cookout_kit, Skill.foraging, 3, {Material.wood: 15, Material.fiber: 10, Material.coal: 3}) tent_kit = skill_recipe(Craftable.tent_kit, Skill.foraging, 8, {Material.hardwood: 10, Material.fiber: 25, ArtisanGood.cloth: 1}) -statue_of_blessings = mastery_recipe(Statue.blessings, Skill.farming, {Material.sap: 999, Material.fiber: 999, Material.stone: 999}) +statue_of_blessings = mastery_recipe(Statue.blessings, Skill.farming, {Material.sap: 999, Material.fiber: 999, Material.stone: 999, Material.moss: 333}) statue_of_dwarf_king = mastery_recipe(Statue.dwarf_king, Skill.mining, {MetalBar.iridium: 20}) heavy_furnace = mastery_recipe(Machine.heavy_furnace, Skill.mining, {Machine.furnace: 2, MetalBar.iron: 3, Material.stone: 50}) mystic_tree_seed = mastery_recipe(TreeSeed.mystic, Skill.foraging, {TreeSeed.acorn: 5, TreeSeed.maple: 5, TreeSeed.pine: 5, TreeSeed.mahogany: 5}) From 704cd97f211a44b3a792f11a906f523da8554627 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Fri, 23 May 2025 22:33:01 -0700 Subject: [PATCH 188/199] BizHawkClient: Fix script to list all cores instead of explicit mapping (#5033) --- data/lua/connector_bizhawk_generic.lua | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/data/lua/connector_bizhawk_generic.lua b/data/lua/connector_bizhawk_generic.lua index c2e8f91c0d..387ca2c6f3 100644 --- a/data/lua/connector_bizhawk_generic.lua +++ b/data/lua/connector_bizhawk_generic.lua @@ -365,18 +365,14 @@ request_handlers = { ["PREFERRED_CORES"] = function (req) local res = {} local preferred_cores = client.getconfig().PreferredCores + local systems_enumerator = preferred_cores.Keys:GetEnumerator() res["type"] = "PREFERRED_CORES_RESPONSE" res["value"] = {} - res["value"]["NES"] = preferred_cores.NES - res["value"]["SNES"] = preferred_cores.SNES - res["value"]["GB"] = preferred_cores.GB - res["value"]["GBC"] = preferred_cores.GBC - res["value"]["DGB"] = preferred_cores.DGB - res["value"]["SGB"] = preferred_cores.SGB - res["value"]["PCE"] = preferred_cores.PCE - res["value"]["PCECD"] = preferred_cores.PCECD - res["value"]["SGX"] = preferred_cores.SGX + + while systems_enumerator:MoveNext() do + res["value"][systems_enumerator.Current] = preferred_cores[systems_enumerator.Current] + end return res end, From e830a6d6f56a5c97603c86599dbd9726aeaaf51b Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Sat, 24 May 2025 09:17:54 -0400 Subject: [PATCH 189/199] TWW: Only add Filler for Excluded Locations Which are Progress Locations (#4993) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/tww/randomizers/ItemPool.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/tww/randomizers/ItemPool.py b/worlds/tww/randomizers/ItemPool.py index 86c02f3932..679d1939df 100644 --- a/worlds/tww/randomizers/ItemPool.py +++ b/worlds/tww/randomizers/ItemPool.py @@ -117,7 +117,8 @@ def get_pool_core(world: "TWWWorld") -> tuple[list[str], list[str]]: world.filler_pool = filler_pool # Add filler items to place into excluded locations. - pool.extend([world.get_filler_item_name() for _ in world.options.exclude_locations]) + excluded_locations = world.progress_locations.intersection(world.options.exclude_locations) + pool.extend([world.get_filler_item_name() for _ in excluded_locations]) # The remaining of items left to place should be the same as the number of non-excluded locations in the world. nonexcluded_locations = [ From 4119763e23f948ccf9f2d2c7658456d33b953eb4 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 24 May 2025 09:35:06 -0400 Subject: [PATCH 190/199] Lingo: Fix The Bearer's Pilgrimage Logic (#5005) --- worlds/lingo/data/LL1.yaml | 94 +++++++++++++++-------- worlds/lingo/data/generated.dat | Bin 149504 -> 149835 bytes worlds/lingo/data/ids.yaml | 8 +- worlds/lingo/datatypes.py | 1 + worlds/lingo/regions.py | 9 ++- worlds/lingo/utils/pickle_static_data.py | 2 + worlds/lingo/utils/validate_config.rb | 2 +- 7 files changed, 75 insertions(+), 41 deletions(-) diff --git a/worlds/lingo/data/LL1.yaml b/worlds/lingo/data/LL1.yaml index 6410ffea3b..4c41f3236f 100644 --- a/worlds/lingo/data/LL1.yaml +++ b/worlds/lingo/data/LL1.yaml @@ -4956,10 +4956,16 @@ Outside The Initiated: room: Art Gallery door: Exit - The Bearer (East): True - The Bearer (North): True - The Bearer (South): True - The Bearer (West): True + The Bearer (East): + static_painting: True + The Bearer (North): + static_painting: True + The Bearer (South): + static_painting: True + The Bearer (West): + - static_painting: True + - room: The Bearer (West) + door: Side Area Shortcut Roof: True panels: Achievement: @@ -5053,7 +5059,8 @@ - MIDDLE The Bearer (East): entrances: - Cross Tower (East): True + Cross Tower (East): + static_painting: True Bearer Side Area: door: Side Area Access Roof: True @@ -5084,7 +5091,8 @@ panel: SPACE The Bearer (North): entrances: - Cross Tower (East): True + Cross Tower (North): + static_painting: True Roof: True panels: SILENT (1): @@ -5128,7 +5136,8 @@ panel: POTS The Bearer (South): entrances: - Cross Tower (North): True + Cross Tower (South): + static_painting: True Bearer Side Area: door: Side Area Shortcut Roof: True @@ -5162,7 +5171,10 @@ panel: SILENT (1) The Bearer (West): entrances: - Cross Tower (West): True + Cross Tower (West): + static_painting: True + The Bearer: + door: Side Area Shortcut Bearer Side Area: door: Side Area Shortcut Roof: True @@ -5235,6 +5247,7 @@ The Bearer: room: The Bearer door: East Entrance + static_painting: True Roof: True panels: WINTER: @@ -5250,6 +5263,7 @@ The Bearer (East): room: The Bearer (East) door: North Entrance + static_painting: True Roof: True panels: NORTH: @@ -5270,6 +5284,7 @@ The Bearer (North): room: The Bearer (North) door: South Entrance + static_painting: True panels: FIRE: id: Cross Room/Panel_fire_fire @@ -5284,6 +5299,7 @@ Bearer Side Area: room: Bearer Side Area door: West Entrance + static_painting: True Roof: True panels: DIAMONDS: @@ -7108,6 +7124,8 @@ entrances: Orange Tower Third Floor: warp: True + Art Gallery (First Floor): + warp: True Art Gallery (Second Floor): warp: True Art Gallery (Third Floor): @@ -7125,22 +7143,6 @@ required_door: room: Number Hunt door: Eights - EON: - id: Painting Room/Panel_eon_one - colors: yellow - tag: midyellow - TRUSTWORTHY: - id: Painting Room/Panel_to_two - colors: red - tag: midred - FREE: - id: Painting Room/Panel_free_three - colors: purple - tag: midpurp - OUR: - id: Painting Room/Panel_our_four - colors: blue - tag: midblue ORDER: id: Painting Room/Panel_order_onepathmanyturns tag: forbid @@ -7159,15 +7161,8 @@ - scenery_painting_2c skip_location: True panels: - - EON - First Floor Puzzles: - skip_item: True - location_name: Art Gallery - First Floor Puzzles - panels: - - EON - - TRUSTWORTHY - - FREE - - OUR + - room: Art Gallery (First Floor) + panel: EON Third Floor: painting_id: - scenery_painting_3b @@ -7227,11 +7222,42 @@ - Third Floor - Fourth Floor - Fifth Floor + Art Gallery (First Floor): + entrances: + Art Gallery: + static_painting: True + panels: + EON: + id: Painting Room/Panel_eon_one + colors: yellow + tag: midyellow + TRUSTWORTHY: + id: Painting Room/Panel_to_two + colors: red + tag: midred + FREE: + id: Painting Room/Panel_free_three + colors: purple + tag: midpurp + OUR: + id: Painting Room/Panel_our_four + colors: blue + tag: midblue + doors: + Puzzles: + skip_item: True + location_name: Art Gallery - First Floor Puzzles + panels: + - EON + - TRUSTWORTHY + - FREE + - OUR Art Gallery (Second Floor): entrances: Art Gallery: room: Art Gallery door: Second Floor + static_painting: True panels: HOUSE: id: Painting Room/Panel_house_neighborhood @@ -7263,6 +7289,7 @@ Art Gallery: room: Art Gallery door: Third Floor + static_painting: True panels: AN: id: Painting Room/Panel_an_many @@ -7294,6 +7321,7 @@ Art Gallery: room: Art Gallery door: Fourth Floor + static_painting: True panels: URNS: id: Painting Room/Panel_urns_turns diff --git a/worlds/lingo/data/generated.dat b/worlds/lingo/data/generated.dat index 14f5570db1d17d881dcefbed05323ac89b10a701..f5eb3e069927f30aa069594bd3a98e6caa17e001 100644 GIT binary patch delta 31001 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 delta 30985 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 None: regions[pilgrimage_region_name] = Region(pilgrimage_region_name, world.player, world.multiworld) # Connect all created regions now that they exist. - allowed_entrance_types = EntranceType.NORMAL | EntranceType.WARP | EntranceType.CROSSROADS_ROOF_ACCESS + allowed_entrance_types = EntranceType.NORMAL | EntranceType.WARP | EntranceType.CROSSROADS_ROOF_ACCESS | \ + EntranceType.STATIC_PAINTING if not painting_shuffle: # Don't use the vanilla painting connections if we are shuffling paintings. @@ -156,11 +157,11 @@ def create_regions(world: "LingoWorld") -> None: regions[from_room].connect(regions[to_room], f"Pilgrimage Part {i+1}") else: connect_entrance(regions, regions["Starting Room"], regions["Pilgrim Antechamber"], "Sun Painting", - RoomAndDoor("Pilgrim Antechamber", "Sun Painting"), EntranceType.PAINTING, False, world) + RoomAndDoor("Pilgrim Antechamber", "Sun Painting"), EntranceType.STATIC_PAINTING, False, world) if early_color_hallways: connect_entrance(regions, regions["Starting Room"], regions["Color Hallways"], "Early Color Hallways", - None, EntranceType.PAINTING, False, world) + None, EntranceType.STATIC_PAINTING, False, world) if painting_shuffle: for warp_enter, warp_exit in world.player_logic.painting_mapping.items(): diff --git a/worlds/lingo/utils/pickle_static_data.py b/worlds/lingo/utils/pickle_static_data.py index 740e129bcb..7f39b79836 100644 --- a/worlds/lingo/utils/pickle_static_data.py +++ b/worlds/lingo/utils/pickle_static_data.py @@ -138,6 +138,8 @@ def process_single_entrance(source_room: str, room_name: str, door_obj) -> RoomE entrance_type = EntranceType.WARP elif source_room == "Crossroads" and room_name == "Roof": entrance_type = EntranceType.CROSSROADS_ROOF_ACCESS + elif "static_painting" in door_obj and door_obj["static_painting"]: + entrance_type = EntranceType.STATIC_PAINTING if "painting" in door_obj and door_obj["painting"]: PAINTING_EXIT_ROOMS.add(room_name) diff --git a/worlds/lingo/utils/validate_config.rb b/worlds/lingo/utils/validate_config.rb index 2a765fbcad..e270422684 100644 --- a/worlds/lingo/utils/validate_config.rb +++ b/worlds/lingo/utils/validate_config.rb @@ -2,7 +2,7 @@ # the file are consistent. It also checks that the panel and door IDs mentioned # all exist in the map file. # -# Usage: validate_config.rb [config file] [map file] +# Usage: validate_config.rb [config file] [ids path] [map file] require 'set' require 'yaml' From eba757d2cd468182f4d0500ab87c45d379b225d2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 24 May 2025 23:02:27 +0200 Subject: [PATCH 191/199] Raft: Implement get_filler_item_name and refactor filler item code a bit (#4782) * refactor filler item creation for Raft, implement get_filler_item_name * wrong indent * Update worlds/raft/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/raft/__init__.py | 110 +++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 46 deletions(-) diff --git a/worlds/raft/__init__.py b/worlds/raft/__init__.py index 3e33b417c0..74ab9291b2 100644 --- a/worlds/raft/__init__.py +++ b/worlds/raft/__init__.py @@ -40,6 +40,8 @@ class RaftWorld(World): options_dataclass = RaftOptions options: RaftOptions + extraItemNamePool: list[str] | None = None + required_client_version = (0, 3, 4) def create_items(self): @@ -52,52 +54,52 @@ class RaftWorld(World): pool = [] frequencyItems = [] for item in item_table: - raft_item = self.create_item_replaceAsNecessary(item["name"]) + raft_item = self.create_item(self.replace_item_name_as_necessary(item["name"])) if isFillingFrequencies and "Frequency" in item["name"]: frequencyItems.append(raft_item) else: pool.append(raft_item) - extraItemNamePool = [] + self.extraItemNamePool = [] extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot - if extras > 0: - if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs - for packItem in resourcePackItems: - for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1): - extraItemNamePool.append(createResourcePackName(i, packItem)) - if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items - dupeItemPool = item_table.copy() - # Remove frequencies if necessary - if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations - # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item - # will be included 7 times. This is a massive flood of progressive-frequency items, so we - # instead add progressive-frequency as its own item a smaller amount of times to prevent - # flooding the duplicate item pool with them. - if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: - for _ in range(2): - # Progressives are not in item_pool, need to create faux item for duplicate item pool - # This can still be filtered out later by duplicate_items setting - dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included - # Always remove non-progressive Frequency items - dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) - - # Remove progression or non-progression items if necessary - if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only - dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) - elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only - dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False) - - dupeItemPool = list(dupeItemPool) - # Finally, add items as necessary - if len(dupeItemPool) > 0: - for item in dupeItemPool: - extraItemNamePool.append(item["name"]) + if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs + for packItem in resourcePackItems: + for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1): + self.extraItemNamePool.append(createResourcePackName(i, packItem)) + + if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items + dupeItemPool = item_table.copy() + # Remove frequencies if necessary + if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations + # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item + # will be included 7 times. This is a massive flood of progressive-frequency items, so we + # instead add progressive-frequency as its own item a smaller amount of times to prevent + # flooding the duplicate item pool with them. + if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: + for _ in range(2): + # Progressives are not in item_pool, need to create faux item for duplicate item pool + # This can still be filtered out later by duplicate_items setting + dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included + # Always remove non-progressive Frequency items + dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) + + # Remove progression or non-progression items if necessary + if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only + dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) + elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only + dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False) + + dupeItemPool = list(dupeItemPool) + # Finally, add items as necessary + for item in dupeItemPool: + self.extraItemNamePool.append(self.replace_item_name_as_necessary(item)) - if (len(extraItemNamePool) > 0): - for randomItem in self.random.choices(extraItemNamePool, k=extras): - raft_item = self.create_item_replaceAsNecessary(randomItem) - pool.append(raft_item) + assert self.extraItemNamePool, f"Don't know what extra items to create for {self.player_name}." + + for randomItem in self.random.choices(self.extraItemNamePool, k=extras): + raft_item = self.create_item(randomItem) + pool.append(raft_item) self.multiworld.itempool += pool @@ -108,19 +110,35 @@ class RaftWorld(World): if frequencyItems: self.place_frequencyItems(frequencyItems) + def get_filler_item_name(self) -> str: + # A normal Raft world will have an extraItemNamePool defined after create_items. + if self.extraItemNamePool: + return self.random.choice(self.extraItemNamePool) + + # If this is a "fake" world, e.g. item links with link replacement: Resource packs are always be safe to create + minRPSpecified = self.options.minimum_resource_pack_amount.value + maxRPSpecified = self.options.maximum_resource_pack_amount.value + minimumResourcePackAmount = min(minRPSpecified, maxRPSpecified) + maximumResourcePackAmount = max(minRPSpecified, maxRPSpecified) + resource_amount = self.random.randint(minimumResourcePackAmount, maximumResourcePackAmount) + resource_type = self.random.choice(resourcePackItems) + return createResourcePackName(resource_amount, resource_type) + def set_rules(self): set_rules(self.multiworld, self.player) def create_regions(self): create_regions(self.multiworld, self.player) - - def create_item_replaceAsNecessary(self, name: str) -> Item: - isFrequency = "Frequency" in name - shouldUseProgressive = bool((isFrequency and self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive) - or (not isFrequency and self.options.progressive_items)) - if shouldUseProgressive and name in progressive_table: - name = progressive_table[name] - return self.create_item(name) + + def replace_item_name_as_necessary(self, name: str) -> str: + if name not in progressive_table: + return name + if "Frequency" in name: + if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: + return progressive_table[name] + elif self.options.progressive_items: + return progressive_table[name] + return name def create_item(self, name: str) -> Item: item = lookup_name_to_item[name] From e7545cbc28d41e781a996a9fbe28dcf4c683174c Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Sat, 24 May 2025 17:59:55 -0400 Subject: [PATCH 192/199] SDV: Fixed Region for two Parrot Locations (#5042) --- worlds/stardew_valley/data/locations.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/stardew_valley/data/locations.csv b/worlds/stardew_valley/data/locations.csv index 66a9157b34..2829a12522 100644 --- a/worlds/stardew_valley/data/locations.csv +++ b/worlds/stardew_valley/data/locations.csv @@ -1129,8 +1129,8 @@ id,region,name,tags,mod_name 2204,Leo's Hut,Leo's Parrot,"GINGER_ISLAND,WALNUT_PURCHASE", 2205,Island South,Island West Turtle,"GINGER_ISLAND,WALNUT_PURCHASE", 2206,Island West,Island Farmhouse,"GINGER_ISLAND,WALNUT_PURCHASE", -2207,Island Farmhouse,Island Mailbox,"GINGER_ISLAND,WALNUT_PURCHASE", -2208,Island Farmhouse,Farm Obelisk,"GINGER_ISLAND,WALNUT_PURCHASE", +2207,Island West,Island Mailbox,"GINGER_ISLAND,WALNUT_PURCHASE", +2208,Island West,Farm Obelisk,"GINGER_ISLAND,WALNUT_PURCHASE", 2209,Island North,Dig Site Bridge,"GINGER_ISLAND,WALNUT_PURCHASE", 2210,Island North,Island Trader,"GINGER_ISLAND,WALNUT_PURCHASE", 2211,Volcano Entrance,Volcano Bridge,"GINGER_ISLAND,WALNUT_PURCHASE", From f327ab30a653acdd56376f53ee54577c9e0e06ed Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Sun, 25 May 2025 03:20:25 -0600 Subject: [PATCH 193/199] CV64: Allow Holding Z to Use the Regular Shimmy Speed (#4730) * Add the shimmy modifier hack. * Update the Increase Shimmy Speed option description. --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/cv64/data/patches.py | 15 +++++++++++++++ worlds/cv64/options.py | 1 + worlds/cv64/rom.py | 5 +++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/worlds/cv64/data/patches.py b/worlds/cv64/data/patches.py index 6ef4eafb67..4a964612f0 100644 --- a/worlds/cv64/data/patches.py +++ b/worlds/cv64/data/patches.py @@ -2893,3 +2893,18 @@ dog_bite_ice_trap_fix = [ 0x25291CB8, # ADDIU T1, T1, 0x1CB8 0x01200008 # JR T1 ] + +shimmy_speed_modifier = [ + # Increases the player's speed while shimmying as long as they are not holding down Z. If they are holding Z, it + # will be the normal speed, allowing it to still be used to set up any tricks that might require the normal speed + # (like Left Tower Skip). + 0x3C088038, # LUI T0, 0x8038 + 0x91087D7E, # LBU T0, 0x7D7E (T0) + 0x31090020, # ANDI T1, T0, 0x0020 + 0x3C0A800A, # LUI T2, 0x800A + 0x240B005A, # ADDIU T3, R0, 0x005A + 0x55200001, # BNEZL T1, [forward 0x01] + 0x240B0032, # ADDIU T3, R0, 0x0032 + 0xA14B3641, # SB T3, 0x3641 (T2) + 0x0800B7C3 # J 0x8002DF0C +] diff --git a/worlds/cv64/options.py b/worlds/cv64/options.py index 07e86347bd..da1e1aba94 100644 --- a/worlds/cv64/options.py +++ b/worlds/cv64/options.py @@ -424,6 +424,7 @@ class PantherDash(Choice): class IncreaseShimmySpeed(Toggle): """ Increases the speed at which characters shimmy left and right while hanging on ledges. + Hold Z to use the regular speed in case it's needed to do something. """ display_name = "Increase Shimmy Speed" diff --git a/worlds/cv64/rom.py b/worlds/cv64/rom.py index 1833c7812b..830bed2779 100644 --- a/worlds/cv64/rom.py +++ b/worlds/cv64/rom.py @@ -607,9 +607,10 @@ class CV64PatchExtensions(APPatchExtension): rom_data.write_int32(0xAA530, 0x080FF880) # J 0x803FE200 rom_data.write_int32s(0xBFE200, patches.coffin_cutscene_skipper) - # Increase shimmy speed + # Shimmy speed increase hack if options["increase_shimmy_speed"]: - rom_data.write_byte(0xA4241, 0x5A) + rom_data.write_int32(0x97EB4, 0x803FE9F0) + rom_data.write_int32s(0xBFE9F0, patches.shimmy_speed_modifier) # Disable landing fall damage if options["fall_guard"]: From 32487137e81d23139820aa2a6d3fd86d6ac104f5 Mon Sep 17 00:00:00 2001 From: FlitPix <8645405+FlitPix@users.noreply.github.com> Date: Sun, 25 May 2025 17:17:30 -0400 Subject: [PATCH 194/199] Core: Add descriptions to Components (#4849) * Add descriptions to components * Adhere to style guide * Tweak BHC wording * Trim Open Patch description * Update text client description for consistency Co-authored-by: Scipio Wright * Remove newlines --------- Co-authored-by: Scipio Wright --- Launcher.py | 21 ++++++++++++++------- worlds/LauncherComponents.py | 12 ++++++++---- worlds/_bizhawk/client.py | 3 ++- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Launcher.py b/Launcher.py index e9751f2c23..88e2070e9c 100644 --- a/Launcher.py +++ b/Launcher.py @@ -104,14 +104,21 @@ def update_settings(): components.extend([ # Functions - Component("Open host.yaml", func=open_host_yaml), - Component("Open Patch", func=open_patch), - Component("Generate Template Options", func=generate_yamls), - Component("Archipelago Website", func=lambda: webbrowser.open("https://archipelago.gg/")), - Component("Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/8Z65BR2")), + Component("Open host.yaml", func=open_host_yaml, + description="Open the host.yaml file to change settings for generation, games, and more."), + Component("Open Patch", func=open_patch, + description="Open a patch file, downloaded from the room page or provided by the host."), + Component("Generate Template Options", func=generate_yamls, + description="Generate template YAMLs for currently installed games."), + Component("Archipelago Website", func=lambda: webbrowser.open("https://archipelago.gg/"), + description="Open archipelago.gg in your browser."), + Component("Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/8Z65BR2"), + description="Join the Discord server to play public multiworlds, report issues, or just chat!"), Component("Unrated/18+ Discord Server", icon="discord", - func=lambda: webbrowser.open("https://discord.gg/fqvNCCRsu4")), - Component("Browse Files", func=browse_files), + func=lambda: webbrowser.open("https://discord.gg/fqvNCCRsu4"), + description="Find unrated and 18+ games in the After Dark Discord server."), + Component("Browse Files", func=browse_files, + description="Open the Archipelago installation folder in your file browser."), ]) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 2bd9636931..e650889a73 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -210,10 +210,14 @@ components: List[Component] = [ Component('Launcher', 'Launcher', component_type=Type.HIDDEN), # Core Component('Host', 'MultiServer', 'ArchipelagoServer', cli=True, - file_identifier=SuffixIdentifier('.archipelago', '.zip')), - Component('Generate', 'Generate', cli=True), - Component("Install APWorld", func=install_apworld, file_identifier=SuffixIdentifier(".apworld")), - Component('Text Client', 'CommonClient', 'ArchipelagoTextClient', func=launch_textclient), + file_identifier=SuffixIdentifier('.archipelago', '.zip'), + description="Host a generated multiworld on your computer."), + Component('Generate', 'Generate', cli=True, + description="Generate a multiworld with the YAMLs in the players folder."), + Component("Install APWorld", func=install_apworld, file_identifier=SuffixIdentifier(".apworld"), + description="Install an APWorld to play games not included with Archipelago by default."), + Component('Text Client', 'CommonClient', 'ArchipelagoTextClient', func=launch_textclient, + description="Connect to a multiworld using the text client."), Component('Links Awakening DX Client', 'LinksAwakeningClient', file_identifier=SuffixIdentifier('.apladx')), Component('LttP Adjuster', 'LttPAdjuster'), diff --git a/worlds/_bizhawk/client.py b/worlds/_bizhawk/client.py index 16a8325a10..fe8e97e65c 100644 --- a/worlds/_bizhawk/client.py +++ b/worlds/_bizhawk/client.py @@ -19,7 +19,8 @@ def launch_client(*args) -> None: component = Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, func=launch_client, - file_identifier=SuffixIdentifier()) + file_identifier=SuffixIdentifier(), + description="Open the BizHawk client, to play games using the Bizhawk emulator.") components.append(component) From 002202ff5fa9ced9fd100fc394f22323cc5efe73 Mon Sep 17 00:00:00 2001 From: ScootyPuffJr1 <77215594+ScootyPuffJr1@users.noreply.github.com> Date: Mon, 26 May 2025 03:25:39 -0400 Subject: [PATCH 195/199] Update OOT Guides (#5041) * Update OOT Guides * Minor update per review --- worlds/oot/docs/setup_de.md | 4 ++-- worlds/oot/docs/setup_en.md | 4 ++-- worlds/oot/docs/setup_fr.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/oot/docs/setup_de.md b/worlds/oot/docs/setup_de.md index 92c3150a7d..c35dd2769f 100644 --- a/worlds/oot/docs/setup_de.md +++ b/worlds/oot/docs/setup_de.md @@ -7,13 +7,13 @@ Da wir BizHawk benutzen, gilt diese Anleitung nur für Windows und Linux. ## Benötigte Software - BizHawk: [BizHawk Veröffentlichungen von TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Version 2.3.1 und später werden unterstützt. Version 2.9 ist empfohlen. + - Version 2.3.1 und später werden unterstützt. Version 2.10 ist empfohlen. - Detailierte Installtionsanweisungen für BizHawk können über den obrigen Link gefunden werden. - Windows-Benutzer müssen die Prerequisiten installiert haben. Diese können ebenfalls über den obrigen Link gefunden werden. - Der integrierte Archipelago-Client, welcher [hier](https://github.com/ArchipelagoMW/Archipelago/releases) installiert werden kann. -- Eine `Ocarina of Time v1.0 US(?) ROM`. (Nicht aus Europa und keine Master-Quest oder Debug-Rom!) +- Eine `Ocarina of Time v1.0 US ROM`. (Nicht aus Europa und keine Master-Quest oder Debug-Rom!) ## Konfigurieren von BizHawk diff --git a/worlds/oot/docs/setup_en.md b/worlds/oot/docs/setup_en.md index 553f1820c3..31b7137bd8 100644 --- a/worlds/oot/docs/setup_en.md +++ b/worlds/oot/docs/setup_en.md @@ -7,11 +7,11 @@ As we are using BizHawk, this guide is only applicable to Windows and Linux syst ## Required Software - BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Version 2.3.1 and later are supported. Version 2.7 is recommended for stability. + - Version 2.3.1 and later are supported. Version 2.10 is recommended for stability. - Detailed installation instructions for BizHawk can be found at the above link. - Windows users must run the prereq installer first, which can also be found at the above link. - The built-in Archipelago client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases). -- An Ocarina of Time v1.0 ROM. +- A US Ocarina of Time v1.0 ROM. ## Configuring BizHawk diff --git a/worlds/oot/docs/setup_fr.md b/worlds/oot/docs/setup_fr.md index 40b0e8f571..eb2e97384a 100644 --- a/worlds/oot/docs/setup_fr.md +++ b/worlds/oot/docs/setup_fr.md @@ -7,12 +7,12 @@ Comme nous utilisons BizHawk, ce guide s'applique uniquement aux systèmes Windo ## Logiciel requis - BizHawk : [Sorties BizHawk de TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Les versions 2.3.1 et ultérieures sont prises en charge. La version 2.7 est recommandée pour des raisons de stabilité. + - Les versions 2.3.1 et ultérieures sont prises en charge. La version 2.10 est recommandée pour des raisons de stabilité. - Des instructions d'installation détaillées pour BizHawk peuvent être trouvées sur le lien ci-dessus. - Les utilisateurs Windows doivent d'abord exécuter le programme d'installation des prérequis, qui peut également être trouvé sur le lien ci-dessus. - Le client Archipelago intégré, qui peut être installé [ici](https://github.com/ArchipelagoMW/Archipelago/releases) (sélectionnez « Ocarina of Time Client » lors de l'installation). -- Une ROM Ocarina of Time v1.0. +- Un fichier ROM v1.0 US d'Ocarina of Time. ## Configuration de BizHawk From 20ca7e71c765899007756490669b041878cc4e55 Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Tue, 27 May 2025 01:57:20 -0400 Subject: [PATCH 196/199] TWW: Update patch class (#5046) --- worlds/tww/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/tww/__init__.py b/worlds/tww/__init__.py index 6b6c3ca33a..918d68478f 100644 --- a/worlds/tww/__init__.py +++ b/worlds/tww/__init__.py @@ -11,7 +11,7 @@ from BaseClasses import ItemClassification as IC from BaseClasses import MultiWorld, Region, Tutorial from Options import Toggle from worlds.AutoWorld import WebWorld, World -from worlds.Files import APContainer, AutoPatchRegister +from worlds.Files import APPlayerContainer, AutoPatchRegister from worlds.generic.Rules import add_item_rule from worlds.LauncherComponents import Component, SuffixIdentifier, Type, components, icon_paths, launch_subprocess @@ -51,7 +51,7 @@ components.append( icon_paths["The Wind Waker"] = "ap:worlds.tww/assets/icon.png" -class TWWContainer(APContainer, metaclass=AutoPatchRegister): +class TWWContainer(APPlayerContainer, metaclass=AutoPatchRegister): """ This class defines the container file for The Wind Waker. """ From 19a21099ed11fa0fb92fa46606e62a8ac8dbdd43 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 27 May 2025 16:21:43 +0000 Subject: [PATCH 197/199] Webhost: update Flask to 3.1.1 (#5052) --- WebHostLib/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt index a9cd33dd6d..4e6bf25df0 100644 --- a/WebHostLib/requirements.txt +++ b/WebHostLib/requirements.txt @@ -1,4 +1,4 @@ -flask>=3.1.0 +flask>=3.1.1 werkzeug>=3.1.3 pony>=0.7.19 waitress>=3.0.2 From fcb3efee01b2bdad2d29e099e8de9e19c85e95ad Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Wed, 28 May 2025 08:47:24 -0600 Subject: [PATCH 198/199] CVCotM: Add Nerf Roc Wing to Slot Data and HoD Max Ups to `other_game_item_appearances` (#5051) --- worlds/cvcotm/__init__.py | 3 ++- worlds/cvcotm/aesthetics.py | 8 +++++++- worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md | 2 +- worlds/cvcotm/docs/setup_en.md | 4 ++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/worlds/cvcotm/__init__.py b/worlds/cvcotm/__init__.py index 0f5077e709..a2d52b3ecc 100644 --- a/worlds/cvcotm/__init__.py +++ b/worlds/cvcotm/__init__.py @@ -211,7 +211,8 @@ class CVCotMWorld(World): "ignore_cleansing": self.options.ignore_cleansing.value, "skip_tutorials": self.options.skip_tutorials.value, "required_last_keys": self.required_last_keys, - "completion_goal": self.options.completion_goal.value} + "completion_goal": self.options.completion_goal.value, + "nerf_roc_wing": self.options.nerf_roc_wing.value} def get_filler_item_name(self) -> str: return self.random.choice(FILLER_ITEM_NAMES) diff --git a/worlds/cvcotm/aesthetics.py b/worlds/cvcotm/aesthetics.py index d1668b1db1..d52165d076 100644 --- a/worlds/cvcotm/aesthetics.py +++ b/worlds/cvcotm/aesthetics.py @@ -48,11 +48,17 @@ class OtherGameAppearancesInfo(TypedDict): other_game_item_appearances: Dict[str, Dict[str, OtherGameAppearancesInfo]] = { - # NOTE: Symphony of the Night is currently an unsupported world not in main. + # NOTE: Symphony of the Night and Harmony of Dissonance are custom worlds that are not core verified. "Symphony of the Night": {"Life Vessel": {"type": 0xE4, "appearance": 0x01}, "Heart Vessel": {"type": 0xE4, "appearance": 0x00}}, + + "Castlevania - Harmony of Dissonance": {"Life Max Up": {"type": 0xE4, + "appearance": 0x01}, + "Heart Max Up": {"type": 0xE4, + "appearance": 0x00}}, + "Timespinner": {"Max HP": {"type": 0xE4, "appearance": 0x01}, "Max Aura": {"type": 0xE4, diff --git a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md index 695c5f0ff9..611a1a376e 100644 --- a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md +++ b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md @@ -3,7 +3,7 @@ ## Quick Links - [Setup](/tutorial/Castlevania%20-%20Circle%20of%20the%20Moon/setup/en) - [Options Page](/games/Castlevania%20-%20Circle%20of%20the%20Moon/player-options) -- [PopTracker Pack](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest) +- [PopTracker Pack](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest) - [Repo for the original, standalone CotMR](https://github.com/calm-palm/cotm-randomizer) - [Web version of the above randomizer](https://rando.circleofthemoon.com/) - [A more in-depth guide to CotMR's nuances](https://docs.google.com/document/d/1uot4BD9XW7A--A8ecgoY8mLK_vSoQRpY5XCkzgas87c/view?usp=sharing) diff --git a/worlds/cvcotm/docs/setup_en.md b/worlds/cvcotm/docs/setup_en.md index 459e0d6afb..4c34dcb836 100644 --- a/worlds/cvcotm/docs/setup_en.md +++ b/worlds/cvcotm/docs/setup_en.md @@ -22,7 +22,7 @@ clear it. ## Optional Software -- [Castlevania: Circle of the Moon AP Tracker](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest), for use with +- [Castlevania: Circle of the Moon AP Tracker](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases). ## Generating and Patching a Game @@ -64,7 +64,7 @@ perfectly safe to make progress offline; everything will re-sync when you reconn Castlevania: Circle of the Moon has a fully functional map tracker that supports auto-tracking. -1. Download [Castlevania: Circle of the Moon AP Tracker](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest) and +1. Download [Castlevania: Circle of the Moon AP Tracker](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). 2. Put the tracker pack into `packs/` in your PopTracker install. 3. Open PopTracker, and load the Castlevania: Circle of the Moon pack. From fde203379d9a844da8cea2bd620a0b48d9765429 Mon Sep 17 00:00:00 2001 From: Ehseezed <97066152+Ehseezed@users.noreply.github.com> Date: Wed, 28 May 2025 14:04:57 -0500 Subject: [PATCH 199/199] Timespinner: Fix Logic (#4803) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/timespinner/Locations.py | 4 ++-- worlds/timespinner/Regions.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/timespinner/Locations.py b/worlds/timespinner/Locations.py index 644304733a..82f284c656 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -92,7 +92,7 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state))), LocationData('The lab', 'Lab: Coffee break', 1337066), LocationData('The lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), - LocationData('The lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash ), + LocationData('The lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state) ), LocationData('The lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), LocationData('The lab (power off)', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), LocationData('The lab (power off)', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or (state.has_all(('Lab Access Research', 'Lab Access Dynamo'), player)) ), @@ -100,7 +100,7 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio LocationData('The lab (power off)', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), - LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A and not options.lock_key_amadeus or state.has('Lab Access Research', player)), + LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A(state) and not options.lock_key_amadeus or state.has('Lab Access Research', player)), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index 51b1688f1a..b00396f222 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -141,7 +141,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Lower Lake Serene', 'Left Side forest Caves') connect(world, player, 'Lower Lake Serene', 'Caves of Banishment (upper)', lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)) connect(world, player, 'Caves of Banishment (upper)', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) - connect(world, player, 'Caves of Banishment (upper)', 'Caves of Banishment (Maw)', lambda state: logic.has_doublejump(state) or state.has_any({'Gas Mask', 'Talaria Attachment'} or logic.has_teleport(state), player)) + connect(world, player, 'Caves of Banishment (upper)', 'Caves of Banishment (Maw)', lambda state: logic.has_doublejump(state) or state.has_any({'Gas Mask', 'Talaria Attachment'}, player) or logic.has_teleport(state)) connect(world, player, 'Caves of Banishment (upper)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (upper)', lambda state: logic.has_doublejump(state) if not flooded.flood_maw else state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (Sirens)', lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) )

    X?{kJ@$Fj8%cu@+Ts? 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